我们上次爬取了斗破苍穹全文小说,并保存到本地TXT文件,但是下载速度超级慢(不排除我这垃圾i5电脑的原因),我都玩了一盘王者荣耀,还没有下载完成。j究其原因是我们只是应用了单进程爬取,所以爬取速度大打折扣。鉴于此我们本节介绍多进程爬虫。
首先简单介绍一下多进程。通常我们的计算机在运行程序时,他会自己创建一个包含代码和状态的进程。这些进程会通过计算机的一个或者多个CPU执行,不过同一时刻一个CPU只能执行一个进程,但是不同的进程可以在同一条时间线上来回切换,由于计算机超高的运行速度,给我们的感觉就是他在执行多个程序。同理,同一个进程里的不同线程之间也是如此。
首先来介绍多进程的使用方法
from multiprocessing import Pool
pool = Pool(processes = 4)
pool.map(func, urls)
首先要导入需要使用的库;第二行用于创建进程池,processes参数设置进程的个数;第三行利用map()函数运行进程,func参数是需要调用的def模块,urls为可迭代的URL列表。
下面为主程序
import requests
import re
from multiprocessing import Pool
def Solution(url):
'''
爬取网页的函数,将爬取到的数据,存储到TXT文档
:param url: 传入的url
:return: 无返回值
'''
res = requests.get(url)
name_list = re.findall('<h2>(.*?)</h2>',res.text,re.S)
content_list = re.findall('<span>(.*?)</span>',res.text,re.S)
for name, content in zip(name_list, content_list):
return [name.strip(),' ',content.strip(),'\n']
if __name__ == "__main__":
urls = ['https://www.qiushibaike.com/text/page/{}/'.format(str(i)) for i in range(1,25)]
pool = Pool(processes=4)
with open('F:/exercise/多进程测试.txt', 'a') as f:
for i in pool.map(Solution, urls):
f.write(str(i))
1.首先导入需要用到的库
2.创建一个def,利用requests获取网页信息,利用正则表达式获取用户姓名,发表文章内容,再利用for循环,以列表形式返回我们获取到的内容
3.主函数:创建可迭代的url列表。创建进程池,数量为四个。
3.1利用 with 创建一个对话。在这个对话里面,以追加 ‘ a ’ 的方式利用for循环将Solution函数返回的内容写入TXT文件。如果利用的是 ‘w' 模式,那么每次新写入的内容都会覆盖原先的内容,而追加 ’a' 则是在后面追加需要添加的内容。
你可以更换为‘w’ 模式试一下
--------------------------------------分割线------------------------------------------------------
关于python多进程的相关知识请参考为另一篇博文python 多进程