爬虫: 多进程分布式数据爬取

原文地址

分类目录——爬虫

多进程的使用可以参见 分类目录——多进程 ,这里就直接操作不在进行过多的说明

这里以 把我的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的函数做了比较详细的解读

    分类目录——多进程

    有兴趣的朋友可以参考 分类目录——多线程 进行多线程数据爬取的实现

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