多進程的使用可以參見 分類目錄——多進程 ,這裏就直接操作不在進行過多的說明
這裏以 把我的CSDN上的20條博客 訪問一遍爲例,來比照單純串行和多進程並行的執行效率
-
首先,獲取我所有博客的URL(當然只用20條做測試,我把這個功能封裝了一個函數,方便我之後調用)
def getAllUrls(url): # url傳個人主頁,我的是 'https://blog.csdn.net/BBJG_001' r0 = requests.get(url) # 通過正則表達式去匹配 match = re.search(r'pageSize = (\d+).+\n.+listTotal = (\d+)', r0.text, flags=re.M) pageSize = match.group(1) # 每頁的數量 listTotal = match.group(2) # 總頁數 pageend = int(listTotal) // int(pageSize) + 1 # 博客列表的最終頁 urllist = [] for i in range(1, pageend + 1): # 依次訪問每一頁博客列表,從博文鏈接中獲取其url pageurl = url + '/article/list/' + str(i) res = requests.get(pageurl) soup = BeautifulSoup(res.text, 'html.parser') divs = soup.find_all(name='div', attrs={'class': 'article-item-box csdn-tracking-statistics'}) aas = [div.find('a') for div in divs] # 獲得包含文章鏈接的a標籤 urllist += [a.attrs.get('href') for a in aas] return urllist
執行該函數獲得所有博客的url
indexurl = 'https://blog.csdn.net/BBJG_001' urls = getAllUrls(indexurl)
-
通過串行的方式進行訪問
ts = time.time() res = [] for u in urls[:20]: res.append(requests.get(u)) # 爲了單純看效果,這裏就不在增加其他操作 print('串行耗時:', time.time()-ts) # 串行耗時: 7.231183767318726 # print(res[0].text) # 打印結果觀察
-
通過多進程進行操作
定義多進程要執行的函數,注意這個函數要定義在
if __name__ == '__main__'
的範圍之外def job(url): return requests.get(url)
多進程操作的執行部分,注意這部分必須在
if __name__ == '__main__'
的範圍下實現ts = time.time() pool = mp.Pool(5) multi_res = [pool.apply_async(job, (url,)) for url in urls[:20]] print('多進程耗時:', time.time() - ts) # 多進程耗時: 0.0679936408996582 # print(multi_res[0].get().text) # 打印結果觀察
-
相關文獻
我在 爬蟲:一個簡單的數據爬取統計實例 對於獲取所有url的函數做了比較詳細的解讀
有興趣的朋友可以參考 分類目錄——多線程 進行多線程數據爬取的實現