Python爬蟲過(guò)程解析之多線程獲取小米應(yīng)用商店數(shù)據(jù)
本文的文字及圖片來(lái)源于網(wǎng)絡(luò),僅供學(xué)習(xí)、交流使用,不具有任何商業(yè)用途,如有問(wèn)題請(qǐng)及時(shí)聯(lián)系我們以作處理。
以下文章來(lái)源于IT共享之家 ,作者IT共享者
前言
小米應(yīng)用商店給用戶發(fā)現(xiàn)最好的安卓應(yīng)用和游戲,安全可靠,可是要下載東西要一個(gè)一個(gè)地搜索太麻煩了。而且速度不是很快。
今天用多線程爬取小米應(yīng)用商店的游戲模塊。快速獲取。
二、項(xiàng)目目標(biāo)
目標(biāo) :應(yīng)用分類 - 聊天社交 應(yīng)用名稱, 應(yīng)用鏈接,顯示在控制臺(tái)供用戶下載。
三、涉及的庫(kù)和網(wǎng)站
1、網(wǎng)址:百度搜 - 小米應(yīng)用商店,進(jìn)入官網(wǎng)。
2、涉及的庫(kù):requests、threading 、queue 、json、time
3、軟件:PyCharm
四、項(xiàng)目分析
1、確認(rèn)是否為動(dòng)態(tài)加載。
通過(guò)頁(yè)面局部刷新, 右鍵查看網(wǎng)頁(yè)源代碼,搜索關(guān)鍵字未搜到 。斷定此網(wǎng)站為動(dòng)態(tài)加載網(wǎng)站,需要抓取網(wǎng)絡(luò)數(shù)據(jù)包分析。
2、使用chrome瀏覽器,F(xiàn)12抓取網(wǎng)絡(luò)數(shù)據(jù)包。
1)抓取返回json數(shù)據(jù)的URL地址(Headers中的Request URL)。
http://app.mi.com/categotyAllListApi?page={}&categoryId=2&pageSize=30
2)查看并分析查詢參數(shù)(headers中的Query String Parameters)。
page: 1 categoryId: 2 pageSize: 30
發(fā)現(xiàn)只有page再變,0 1 2 3 ... ... ,這樣我們就可以通過(guò)控制page的直拼接多個(gè)返回json數(shù)據(jù)的URL地址。
五、項(xiàng)目實(shí)施
1、我們定義一個(gè)class類繼承object,然后定義init方法繼承self,再定義一個(gè)主函數(shù)main繼承self。準(zhǔn)備導(dǎo)入庫(kù),url地址和請(qǐng)求頭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、定義隊(duì)列,用來(lái)存放URL地址
self.url_queue = Queue()
3、URL入隊(duì)列
def url_in(self): # 拼接多個(gè)URL地址,然后put()到隊(duì)列中 for i in range(67): self.url.format((str(i))) self.url_queue.put(self.url)
4、定義線程事件函數(shù)get_page(請(qǐng)求數(shù)據(jù))
defget_page(self): # 先get()URL地址,發(fā)請(qǐng)求 while True: # 當(dāng)隊(duì)列不為空時(shí),獲取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、定義函數(shù)parse_page 解析json模塊,提取應(yīng)用名稱,應(yīng)用鏈接內(nèi)容。
# 解析函數(shù) def parse_page(self,html): app_json = json.loads(html) for app in app_json['data']: # 應(yīng)用名稱 name = app['displayName'] # 應(yīng)用鏈接 link = 'http://app.mi.com/details?id={}'.format(app['packageName']) d = { '名稱' : name,'鏈接' : link } print(d)
6、main方法, 定義t_list = [] 存放所有線程的列表。調(diào)用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循環(huán)遍歷列表,統(tǒng)一回收線程。
# 統(tǒng)一回收線程for p in t_list: p.join()
8、統(tǒng)計(jì)一下執(zhí)行時(shí)間。
start = time.time() spider = XiaomiSpider() spider.main() end = time.time() print('執(zhí)行時(shí)間:%.2f' % (end-start))
六、效果展示
1、運(yùn)行程序。點(diǎn)擊運(yùn)行,將游戲名稱,下載鏈接,執(zhí)行時(shí)間,顯示在控制臺(tái)。
2、點(diǎn)擊藍(lán)色的網(wǎng)址可以直接去到下載頁(yè)面下載應(yīng)用,如下圖所示。
到此這篇關(guān)于Python爬蟲過(guò)程解析之多線程獲取小米應(yīng)用商店數(shù)據(jù)的文章就介紹到這了,更多相關(guān)Python多線程獲取小米應(yīng)用商店數(shù)據(jù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python filecmp.dircmp實(shí)現(xiàn)遞歸比對(duì)兩個(gè)目錄的方法
這篇文章主要介紹了python filecmp.dircmp實(shí)現(xiàn)遞歸比對(duì)兩個(gè)目錄的方法,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-05-05Python chardet庫(kù)識(shí)別編碼原理解析
這篇文章主要介紹了python chardet庫(kù)識(shí)別編碼原理解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-02-02python?aeon庫(kù)進(jìn)行時(shí)間序列算法預(yù)測(cè)分類實(shí)例探索
這篇文章主要介紹了python?aeon庫(kù)進(jìn)行時(shí)間序列算法預(yù)測(cè)分類實(shí)例探索,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2024-02-02python實(shí)現(xiàn)文件助手中查看微信撤回消息
這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)文件助手中查看微信撤回消息,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-04-04pyqt5對(duì)用qt designer設(shè)計(jì)的窗體實(shí)現(xiàn)彈出子窗口的示例
今天小編就為大家分享一篇pyqt5對(duì)用qt designer設(shè)計(jì)的窗體實(shí)現(xiàn)彈出子窗口的示例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-06-06