1目 标 场 景

经常看到有朋友在闲鱼卖些小东西又或是自己擅长的一些技能,都能为他们带来不错的 睡后收入。

闲鱼上大量的商品,很难精准判断哪些受欢迎,哪些好卖;一个个录入数据去做数据分析,浪费时间的同时,效率也极其的低效。

本篇文章的目的是利用 Python 自动化 来获取某类商品中最好卖的商品以供参考。

ps:本文仅限用于技术交流,请勿用于其他用途。

2准 备 工 作

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

1、配置好 Android ADB 开发环境

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

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

# pocoui
pip3 install pocoui # 数据可视化图表
pip3 install pyecharts -U

3编 写 代 码

我们分 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 步操作了。

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

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

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 进入到商品详情页面。

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

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

# 点击更多
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 步,写入商品、排序并统计数据。

将上面获取到的商品标题、想要数、分享地址写入到 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 # 爬取时间(秒)

4结 果 结 论

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

原文地址:https://blog.51cto.com/15023272/2558869

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

想要获取更多Python学习资料可以加QQ:2955637827私聊或加Q群630390733大家一起来学习讨论吧!

闲鱼上哪些商品抢手?Python 分析后告诉你的更多相关文章

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

    前言 文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者:[Airpython] PS:如有需要Python学习资料的小伙伴可以 ...

  2. 走近科学,探究阿里闲鱼团队通过数据提升Flutter体验的真相

    背景 闲鱼客户端的flutter页面已经服务上亿级用户,这个时候Flutter页面的用户体验尤其重要,完善Flutter性能稳定性监控体系,可以及早发现线上性能问题,也可以作为用户体验提升的衡量标准. ...

  3. GMTC2019|闲鱼-基于Flutter的架构演进与创新

    2012年应届毕业加入阿里巴巴,主导了闲鱼基于Flutter的新混合架构,同时推进了Flutter在闲鱼各业务线的落地.未来将持续关注终端技术的演变及趋势 Flutter的优势与挑战 Flutter是 ...

  4. 闲鱼hu超赞,有赞必回,24小时在线!咸鱼互赞超赞留言评

    有没有在闲鱼上卖东西没有浏览量的人! 我们来一起互赞互相提高彼此宝贝的浏览量,从而更快的促进交易! 我打算建个群,我们可以一起交流下哈! 需要的进入QQ群   : 530980712

  5. 开源项目在闲鱼、b 站上被倒卖?这是什么骚操作?

    起因 - 又是一封邮件 2020 年 3 月 2 日,收到了一封邮件,对,这次故事的起因又是一封邮件,和上次写个bug被国家信息安全漏洞共享平台抓到了一样. 这是一条评论通知邮件,一开始我以为只是正常 ...

  6. PYTHON爬虫实战_垃圾佬闲鱼爬虫转转爬虫数据整合自用二手急速响应捡垃圾平台_3(附源码持续更新)

    说明 文章首发于HURUWO的博客小站,本平台做同步备份发布. 如有浏览或访问异常图片加载失败或者相关疑问可前往原博客下评论浏览. 原文链接 PYTHON爬虫实战_垃圾佬闲鱼爬虫转转爬虫数据整合自用二 ...

  7. 五月天的线上演唱会你看了吗?用Python分析网友对这场线上演唱会的看法

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者:CDA数据分析师 豆瓣9.4分!这场线上演唱会到底多好看? 首先让我 ...

  8. Python分析离散心率信号(上)

    Python分析离散心率信号(上) 一些理论和背景 心率包含许多有关信息.如果拥有心率传感器和一些数据,那么当然可以购买分析包或尝试一些可用的开源产品,但是并非所有产品都可以满足需求.也是这种情况.那 ...

  9. GIAC2019 演讲精选 | 面向未来的黑科技——UI2CODE闲鱼基于图片生成跨端代码

    一直以来, 如何从‘视觉稿’精确的还原出 对应的UI侧代码 一直是端侧开发同学工作里消耗比较大的部分,一方面这部分的工作 比较确定缺少技术深度,另一方面视觉设计师也需要投入大量的走查时间,有大量无谓的 ...

随机推荐

  1. svn学习与应用

    先来认识下svn svn是之前公司一直在用的代码版本控制系统,采用了分支管理系统.顾名思义,可以对代码的版本做系统化管理.通俗讲就是可用于多个人共同开发同一个项目,实现共用资源的目的. 开发同学使用s ...

  2. BackgroundService 大佬教的好

    BackgroundService 源码分析 因为换了工作也有两个多月没有写博客啦,因为跟着红超哥(大佬)一直在学习和做项目(反正就是在潜心修炼,大佬每天也是在我十万个为什么中度过的.) 最近在做一个 ...

  3. [题解] 洛谷 P3393 逃离僵尸岛

    题目TP门 很明显是一个最短路,但是如何建图才是关键. 对于每一个不可遍历到的点,可以向外扩散,找到危险城市. 若是对于每一个这样的城市进行搜索,时间复杂度就为\(O(n^2)\),显然过不了.不妨把 ...

  4. ubuntu安装vmware

    安装过程: 首先直接将光盘文件中的tar.gz复制到桌面,解压过程如下 中间遇到的问题: 在执行的过程中一直在回车,需要输入的全为yes,还有一个是what is the location of th ...

  5. 一种更优雅的Flutter Dialog解决方案

    前言 系统自带的Dialog实际上就是Push了一个新页面,这样存在很多好处,但是也存在一些很难解决的问题 必须传BuildContext loading弹窗一般都封装在网络框架中,多传个contex ...

  6. R语言无网络安装R包,彻底解决依赖问题!

    R version: 3.5.3, 3.6.3 更新日期: 2020-9-10 大家测试后多提建议哈, 有问题我会持续更新的 在工作中,我们使用的服务器通常是不能联外网的,这在安装R包的时候产生了巨大 ...

  7. 最常用的分布式ID解决方案,你知道几个

    一.分布式ID概念 说起ID,特性就是唯一,在人的世界里,ID就是身份证,是每个人的唯一的身份标识.在复杂的分布式系统中,往往也需要对大量的数据和消息进行唯一标识.举个例子,数据库的ID字段在单体的情 ...

  8. HTTP助记

    1** 信息,服务器收到请求,需要请求者继续执行操作 100 continue 继续,客户端应继续请求 101 swithching protocls 切换协议,服务器根据客户端的请求切换协议.只能切 ...

  9. v-if和v-for

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  10. mysql 列转行 动态写法

    -- 列转行动态sql -- 测试表DROP TABLE IF EXISTS `tb_score`; CREATE TABLE `tb_score` ( `id` int(11) NOT NULL A ...