打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
python爬虫16 | 你,快去试试用多进程的方式重新去爬取豆瓣上的电影

我们在之前的文章谈到了高效爬虫

在 python 中

多线程下的 GIL 锁会让多线程显得有点鸡肋

特别是在 CPU 密集型的代码下

多线程被 GIL 锁搞得效率不高

特别是对于多核的 CPU 来说

如果想要充分利用 CPU 

还是用多进程

这样我们就可以做到并行爬取

提高了爬取的效率

那么,怎么玩多进程呢

接下来就是

学习 python 的正确姿势

可以使用 multiprocessing 来实现多进程

使用起来也是很简单的

比如我们使用 Process 这个类来创建进程

from multiprocessing import Process
def f(name): print('hello', name)
if __name__ == '__main__': p = Process(target=f, args=('xiaoshuaib',)) p.start() p.join()

还可以使用进程池的方式

from multiprocessing import Pool
def f(x): return x*x
if __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

你还可以去爬取数据量大一些的数据

这样对比会更加明显一些

快去试一下吧

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
Python多进程写入同一文件
Python多线程鸡年不鸡肋
Python多进程并发(multiprocessing) | 四号程序员
Python的多进程并行计算库与多进程爬虫
Python中的并发
抓取速度提升 3 倍!Python 的这个内置库你用上了吗?
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服