我们在之前的文章谈到了高效爬虫
在 python 中
多线程下的 GIL 锁会让多线程显得有点鸡肋
特别是在 CPU 密集型的代码下
多线程被 GIL 锁搞得效率不高
特别是对于多核的 CPU 来说
如果想要充分利用 CPU
还是用多进程吧
这样我们就可以做到并行爬取
提高了爬取的效率

那么,怎么玩多进程呢
恩
接下来就是

可以使用 multiprocessing 来实现多进程
使用起来也是很简单的
比如我们使用 Process 这个类来创建进程
from multiprocessing import Processdef f(name):print('hello', name)if __name__ == '__main__':p = Process(target=f, args=('xiaoshuaib',))p.start()p.join()
还可以使用进程池的方式
from multiprocessing import Pooldef f(x):return x*xif __name__ == '__main__':with Pool(5) as p:print(p.map(f, [1, 2, 3]))
还记得我们之前爬取过 250 部电影么
python爬虫08 | 你的第二个爬虫,要过年了,爬取豆瓣最受欢迎的250部电影慢慢看
那会我们还不知道啥是多进程
你先去运行一下
记录一下运行时间

接着
我们对这个代码修改一下
让它具备多进程
def main(url):html = request_douban(url)soup = BeautifulSoup(html, 'lxml')save_content(soup)if __name__ == '__main__':start = time.time()urls = []pool = multiprocessing.Pool(multiprocessing.cpu_count())for i in range(0, 10):url = 'https://movie.douban.com/top250?start=' + str(i * 25) + '&filter='urls.append(url)pool.map(main, urls)pool.close()pool.join()
简单解释一下代码
在这里
我们根据电脑 CPU 的内核数量
创建相应的进程池
pool = multiprocessing.Pool(multiprocessing.cpu_count())我们的进程数不需要大于内核数
因为进程数创建得再多反而没什么好处
通过 map 方法去执行我们的主函数
将我们获得的 url 传过去
pool.map(main, urls)然后我们调用了进程池的 close 方法
让它不再创建进程
pool.close()我们调用了 join 方法
pool.join()为的是让进程池的进程执行完毕再结束
ok
你再运行一下
再记录一下运行时间
对比一下
你会发现速度翻了好几番了
当然
这取决于你电脑的 CPU
你还可以去爬取数据量大一些的数据
这样对比会更加明显一些
快去试一下吧

往期文章
python爬虫15 | 害羞,用多线程秒爬那些万恶的妹纸们,纸巾呢?
python爬虫14 | 就这么说吧,如果你不懂多线程和线程池,那就去河边摸鱼!
python爬虫13 | 秒爬,这多线程爬取速度也太猛了,这次就是要让你的爬虫效率杠杠的

扫一扫
学习 Python 没烦恼
点个好看啊~~(破音)
