为什么闲鱼不能搜索python_Python 分析后告诉你闲鱼上哪些商品抢手?

前言

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

作者:【Airpython】

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

准 备 工 作

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

1、配置好 Android ADB 开发环境

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

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

# pocoui

pip3 install pocoui

# 数据可视化图表

pip3 install pyecharts -U

编 写 代 码

我们分 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 # 爬取时间(秒)

结 果 结 论

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

..

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

原文链接:https://www.cnblogs.com/python0921/p/12587939.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/350387.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

matlab imfill孔洞填充

BW2 imfill(BW) 作用填充二值图像BW中的空洞 clear all; clc; close all; img imread(test1.png); if ndims(img)3 img rgb2gray(img); end img_bw im2bw(img); img_fill imfill(img_bw, holes); figure; subplot(1,2,1),imshow(img_bw), title(有空洞的图像); s…

将Gatling集成到Gradle构建中–了解SourceSet和配置

我最近在一个项目中工作&#xff0c;我们不得不将出色的负载测试工具Gatling集成到基于Gradle的版本中。 有可用的gradle插件使此操作变得容易&#xff0c;其中两个是this和this &#xff0c;但是对于大多数需求而言&#xff0c;只需简单执行命令行工具本身就足够了&#xff0c…

matlab bwlabel标记连通区域

[L,num] bwlabel(BW,n) 这里num返回的就是BW中连通区域的个数。返回一个和BW大小相同的L矩阵&#xff0c;包含了标记了BW中每个连通区域的类别标签&#xff0c;这些标签的值为1、2、num&#xff08;连通区域的个数&#xff09;。n的值为4或8&#xff0c;表示是按4连通寻找区域…

mysql遇到时区问题的坑(Java解决方案)

最近项目遇到一个坑&#xff0c;就是server和db之间存在时区问题&#xff0c;本人的db是utc时间&#xff0c; 可以使用代码设置时区来解决&#xff0c;本人这里使用joda三方包&#xff0c;joda蛮好用的&#xff0c;具体用法这里不做详细描述。 先引入pom <dependency><…

vba 不等于_EXCEL表格VBA中的运算符

就像函数公式里面需要运算符一样&#xff0c;VBA中同样也需要运算符&#xff0c;今天我们就来了解下VBA中的运算符是怎么表达的。在学习运算符前&#xff0c;我们先来学习一段简单的VBA代码&#xff0c;Msgbox的表达。在代码窗口中输入&#xff1a;sub test ()tset表示测试的意…

C++常用的容器(vector、set、list、map)

C STL中最基本以及最常用的类或容器无非就是以下几个&#xff1a; stringvectorsetlistmap 下面就依次介绍它们&#xff0c;并给出一些最常见的最实用的使用方法&#xff0c;做到快速入门。 string 首先看看我们C语言一般怎么使用字符串的 char* s1 "Hello SYSU!&quo…

阿里 前端 规范_技术方案多、复用难?且看阿里文娱的前端工程管理实践

近两年&#xff0c;前端复杂度持续攀升&#xff0c;从框架到开发模式都衍生出了无数的技术方案。单点的小规模尝试&#xff0c;导致团队内部技术栈以及实现方案出现分化&#xff0c;间接造成了知识库之间的隔离、项目之间模块复用率下降&#xff0c;人员在不同项目中的学习成本…

Codeforces 671C Ultimate Weirdness of an Array 线段树 (看题解)

Ultimate Weirdness of an Array 写不出来&#xff0c; 日常好菜啊。。 考虑枚举GCD&#xff0c; 算出一共有多少个对 f(l, r) < GCD&#xff0c; 我们用fuc[ i ] 表示的是在 l i 这个位置开始, 最小的合法的 R&#xff0c; 可以发现这个函数随 i 单调不下降&#xff0c; …

安卓开发环境_我的安卓开发环境

大家好&#xff0c;今天想跟大家分享一下我的安卓开发环境&#xff0c;分别是硬件环境和软件环境。那么在开始之前先交代下我的背景&#xff0c;我从事安卓开发1年8个月&#xff0c;安卓教学9个月&#xff0c;大项目1个&#xff0c;小项目100。先说说硬件环境吧&#xff0c;直接…

构造函数,拷贝构造函数,赋值函数

C中一般创建对象&#xff0c;拷贝或赋值的方式有构造函数&#xff0c;拷贝构造函数&#xff0c;赋值函数这三种方法。下面就详细比较下三者之间的区别以及它们的具体实现 1.构造函数 构造函数是一种特殊的类成员函数&#xff0c;是当创建一个类的对象时&#xff0c;它被调用来…

性能优化系列

常见性能优化策略的总结&#xff08;转&#xff09; https://www.cnblogs.com/ajianbeyourself/p/6132546.html 网站前端和后台性能优化的34条宝贵经验和方法 https://www.imooc.com/article/41237 一次性能优化实战经历 https://www.cnblogs.com/SameZhao/p/6238997.html …

qotd服务_QOTD:Java线程与Java堆空间

qotd服务以下问题很常见&#xff0c;并且与OutOfMemoryError有关&#xff1a;在JVM线程创建过程和JVM线程容量期间无法创建新的本机线程问题。 这也是我向新技术候选人&#xff08;高级职位&#xff09;提出的典型面试问题。 我建议您在查看答案之前尝试提供自己的答复。 题&a…

ecs服务器数据迁移_某国际物流集团的云迁移解决方案

新钛云服已为您服务905天云计算流行当下&#xff0c;使用新技术较早的互联网企业&#xff0c;已基本实现云计算实施。传统企业也开始接触云计算并进行使用&#xff0c;但由于与互联网轻实体资产的模式不同&#xff0c;其往往面临着业务迁移上云的难题。云迁移过程非常复杂&…

红黑树的红黑标志有什么用

红黑树使用红黑二色进行“着色”&#xff0c;目的是利用颜色值作为二叉树的平衡对称性的检查&#xff0c;只要插入的节点“着色”满足红黑二色的规定&#xff0c;最短路径与最长路径不会相差的太远&#xff0c;红黑树的节点分布就能大体上达至均衡。 演示动画网站&#xff1a;h…

内存泄露与内存溢出

内存泄露是指你的应用使用资源之后没有及时释放&#xff0c;导致应用内存中持有了不需要的资源&#xff0c;这是一种状态描述。 内存溢出是指你的应用的内存已经不能满足正常使用了&#xff0c;堆栈已经达到系统设置的最大值&#xff0c;进而导致崩溃&#xff0c;这事一种结果描…

琥珀项目:较小的,面向生产力的Java语言功能

Brian Goetz最近的消息欢迎来到琥珀&#xff01; 介绍Project Amber &#xff08; OpenJDK的一部分&#xff0c; 最初于1月提出 &#xff09;。 Goetz通过介绍“欢迎使用Amber项目&#xff0c;这是我们面向特定生产力的Java语言JEP的孵化场”的介绍打开了这一消息。 Goetz重申&…

python个人收支管理系统相关题目_练手题:计算人均付费(SQLPython)

ARPU&#xff1a;人均付费总收入/总人数ARPPU&#xff1a;付费用户人均付费总收入/付费人数业务要求&#xff1a;1.各地市用户数、总费用(ARPU之和)是多少&#xff1f;2.表一中各地市ARPU(0,30),[30,50),[50-80),[80以上)用户数分别是多少&#xff1f;3.表二中用户有重复的记录…

Web 框架

1、Web框架 Web框架&#xff08;Web framework&#xff09;是一种开发框架&#xff0c;用来支持动态网站、网络应用和网络服务的开发。这大多数的web框架提供了一套开发和部署网站的方式&#xff0c;也为web行为提供了一套通用的方法。web框架已经实现了很多功能&#xff0c;开…

“引用作为函数参数”与 “引用作为函数返回值”

一、引用作为函数参数 作为函数参数时引用有两种原因&#xff1a;1、在函数内部会对此参数进行修改&#xff1b;2、提高函数调用和运行效率。 关于第一点&#xff0c;都知道C里提到函数就会提到形参和实参。如果函数的参数实质就是形参&#xff0c;不过这个形参的作用域只是在…

vue删除数组中的一条数据_删除排序数组中的重复项 II

删除排序数组中的重复项 II题目给定一个增序排列数组 nums &#xff0c;你需要在 原地 删除重复出现的元素&#xff0c;使得每个元素最多出现两次&#xff0c;返回移除后数组的新长度。不要使用额外的数组空间&#xff0c;你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的…