zoukankan      html  css  js  c++  java
  • 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

     

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

     

    这样对比会更加明显一些

     

    快去试一下吧

     

     

    往期文章

     

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

     

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

     

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

     

     

    扫一扫

    学习 Python 没烦恼

     

     

     

          点个好看啊~~(破音)

     

  • 相关阅读:
    操作系统 chapter3 进程线程模型
    操作系统 chapter1 操作系统概述
    操作系统 chapter2 操作系统运行环境
    计算机网络 chapter 9 无线网络
    计算机网络 chapter 10 下一代因特网
    计算机网络 chapter 8 因特网上的音频/视频服务
    汇总常用的jQuery操作Table tr td方法
    jquery判断checkbox是否选中及改变checkbox状态
    $.ajax()方法详解
    wamp设置mysql默认编码
  • 原文地址:https://www.cnblogs.com/fxxkpython/p/10832230.html
Copyright © 2011-2022 走看看