1. 程式人生 > 實用技巧 >一篇文章教會你用Python多執行緒獲取小米應用商店App

一篇文章教會你用Python多執行緒獲取小米應用商店App

【一、專案背景】

小米應用商店給使用者發現最好的安卓應用和遊戲,安全可靠,可是要下載東西要一個一個的搜尋太麻煩了。而已速度不是很快。

今天用多執行緒爬取小米應用商店的遊戲模組。快速獲取。

【二、專案目標】

目標 :應用分類 - 聊天社交  應用名稱, 應用連結,顯示在控制檯供使用者下載。

【三、涉及的庫和網站】

1、網址:百度搜 - 小米應用商店,進入官網。

2、涉及的庫:reques****ts、threading 、queue 、json、time

3、軟體:PyCharm

【四、專案分析】

1、確認是否為動態載入。

通過頁面區域性重新整理, 右鍵檢視網頁原始碼,搜尋關鍵字未搜到  。斷定此網站為動態載入網站,需要抓取網路資料包分析。

2、使用chrome瀏覽器,F12抓取網路資料包。

1)抓取返回json資料的URL地址(Headers中的Request URL)。

http://app.mi.com/categotyAllListApi?page={}&categoryId=2&pageSize=30

2)檢視並分析查詢引數(headers中的Query String Parameters)。

page: 1
categoryId: 2
pageSize: 30

發現只有page再變,0 1 2 3 ... ... ,這樣我們就可以通過控制page的直拼接多個返回json資料的URL地址。

【五、專案實施】

1、我們定義一個class類繼承object,然後定義init方法繼承self,再定義一個主函式main繼承self。準備匯入庫,url地址和請求頭headers。

import requests
from threading import Thread
from queue import Queue
import json
import time
class  XiaomiSpider(object):
    def __init__(self):
      self.headers = {'User-Agent':'Mozilla/5.0'}
      self.url = 'http://app.mi.com/categotyAllListApi?page={}&categoryId=15&pageSize=30'
    def main(self):
        pass
if __name__ == '__main__':
    imageSpider =  XiaomiSpider()
    imageSpider.main()

2、定義佇列,用來存放URL地址

self.url_queue = Queue()

3、URL入佇列

def url_in(self):
    # 拼接多個URL地址,然後put()到佇列中
    for i in range(67):
        self.url.format((str(i)))
        self.url_queue.put(self.url)

4、定義執行緒事件函式get_page(請求資料)

def get_page(self):
    # 先get()URL地址,發請求
    while True:
        # 當佇列不為空時,獲取url地址
        if not self.url_queue.empty():
            url = self.url_queue.get()
            html = requests.get(url,headers=self.headers).text
            self.parse_page(html)
        else:
            break

5、定義函式parse_page 解析json模組,提取應用名稱,應用連結內容。

 # 解析函式
def parse_page(self,html):
    app_json = json.loads(html)
    for app in app_json['data']:
        # 應用名稱
        name = app['displayName']
        # 應用連結
        link = 'http://app.mi.com/details?id={}'.format(app['packageName'])
        d = { '名稱' : name,'連結' : link }
        print(d)

6、main方法, 定義t_list = [] 存放所有執行緒的列表。呼叫get_page多執行緒爬取。

def main(self):
    self.url_in()
    # 存放所有執行緒的列表
    t_list = []

    for i in range(10):
        t = Thread(target=self.get_page)
        t.start()
        t_list.append(t)

7、for迴圈遍歷列表,統一回收執行緒。

# 統一回收執行緒
for p in t_list:
    p.join()

8、統計一下執行時間。

start = time.time()
spider = XiaomiSpider()
spider.main()
end = time.time()
print('執行時間:%.2f' % (end-start))

【六、效果展示】
   1、執行程式。點選執行,將遊戲名稱,下載連結,執行時間,顯示在控制檯。

2、點選藍色的網址可以直接去到下載頁面下載應用,如下圖所示。

【七、總結】

1、不建議抓取太多資料,容易對伺服器造成負載,淺嘗輒止即可。

2、Python多執行緒優點。使用執行緒可以把佔據長時間的程式中的任務放到後臺去處,程式的執行速度可能加快。

3、單執行緒可以被搶佔(中斷),而已多執行緒就有了更多的選擇。而已在其他執行緒正在執行時,執行緒可以暫時擱置(也稱為睡眠)。可以釋放一些珍貴的資源如記憶體佔用。

4、大家也可以嘗試在爬取其他分類,按照操作步驟,自己嘗試去做。自己實現的時候,總會有各種各樣的問題,切勿眼高手低,勤動手,才可以理解的更加深刻。

5、需要本文原始碼的小夥伴,後臺回覆“小米應用”四個字,即可獲取。

看完本文有收穫?請轉發分享給更多的人

IT共享之家

入群請在微信後臺回覆【入群】


想學習更多Python網路爬蟲與資料探勘知識,可前往專業網站:http://pdcfighting.com/