多进程的使用可以参见 分类目录——多进程 ,这里就直接操作不在进行过多的说明
这里以 把我的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的函数做了比较详细的解读
有兴趣的朋友可以参考 分类目录——多线程 进行多线程数据爬取的实现