自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

閑魚(yú)上哪些商品搶手?Python分析后告訴你

開(kāi)發(fā) 后端
經(jīng)常看到有朋友在閑魚(yú)賣些小東西又或是自己擅長(zhǎng)的一些技能,都能為他們帶來(lái)不錯(cuò)的 睡后收入。

1.目標(biāo)場(chǎng)景

經(jīng)常看到有朋友在閑魚(yú)賣些小東西又或是自己擅長(zhǎng)的一些技能,都能為他們帶來(lái)不錯(cuò)的睡后收入。

[[280065]]

閑魚(yú)上大量的商品,很難精準(zhǔn)判斷哪些受歡迎,哪些好賣;一個(gè)個(gè)錄入數(shù)據(jù)去做數(shù)據(jù)分析,浪費(fèi)時(shí)間的同時(shí),效率也極其的低效。

本篇文章的目的是利用 Python 自動(dòng)化 來(lái)獲取某類商品中很好賣的商品以供參考。

ps:本文僅限用于技術(shù)交流,請(qǐng)勿用于其他用途。

2.準(zhǔn)備工作

在編寫(xiě)代碼之前,需要做如下準(zhǔn)備工作:

(1)配置好 Android ADB 開(kāi)發(fā)環(huán)境

(2)Python 虛擬環(huán)境內(nèi)安裝 pocoui 依賴庫(kù)

(3)安裝數(shù)據(jù)可視化依賴庫(kù) pyecharts

  1. # pocoui 
  2. pip3 install pocoui 
  3.  
  4. # 數(shù)據(jù)可視化圖表 
  5. pip3 install pyecharts -U 

3.編寫(xiě)代碼

我們分 7 個(gè)步驟來(lái)實(shí)現(xiàn)這個(gè)功能,分別是:打開(kāi)目標(biāo)應(yīng)用客戶端、檢索關(guān)鍵字到商品列表界面、計(jì)算優(yōu)秀滑動(dòng)距離、篩選商品、獲取商品鏈接地址、寫(xiě)入文件排序并統(tǒng)計(jì)商品、配置參數(shù)。

第 1 步,使用 pocoui 自動(dòng)化打開(kāi)目標(biāo)應(yīng)用。

  1. def __pre(self): 
  2.     ""
  3.     準(zhǔn)備工作 
  4.     :return
  5.     ""
  6.     home() 
  7.     stop_app(package_name) 
  8.     start_my_app(package_name, activity) 
  9.  
  10.  
  11.     # 等待到達(dá)桌面 
  12.     self.poco(text='閑魚(yú)').wait_for_appearance() 
  13.     self.poco(text='魚(yú)塘').wait_for_appearance() 
  14.     self.poco(text='消息').wait_for_appearance() 
  15.     self.poco(text='我的').wait_for_appearance() 
  16.  
  17.     print('進(jìn)入閑魚(yú)主界面'

進(jìn)入到閑魚(yú)首頁(yè)之后,應(yīng)用端會(huì)拿到剪切板的數(shù)據(jù),當(dāng)存在特定規(guī)律的口令的時(shí),會(huì)立馬彈出一個(gè)對(duì)話框,因此需要模擬關(guān)閉對(duì)話框的操作。

  1. # 如果指定時(shí)間內(nèi)內(nèi)有淘口令,就關(guān)閉 
  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) 

打開(kāi)應(yīng)用之后,就可以進(jìn)行第 2 步操作了。

通過(guò)要檢索的關(guān)鍵字,模擬輸入到輸入框內(nèi),然后點(diǎn)擊搜索按鈕,一直等待搜過(guò)列表出現(xiàn)為止。 

另外,為了更加方便地處理數(shù)據(jù),商品列表切換到列表模式,即一行只顯示一個(gè)商品。

  1. def __input_key_word(self): 
  2.     ""
  3.     輸入關(guān)鍵字 
  4.     :return
  5.     ""
  6.     # 進(jìn)入搜索界面 
  7.     perform_click(self.poco('com.taobao.idlefish:id/bar_tx')) 
  8.  
  9.     # 搜索框內(nèi)輸入文本 
  10.     self.poco('com.taobao.idlefish:id/search_term').set_text(self.good_msg) 
  11.  
  12.     # 點(diǎn)擊搜索按鈕 
  13.     while True
  14.          # 等待檢索結(jié)果列表出現(xiàn) 
  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.     # 等待商品列表完全出現(xiàn) 
  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 步,計(jì)算優(yōu)秀滑動(dòng)距離。

為了保證爬取數(shù)據(jù)的高效性,獲取計(jì)算出每次滑動(dòng)的優(yōu)秀距離。

首先先拿到當(dāng)前界面的 UI 控件樹(shù),然后通過(guò)控件的屬性 ID 拿到商品的坐標(biāo),進(jìn)而得到每一項(xiàng)商品的高度。

最后,通過(guò)觀察屏幕中出現(xiàn)商品的數(shù)目得到優(yōu)秀滑動(dòng)距離。

  1. def __get_good_swipe_distance(self): 
  2.     ""
  3.     獲取每次滑動(dòng),最合適的距離 
  4.     :return
  5.     ""
  6.     element = Element() 
  7.     # 保存當(dāng)前的UI樹(shù)到本地 
  8.     element.get_current_ui_tree() 
  9.  
  10.     # 第一個(gè)商品Item的坐標(biāo) 
  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.     # 通過(guò)觀察,當(dāng)前屏幕有3件商品 
  17.     return item_height * 3 

第 4 步,篩選商品。

上面的步驟拿到優(yōu)秀的滑動(dòng)距離,不停的滑動(dòng)頁(yè)面遍歷列表元素的子 Item。

需要注意的是,為了避免滑動(dòng)慣性導(dǎo)致的誤差,每一次的滑動(dòng)時(shí)長(zhǎng)最好設(shè)置為 2s 以上。

通過(guò)商品 Item 篩選出想要數(shù)目大于預(yù)設(shè)數(shù)字的商品。

  1. # 多少人想要 
  2. want_element_parent = item.offspring('com.taobao.idlefish:id/search_item_flowlayout'
  3.  
  4. if want_element_parent.exists(): 
  5.      # 想要數(shù)/已付款數(shù)目 
  6.      want_element = want_element_parent.children()[0] 
  7.  
  8.      want_content = want_element.get_text() 
  9.  
  10.      # 過(guò)濾掉【已付款】等其他商品,只保留個(gè)人發(fā)布商品 
  11.      if '人想要' not in want_content: 
  12.             continue 
  13.  
  14.       # 拿到商品想要的具體數(shù)目,代表商品熱度 
  15.       want_num = get_num(want_content) 
  16.  
  17.       if int(want_num) < self.num_assign: 
  18.              # print('不達(dá)標(biāo),過(guò)濾掉'
  19.              pass 
  20.       else
  21.             # 商品想要數(shù)達(dá)標(biāo),加入統(tǒng)計(jì) 

第 5 步,獲取商品鏈接地址。

對(duì)于上一步滿足條件的商品,點(diǎn)擊商品 Item 進(jìn)入到商品詳情頁(yè)面。

接著點(diǎn)擊右上角的分享按鈕,會(huì)立即彈出分享對(duì)話框。

然后點(diǎn)擊口令控件,會(huì)提示口令復(fù)制到系統(tǒng)剪切板成功。

  1. # 點(diǎn)擊更多 
  2. while True
  3.      if self.poco('com.taobao.idlefish:id/ftShareName').exists(): 
  4.           break 
  5.      print('點(diǎn)擊更多~'
  6.      perform_click(self.poco(text='更多')) 
  7.  
  8. # 點(diǎn)擊復(fù)制淘口令 
  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 步,寫(xiě)入商品、排序并統(tǒng)計(jì)數(shù)據(jù)。

將上面獲取到的商品標(biāo)題、想要數(shù)、分享地址寫(xiě)入到 CSV 文件中。

然后讀取數(shù)據(jù)文件,通過(guò)對(duì)表格中的第二列進(jìn)行反向排序,使商品按照想要數(shù)進(jìn)行降序排列。

  1. def __sort_result(self): 
  2.     ""
  3.     對(duì)爬取的結(jié)果進(jìn)行排序 
  4.     :return
  5.     ""
  6.     reader = csv.reader(open(self.file_path), delimiter=","
  7.  
  8.     # 頭部標(biāo)題 
  9.     head_title = next(reader) 
  10.  
  11.     # 按照第二列進(jìn)行逆序排列 
  12.     sortedlist = sorted(reader, key=lambda x: (int(x[1])), reverse=True
  13.  
  14.     # 寫(xiě)入頭部數(shù)據(jù) 
  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 項(xiàng)數(shù)據(jù),利用 pyecharts 生成統(tǒng)計(jì)圖表。

  1. def draw_image(self, sortedlist): 
  2.      ""
  3.      畫(huà)圖 
  4.      :param sortedlist: 
  5.      :return
  6.      ""
  7.  
  8.      # 標(biāo)題列表 
  9.      titles = [] 
  10.  
  11.      # 銷量 
  12.      sales_num = [] 
  13.  
  14.      # 拿到爬取結(jié)果的標(biāo)題、銷量?jī)蓚€(gè)列表 
  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.      # 數(shù)目限制 
  25.      if len(titles) > self.num: 
  26.          titles = titles[:self.num] 
  27.          sales_num = sales_num[:self.num] 
  28.  
  29.      # 畫(huà)圖 
  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 步,配置參數(shù)。

編寫(xiě) yaml 文件,指定要爬取商品的關(guān)鍵字、爬取時(shí)間、想要數(shù)考核指標(biāo)數(shù)、篩選商品數(shù)目。

  1. goods: 
  2.   # 搜索商品1,包含搜索關(guān)鍵字、爬取時(shí)間 
  3.   good1: 
  4.     key_word: '資料'   # 搜索關(guān)鍵字 
  5.     key_num: 100  # 篩選【想要數(shù)】的臨界點(diǎn) 
  6.     num: 10      # 只篩選爆款 
  7.     time: 600   # 爬取時(shí)間(秒) 

4.結(jié)果結(jié)論

提前配置好商品關(guān)鍵字、爬取時(shí)間等參數(shù),即可以爬取到符合要求的、最好賣的商品數(shù)據(jù),最終以圖表的方式展示出來(lái)。

 

責(zé)任編輯:華軒 來(lái)源: AirPython
相關(guān)推薦

2021-09-06 11:57:30

Python

2021-04-27 09:33:41

Python北京景點(diǎn)

2023-03-08 07:54:26

無(wú)核顯單通道CPU

2024-06-21 08:02:22

2021-07-09 11:29:22

交易鏈路閑魚(yú)阿里云

2018-08-25 14:07:24

數(shù)據(jù)聚合閑魚(yú)前端

2019-09-29 10:00:46

Python程序員旅游

2017-09-01 14:34:33

2021-10-15 21:20:36

SSD硬盤工具

2017-10-26 13:40:11

Python一行代碼

2022-08-11 11:11:12

Python代碼

2021-08-02 14:27:18

大數(shù)據(jù)殺熟人工智能網(wǎng)絡(luò)投訴

2019-06-18 10:05:55

大數(shù)據(jù)80后90后

2021-01-22 15:18:12

消息延遲閑魚(yú)長(zhǎng)連接

2021-02-27 10:38:56

Python結(jié)構(gòu)數(shù)據(jù)

2017-09-03 18:06:07

2020-01-18 10:27:07

簡(jiǎn)書(shū)知乎Python

2020-04-15 09:35:59

Flutter圖片優(yōu)化

2021-09-18 10:59:08

大數(shù)據(jù)家庭成績(jī)

2018-11-28 10:23:01

Python旅游景點(diǎn)數(shù)據(jù)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)