转载:【Airpython】
https://mp.weixin.qq.com/s?__biz=MzU1OTI0NjI1NQ==&mid=2247484313&idx=1&sn=2006aeb9ce1e687625aaf3626d4ee630&chksm=fc1b7d59cb6cf44fe3463e56ee696c5ecc98929b08413a08eceb2fe5985139cd204e67a68fbe&mpshare=1&
准 备 工 作
在编写代码之前,需要做如下准备工作: 1、配置好 Android ADB 开发环境 2、Python 虚拟环境内安装 pocoui 依赖库 3、安装数据可视化依赖库 pyecharts
# pocoui
pip3 install pocoui
# 数据可视化图表
pip3 install pyecharts -U
编 写 代 码
我们分 7 个步骤来实现这个功能,分别是:打开目标应用客户端、检索关键字到商品列表界面、计算最佳滑动距离、筛选商品、获取商品链接地址、写入文件排序并统计商品、配置参数。
第 1 步,使用 pocoui 自动化打开目标应用。
'''
更多Python学习资料以及源码教程资料,可以在群1136201545免费获取
'''
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学习资料以及源码教程资料,可以在群1136201545免费获取
'''
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:
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 文件,指定要爬取商品的关键字、爬取时间、想要数考核指标数、筛选商品数目。
'''
更多Python学习资料以及源码教程资料,可以在群1136201545免费获取
'''
goods:
# 搜索商品1,包含搜索关键字、爬取时间
good1:
key_word: '资料' # 搜索关键字
key_num: 100 # 筛选【想要数】的临界点
num: 10 # 只筛选爆款
time: 600 # 爬取时间(秒)
结 果 结 论
提前配置好商品关键字、爬取时间等参数,即可以爬取到符合要求的、最好卖的商品数据,最终以图表的方式展示出来。 …