美文网首页编程网赚
闲鱼上哪些商品抢手?Python 分析后告诉你

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

作者: AirPython | 来源:发表于2019-10-25 16:29 被阅读0次
    image

    阅读文本大概需要 10 分钟。

    目 标 场 景

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

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

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

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

    准 备 工 作

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

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

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

    image

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

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

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

    image

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

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

    image

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

    结 果 结 论

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

    image

    本文首发于公众号「 AirPython 」,我已经将全部源码上传到公众号后台,关注公众号后回复「 卖东西 」即可获得下载链接。

    如果你觉得文章还不错,请大家点赞分享下。你的肯定是我最大的鼓励和支持。

    推荐阅读:

    聊聊 Airtest 自动化工具

    自动化篇 - 躺着收钱!闲鱼自动发货机器人来啦~

    相关文章

      网友评论

        本文标题:闲鱼上哪些商品抢手?Python 分析后告诉你

        本文链接:https://www.haomeiwen.com/subject/kdvlvctx.html