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
你还可以去爬取数据量大一些的数据
这样对比会更加明显一些
快去试一下吧

赞 (0)
