欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Python 分析后告诉你闲鱼上哪些商品抢手?

程序员文章站 2022-06-15 13:27:02
前言 文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理。 作者:【Airpython】 PS:如有需要Python学习资料的小伙伴可以加点击下方链接自行获取http://t.cn/A6Zvjdun 准 备 工 作 在编写代码之前,需要 ......
Python 分析后告诉你闲鱼上哪些商品抢手?

 

前言

文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理。

作者:【airpython】

ps:如有需要python学习资料的小伙伴可以加点击下方链接自行获取http://t.cn/a6zvjdun

准 备 工 作

在编写代码之前,需要做如下准备工作:

1、配置好 android adb 开发环境

2、python 虚拟环境内安装 pocoui 依赖库

3、安装数据可视化依赖库 pyecharts

# pocoui
pip3 install pocoui
​
# 数据可视化图表
pip3 install pyecharts -u
Python 分析后告诉你闲鱼上哪些商品抢手?

 

编 写 代 码

我们分 7 个步骤来实现这个功能,分别是:打开目标应用客户端、检索关键字到商品列表界面、计算最佳滑动距离、筛选商品、获取商品链接地址、写入文件排序并统计商品、配置参数。

第 1 步,使用 pocoui 自动化打开目标应用。

def __pre(self):
 """
 准备工作
 :return:
 """
 home()
 stop_app(package_name)
 start_my_app(package_name, activity)
​
​
 # 等待到达桌面
 self.poco(text='闲鱼').wait_for_appearance()
 self.poco(text='鱼塘').wait_for_appearance()
 self.poco(text='消息').wait_for_appearance()
 self.poco(text='我的').wait_for_appearance()
​
 print('进入闲鱼主界面')

进入到闲鱼首页之后,应用端会拿到剪切板的数据,当存在特定规律的口令的时,会立马弹出一个对话框,因此需要模拟关闭对话框的操作。

# 如果指定时间内内有淘口令,就关闭
for i in range(10, -1, -1):
 close_element = self.poco('com.taobao.idlefish:id/ivclose')
 if close_element.exists():
 close_element.click()
 break
 time.sleep(1)

打开应用之后,就可以进行第 2 步操作了。

通过要检索的关键字,模拟输入到输入框内,然后点击搜索按钮,一直等待搜过列表出现为止。

Python 分析后告诉你闲鱼上哪些商品抢手?

 

另外,为了更加方便地处理数据,商品列表切换到列表模式,即一行只显示一个商品。

def __input_key_word(self):
 """
 输入关键字
 :return:
 """
 # 进入搜索界面
 perform_click(self.poco('com.taobao.idlefish:id/bar_tx'))
​
 # 搜索框内输入文本
 self.poco('com.taobao.idlefish:id/search_term').set_text(self.good_msg)
​
 # 点击搜索按钮
 while true:
 # 等待检索结果列表出现
 if not self.poco('com.taobao.idlefish:id/list_recyclerview').exists():
 perform_click(self.poco('com.taobao.idlefish:id/search_button', text='搜索'))
 else:
 break
​
 # 等待商品列表完全出现
 self.poco('com.taobao.idlefish:id/list_recyclerview').wait_for_appearance()
​
 # 切换到列表
 perform_click(self.poco('com.taobao.idlefish:id/switch_search'))

第 3 步,计算最佳滑动距离。

为了保证爬取数据的高效性,获取计算出每次滑动的最佳距离。

首先先拿到当前界面的 ui 控件树,然后通过控件的属性 id 拿到商品的坐标,进而得到每一项商品的高度。

最后,通过观察屏幕中出现商品的数目得到最佳滑动距离。

def __get_good_swipe_distance(self):
 """
 获取每次滑动,最合适的距离
 :return:
 """
 element = element()
 # 保存当前的ui树到本地
 element.get_current_ui_tree()
​
 # 第一个商品item的坐标
 position_item = element.find_elment_position_by_id_and_index("com.taobao.idlefish:id/card_root",
 "1")
 # 商品的高度
 item_height = position_item[1][1] - position_item[0][1]
​
 # 通过观察,当前屏幕有3件商品
 return item_height * 3

第 4 步,筛选商品。

上面的步骤拿到最佳的滑动距离,不停的滑动页面遍历列表元素的子 item。

需要注意的是,为了避免滑动惯性导致的误差,每一次的滑动时长最好设置为 2s 以上。

通过商品 item 筛选出想要数目大于预设数字的商品。

# 多少人想要
want_element_parent = item.offspring('com.taobao.idlefish:id/search_item_flowlayout')
​
if want_element_parent.exists():
 # 想要数/已付款数目
 want_element = want_element_parent.children()[0]
​
 want_content = want_element.get_text()
​
 # 过滤掉【已付款】等其他商品,只保留个人发布商品
 if '人想要' not in want_content:
 continue
​
 # 拿到商品想要的具体数目,代表商品热度
 want_num = get_num(want_content)
​
 if int(want_num) < self.num_assign:
 # print('不达标,过滤掉')
 pass
 else:
 # 商品想要数达标,加入统计

第 5 步,获取商品链接地址。

对于上一步满足条件的商品,点击商品 item 进入到商品详情页面。

接着点击右上角的分享按钮,会立即弹出分享对话框。

Python 分析后告诉你闲鱼上哪些商品抢手?

 

然后点击口令控件,会提示口令复制到系统剪切板成功。

# 点击更多
while true:
 if self.poco('com.taobao.idlefish:id/ftsharename').exists():
 break
 print('点击更多~')
 perform_click(self.poco(text='更多'))
​
# 点击复制淘口令
perform_click(self.poco('com.taobao.idlefish:id/ftsharename', text='淘口令'))
​
# 拿到口令码
taobao_code_element = self.poco('com.taobao.idlefish:id/tvwarndetail')
​
taobao_code = taobao_code_element.get_text() 
​

第 6 步,写入商品、排序并统计数据。

Python 分析后告诉你闲鱼上哪些商品抢手?

 

将上面获取到的商品标题、想要数、分享地址写入到 csv 文件中。

然后读取数据文件,通过对表格中的第二列进行反向排序,使商品按照想要数进行降序排列。

def __sort_result(self):
 """
 对爬取的结果进行排序
 :return:
 """
 reader = csv.reader(open(self.file_path), delimiter=",")
 # 头部标题
 head_title = next(reader)
 # 按照第二列进行逆序排列
 sortedlist = sorted(reader, key=lambda x: (int(x[1])), reverse=true)
 # 写入头部数据
 write_to_csv(self.file_path, [(head_title[0], head_title[1], head_title[2])], false)
 for value in sortedlist:
 write_to_csv(self.file_path, [(value[0], value[1], value[2])], false)
 return sortedlist

最后拿到前 10 项数据,利用 pyecharts 生成统计图表。

def draw_image(self, sortedlist):
 """
 画图
 :param sortedlist:
 :return:
 """
​
 # 标题列表
 titles = []
​
 # 销量
 sales_num = []
​
 # 拿到爬取结果的标题、销量两个列表
 with open(self.file_path, 'r') as csvfile:
 # 读取文件
 reader = csv.dictreader(csvfile)
​
 # 加入列表中
 for row in reader:
 titles.append(row['title'])
 sales_num.append(row['num'])
​
 # 数目限制
 if len(titles) > self.num:
 titles = titles[:self.num]
 sales_num = sales_num[:self.num]
​
 # 画图
 bar = (
 bar()
 .add_xaxis(titles)
 .add_yaxis("哪些好卖", sales_num)
 .set_global_opts(title_opts=opts.titleopts(title="我要卖货"))
 )
 bar.render('%s.html' % self.good_msg)

第 7 步,配置参数。

编写 yaml 文件,指定要爬取商品的关键字、爬取时间、想要数考核指标数、筛选商品数目。

goods:
 # 搜索商品1,包含搜索关键字、爬取时间
 good1:
 key_word: '资料' # 搜索关键字
 key_num: 100 # 筛选【想要数】的临界点
 num: 10 # 只筛选爆款
 time: 600 # 爬取时间(秒)

结 果 结 论

提前配置好商品关键字、爬取时间等参数,即可以爬取到符合要求的、最好卖的商品数据,最终以图表的方式展示出来。

Python 分析后告诉你闲鱼上哪些商品抢手?

 

..

如果想了解更多关于python的应用,可以私信小编