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

版权声明:版权所有:公众号:学习python的正确姿势,网站:https://fxxkpython.com https://blog.csdn.net/weixin_42469142/article/details/89873292

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

 

在 python 中

 

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

 

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

 

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

 

特别是对于多核的 CPU 来说

 

如果想要充分利用 CPU 

 

还是用多进程

 

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

 

提高了爬取的效率

 

640?wx_fmt.gif

 

那么,怎么玩多进程呢

 

 

接下来就是

 

学习 python 的正确姿势

 

640?wx_fmt.gif

 

 

可以使用 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部电影慢慢看

 

那会我们还不知道啥是多进程

 

你先去运行一下

 

记录一下运行时间

 

640?wx_fmt.jpeg

 

接着

 

我们对这个代码修改一下

 

让它具备多进程

 

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
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

 

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

 

这样对比会更加明显一些

 

快去试一下吧

 

640?wx_fmt.gif

 

往期文章

 

python爬虫15 | 害羞,用多线程秒爬那些万恶的妹纸们,纸巾呢?

 

python爬虫14 | 就这么说吧,如果你不懂多线程和线程池,那就去河边摸鱼!

 

python爬虫13 | 秒爬,这多线程爬取速度也太猛了,这次就是要让你的爬虫效率杠杠的

 

 

640?wx_fmt.gif

扫一扫

学习 Python 没烦恼

 

640.jpg

 

 

      点个好看啊~~(破音)

640?wx_fmt.gif

 

猜你喜欢

转载自blog.csdn.net/weixin_42469142/article/details/89873292