前言
準 備 工 作
在編寫程式碼之前,需要做如下準備工作:
1、配置好 Android ADB 開發環境
2、Python 虛擬環境內安裝 pocoui 依賴庫
3、安裝資料視覺化依賴庫 pyecharts
編 寫 代 碼
我們分 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 步,獲取商品連結地址。
# 點選更多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 # 爬取時間(秒)結 果 結 論
提前配置好商品關鍵字、爬取時間等引數,即可以爬取到符合要求的、最好賣的商品資料,最終以圖表的方式展示出來。
..