第十八期:闲鱼上哪些商品抢手?Python分析后告诉你

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

作者:星安果

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.结果结论

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

阅读目录(置顶)(长期更新计算机领域知识)

阅读目录(置顶)(长期更新计算机领域知识)

阅读目录(置顶)(长期科技领域知识)

歌谣带你看java面试题

 

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

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

相关文章

[Leetcode][第1143题][JAVA][最长公共子序列][LCS][动态规划]

【问题描述】[中等] 【解答思路】 时间复杂度&#xff1a;O(N^2) 空间复杂度&#xff1a;O(N^2) class Solution {public int longestCommonSubsequence(String text1, String text2) {int m text1.length(), n text2.length();int[][] dp new int[m 1][n 1];for (int i …

第十九期:程序员节,女朋友偷偷送了我这个...

10 月 24 日&#xff0c;本是个寻常的日子&#xff0c;但是在新时代的中国&#xff0c;却赋予了它新的意义。 作者&#xff1a;技术栈 10 月 24 日&#xff0c;本是个寻常的日子&#xff0c;但是在新时代的中国&#xff0c;却赋予了它新的意义。 正是广大的程序员们&#xff…

第二十期:黄金三步法 | 汇报时,如何让老板快速抓住重点?

对事物的归类分组是我们人类的天性&#xff0c;我们的大脑会自动将发现的所有事物以某种持续组织起来。但如何组织才能帮助我们解决工作和生活中出现的各种复杂问题?今天&#xff0c;我们请阿里高级技术专家张建飞分享他的黄金三步法。 作者&#xff1a;从码农到工匠 对事物的…

vs设置html的模板快

打开vs编辑器&#xff0c;点击文件--》首选项--》用户代码片段 之后选择先对应的编辑器模板 进入里面编写相对应的代码块 之后直接在编辑器中调用。 转载于:https://www.cnblogs.com/zengsf/p/10929653.html

第二十一期:干货盘点!推荐程序员使用的5款工具软件

说到程序员&#xff0c;大多数人脑袋里显现出来的第一个画面应当就是一个面容冷漠的人指尖在键盘上快速飞跃敲出一行行看不懂的字符就能轻而易举入侵别人的系统。然而想象很丰满&#xff0c;现实是很骨感的&#xff0c;大多数程序员都只是一个简单的码农。 作者&#xff1a;四…

第二十二期:New一个对象的时候发生了什么?

如你所知&#xff0c;Java是一门面向对象的编程语言。我们平常在写代码的时候也是在不停的操作各种对象&#xff0c;那么当你在写出User user new User();这样一行代码的时候&#xff0c;JVM都做了些什么呢&#xff1f; 作者&#xff1a;湖人总冠军 一、引言 如你所知&#…

【数据结构与算法】【算法思想】Dijkstra算法

图的两种搜索算法&#xff0c;深度优先搜素和广度优先搜索。这两种算法主要是针对无权图的搜索算法。针对有权图&#xff0c;也就是图中的每条边都有一个权重&#xff0c;该如何计算两点之间的最短路径&#xff1f;最短路径算法&#xff08;Shortest Path Algorithm&#xff09…

第二十三期:程序员节Keep被曝突然裁员300多人,60%是开发和运营

社交健身App “Keep”突然裁员超300人&#xff0c;而且是在1024程序员节。此次被裁的人员中&#xff0c;大约有60%的人是开发和运营&#xff0c;补偿方案为N1。 作者&#xff1a;三言财经 10月24日脉脉有多条消息称&#xff0c;社交健身App “Keep”突然裁员超300人&#xff0…

542. 01 Matrix

输入&#xff1a;元素值为0或者1的矩阵。 输出&#xff1a; 每个元素距离0的最近距离是多少。 规则&#xff1a;相邻单元格的距离是1&#xff0c;相邻是指上下左右4个方向。 分析&#xff1a;这类似于学习课程安排&#xff0c;可以从元素值为0的单元开始沿4个方向遍历。matrix[…

第二十四期:管理 | 成功领导远程IT团队的7个技巧

管理虚拟工作环境需要各种真实世界的技能和工具。以下是激发创造力和生产力的策略。为了在日益缺乏人才和竞争激烈的IT世界中取得成功&#xff0c;越来越多的企业开始依赖于地理上分散的劳动力。 作者&#xff1a;John Edwards 管理虚拟工作环境需要各种真实世界的技能和工具…

310. Minimum Height Trees

输入&#xff1a;包含n个节点的无向图。n&#xff1a;表示从0到n-1&#xff0c;n个节点。edges&#xff1a;int数组&#xff0c;是从一个节点到另外一个节点。但是没有方向。 输出&#xff1a;以哪些节点为根节点&#xff0c;具有最小高度的树&#xff0c;返回这些根节点。 规则…

计算获取最小值和最大值

比如&#xff0c;在下面的销售业绩中&#xff0c;统计业务员的销售业绩中最大值和最小值。 下面是业务数据&#xff1a; CREATE TABLE [dbo].[SalesPerformance]([ID] [int] IDENTITY(1,1) NOT NULL,[Salesman] NVARCHAR(30) NOT NULL,[OrderDate] [DATE] NULL,[Sell] DECIM…

第二十五期:知乎用Go替代Python,说明了啥

众所周知&#xff0c;知乎早在几年前就将推荐系统从 Python 转为了 Go。于是乎&#xff0c;一部分人就说 Go 比 Python 好&#xff0c;Go 和 Python 两大社区的相关开发人员为此也争论过不少&#xff0c;似乎&#xff0c;谁也没完全说服谁。 作者&#xff1a;hello架构 大概每…

[Leetcode][第106题][JAVA][ 从中序与后序遍历序列构造二叉树][分治][递归]

【问题描述】[中等] 【解答思路】 public class Solution {public TreeNode buildTree(int[] inorder, int[] postorder) {int inLen inorder.length;int postLen postorder.length;// 特判if (inLen ! postLen) {throw new RuntimeException("输入错误");}return …

第二十六期:英国建设下一代IOT基础设施的历史机遇和挑战

无论未来物联网发展的中心在哪里&#xff0c;都会带来一笔巨大的财富。但许多地区面临的真正障碍是缺乏可用的光纤基础设施来形成回程网络。接下来看一看全光纤在英国的推广情况。 作者&#xff1a;风车云马编译 世界各地的市政当局都在呼吁制定支持5G的基础设施计划。这些基…

[Leetcode][第889题][JAVA][根据前序和后序遍历构造二叉树][分治][递归]

【问题描述】[中等] 【解答思路】 copyOfRange class Solution {public TreeNode constructFromPrePost(int[] pre, int[] post) {if(prenull || pre.length0) {return null;}return dfs(pre,post);}private TreeNode dfs(int[] pre,int[] post) {if(prenull || pre.length0)…

第二十七期:Deepfake视频正在快速传播,也许区块链能够阻止这波“瘟疫”

“假新闻”一词已经成为当下的热门话题&#xff0c;而Deepfake(即看似真实&#xff0c;但实为伪造的视频操纵行为)则会进一步加剧民众与媒体之间的不信任危机。 作者&#xff1a;佚名来源 “假新闻”一词已经成为当下的热门话题&#xff0c;而Deepfake(即看似真实&#xff0c;…

POJ 1276 完全背包

Sample Input 735 3 4 125 6 5 3 350 633 4 500 30 6 100 1 5 0 1 735 0 0 3 10 100 10 50 10 10 Sample Output 735 630 0 0题意&#xff1a;你的银行卡里有 cash 元&#xff0c;而ATM机里有 n 种面值的钱&#xff0c;n行每种钱的数量和面值。  问 最多能从这台AT…

[Leetcode][第117题][JAVA][填充每个节点的下一个右侧节点指针][BFS]

【问题描述】[中等] 【解答思路】 1. 层次遍历 public Node connect(Node root) {if (root null)return root;Queue<Node> queue new LinkedList<>();queue.add(root);while (!queue.isEmpty()) {//每一层的数量int levelCount queue.size();//前一个节点Node …

第二十八期:Java线程池的四种用法与使用场景

线程池的作用主要是为了提升系统的性能以及使用率。文章刚开始就提到&#xff0c;如果我们使用最简单的方式创建线程&#xff0c;如果用户量比较大&#xff0c;那么就会产生很多创建和销毁线程的动作&#xff0c;这会导致服务器在创建和销毁线程上消耗的性能可能要比处理实际业…