一篇文章教會你用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/