爬蟲: 多進程分佈式數據爬取

原文地址

分類目錄——爬蟲

多進程的使用可以參見 分類目錄——多進程 ,這裏就直接操作不在進行過多的說明

這裏以 把我的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的函數做了比較詳細的解讀

    分類目錄——多進程

    有興趣的朋友可以參考 分類目錄——多線程 進行多線程數據爬取的實現

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章