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


1.目标场景

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

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

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

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

2.准备工作

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

1、配置好 Android ADB 开发环境

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

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

  1. # pocoui 
  2. pip3 install pocoui 
  3.  
  4. # 数据可视化图表 
  5. pip3 install pyecharts -U 

3.编写代码

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

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

  1. def __pre(self): 
  2.     """ 
  3.     准备工作 
  4.     :return: 
  5.     """ 
  6.     home() 
  7.     stop_app(package_name) 
  8.     start_my_app(package_name, activity) 
  9.  
  10.  
  11.     # 等待到达桌面 
  12.     self.poco(text='闲鱼').wait_for_appearance() 
  13.     self.poco(text='鱼塘').wait_for_appearance() 
  14.     self.poco(text='消息').wait_for_appearance() 
  15.     self.poco(text='我的').wait_for_appearance() 
  16.  
  17.     print('进入闲鱼主界面') 

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

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

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

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

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

  1. def __input_key_word(self): 
  2.     """ 
  3.     输入关键字 
  4.     :return: 
  5.     """ 
  6.     # 进入搜索界面 
  7.     perform_click(self.poco('com.taobao.idlefish:id/bar_tx')) 
  8.  
  9.     # 搜索框内输入文本 
  10.     self.poco('com.taobao.idlefish:id/search_term').set_text(self.good_msg) 
  11.  
  12.     # 点击搜索按钮 
  13.     while True: 
  14.          # 等待检索结果列表出现 
  15.          if not self.poco('com.taobao.idlefish:id/list_recyclerview').exists(): 
  16.               perform_click(self.poco('com.taobao.idlefish:id/search_button', text='搜索')) 
  17.          else: 
  18.               break 
  19.  
  20.     # 等待商品列表完全出现 
  21.     self.poco('com.taobao.idlefish:id/list_recyclerview').wait_for_appearance() 
  22.  
  23.     # 切换到列表 
  24.     perform_click(self.poco('com.taobao.idlefish:id/switch_search')) 

第 3 步,计算优秀滑动距离。

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

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

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

  1. def __get_good_swipe_distance(self): 
  2.     """ 
  3.     获取每次滑动,最合适的距离 
  4.     :return: 
  5.     """ 
  6.     element = Element() 
  7.     # 保存当前的UI树到本地 
  8.     element.get_current_ui_tree() 
  9.  
  10.     # 第一个商品Item的坐标 
  11.     position_item = element.find_elment_position_by_id_and_index("com.taobao.idlefish:id/card_root", 
  12.                                                                      "1") 
  13.     # 商品的高度 
  14.     item_height = position_item[1][1] - position_item[0][1] 
  15.  
  16.     # 通过观察,当前屏幕有3件商品 
  17.     return item_height * 3 

第 4 步,筛选商品。

上面的步骤拿到优秀的滑动距离,不停的滑动页面遍历列表元素的子 Item。

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

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

  1. # 多少人想要 
  2. want_element_parent = item.offspring('com.taobao.idlefish:id/search_item_flowlayout') 
  3.  
  4. if want_element_parent.exists(): 
  5.      # 想要数/已付款数目 
  6.      want_element = want_element_parent.children()[0] 
  7.  
  8.      want_content = want_element.get_text() 
  9.  
  10.      # 过滤掉等其他商品,只保留个人发布商品 
  11.      if '人想要' not in want_content: 
  12.             continue 
  13.  
  14.       # 拿到商品想要的具体数目,代表商品热度 
  15.       want_num = get_num(want_content) 
  16.  
  17.       if int(want_num) < self.num_assign: 
  18.              # print('不达标,过滤掉') 
  19.              pass 
  20.       else: 
  21.             # 商品想要数达标,加入统计 

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

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

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

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

  1. # 点击更多 
  2. while True: 
  3.      if self.poco('com.taobao.idlefish:id/ftShareName').exists(): 
  4.           break 
  5.      print('点击更多~') 
  6.      perform_click(self.poco(text='更多')) 
  7.  
  8. # 点击复制淘口令 
  9. perform_click(self.poco('com.taobao.idlefish:id/ftShareName', text='淘口令')) 
  10.  
  11. # 拿到口令码 
  12. taobao_code_element = self.poco('com.taobao.idlefish:id/tvWarnDetail') 
  13.  
  14. taobao_code = taobao_code_element.get_text()      

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

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

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

  1. def __sort_result(self): 
  2.     """ 
  3.     对爬取的结果进行排序 
  4.     :return: 
  5.     """ 
  6.     reader = csv.reader(open(self.file_path), delimiter=",") 
  7.  
  8.     # 头部标题 
  9.     head_title = next(reader) 
  10.  
  11.     # 按照第二列进行逆序排列 
  12.     sortedlist = sorted(reader, key=lambda x: (int(x[1])), reverse=True) 
  13.  
  14.     # 写入头部数据 
  15.     write_to_csv(self.file_path, [(head_title[0], head_title[1], head_title[2])], False) 
  16.  
  17.     for value in sortedlist: 
  18.        write_to_csv(self.file_path, [(value[0], value[1], value[2])], False) 
  19.  
  20.     return sortedlist 

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

  1. def draw_image(self, sortedlist): 
  2.      """ 
  3.      画图 
  4.      :param sortedlist: 
  5.      :return: 
  6.      """ 
  7.  
  8.      # 标题列表 
  9.      titles = [] 
  10.  
  11.      # 销量 
  12.      sales_num = [] 
  13.  
  14.      # 拿到爬取结果的标题、销量两个列表 
  15.      with open(self.file_path, 'r') as csvfile: 
  16.          # 读取文件 
  17.          reader = csv.DictReader(csvfile) 
  18.  
  19.          # 加入列表中 
  20.          for row in reader: 
  21.              titles.append(row['title']) 
  22.              sales_num.append(row['num']) 
  23.  
  24.      # 数目限制 
  25.      if len(titles) > self.num: 
  26.          titles = titles[:self.num] 
  27.          sales_num = sales_num[:self.num] 
  28.  
  29.      # 画图 
  30.      bar = ( 
  31.             Bar() 
  32.                 .add_xaxis(titles) 
  33.                 .add_yaxis("哪些好卖", sales_num) 
  34.                 .set_global_opts(title_opts=opts.TitleOpts(title="我要卖货")) 
  35.         ) 
  36.      bar.render('%s.html' % self.good_msg) 

第 7 步,配置参数。

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

  1. goods: 
  2.   # 搜索商品1,包含搜索关键字、爬取时间 
  3.   good1: 
  4.     key_word: '资料'   # 搜索关键字 
  5.     key_num: 100  # 筛选的临界点 
  6.     num: 10      # 只筛选爆款 
  7.     time: 600   # 爬取时间(秒) 

4.结果结论

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

评论关闭