美文网首页爬虫
爬虫精进(十) ------ 多协程(爬虫军队)

爬虫精进(十) ------ 多协程(爬虫军队)

作者: 千喜Ya | 来源:发表于2019-07-26 21:10 被阅读0次

    要实现异步的爬虫方式的话,需要用到多协程。

    一.gevent库

    同步的爬虫方式爬取这8个网站 :

    import requests,time
    #导入requests和time
    start = time.time()
    #记录程序开始时间
    
    url_list = ['https://www.baidu.com/',
    'https://www.sina.com.cn/',
    'http://www.sohu.com/',
    'https://www.qq.com/',
    'https://www.163.com/',
    'http://www.iqiyi.com/',
    'https://www.tmall.com/',
    'http://www.ifeng.com/']
    #把8个网站封装成列表
    
    for url in url_list:
    #遍历url_list
        r = requests.get(url)
        #用requests.get()函数爬取网站
        print(url,r.status_code)
        #打印网址和抓取请求的状态码
    
    end = time.time()
    #记录程序结束时间
    print(end-start)
    #end-start是结束时间减去开始时间,就是最终所花时间。
    #最后,把时间打印出来。
    

    程序运行后,你会看到同步的爬虫方式,是依次爬取网站,并等待服务器响应(状态码为200表示正常响应)后,才爬取下一个网站。比如第一个先爬取了百度的网址,等服务器响应后,再去爬取新浪的网址,以此类推,直至全部爬取完毕。
    异步方式爬取 :

    from gevent import monkey
    monkey.patch_all()
    import gevent,time,requests
    
    start = time.time()
    
    url_list = ['https://www.baidu.com/',
    'https://www.sina.com.cn/',
    'http://www.sohu.com/',
    'https://www.qq.com/',
    'https://www.163.com/',
    'http://www.iqiyi.com/',
    'https://www.tmall.com/',
    'http://www.ifeng.com/']
    
    def crawler(url):
        r = requests.get(url)
        print(url,time.time()-start,r.status_code)
    
    tasks_list = []
    
    for url in url_list:
        task = gevent.spawn(crawler,url)
        tasks_list.append(task)
    gevent.joinall(tasks_list)
    end = time.time()
    print(end-start)
    

    通过每个请求运行的时间,我们能知道:爬虫用了异步的方式抓取了8个网站,因为每个请求完成的时间并不是按着顺序来的。比如在我测试运行这个代码的时候,最先爬取到的网站是搜狐,接着是凤凰,并不是百度和新浪。且每个请求完成时间之间的间隔都非常短,你可以看作这些请求几乎是“同时”发起的。通过对比同步和异步爬取最终所花的时间,用多协程异步的爬取方式,确实比同步的爬虫方式速度更快。


    二.queue模块(创建多个爬虫)

    当我们用多协程来爬虫,需要创建大量任务(假如我们要爬的不是8个网站,而是1000个网站,我们可以怎么做?)时,我们可以借助queue模块。
    queue翻译成中文是队列的意思。我们可以用queue模块来存储任务,让任务都变成一条整齐的队列,就像银行窗口的排号做法。因为queue其实是一种有序的数据结构,可以用来存取数据。

    from gevent import monkey
    monkey.patch_all()
    import gevent,time,requests
    from gevent.queue import Queue
    
    start = time.time()
    
    url_list = ['https://www.baidu.com/',
    'https://www.sina.com.cn/',
    'http://www.sohu.com/',
    'https://www.qq.com/',
    'https://www.163.com/',
    'http://www.iqiyi.com/',
    'https://www.tmall.com/',
    'http://www.ifeng.com/']
    
    work = Queue()
    for url in url_list:
        work.put_nowait(url)
    
    def crawler():
        while not work.empty():
            url = work.get_nowait()
            r = requests.get(url)
            print(url,work.qsize(),r.status_code)
    
    tasks_list  = [ ]
    
    for x in range(2):
        task = gevent.spawn(crawler)
        tasks_list.append(task)
    gevent.joinall(tasks_list)
    
    end = time.time()
    print(end-start)
    

    时至今日,我们电脑一般都会是多核CPU。多协程,其实只占用了CPU的一个核运行,没有充分利用到其他核。利用CPU的多个核同时执行任务的技术,我们把它叫做“多进程”。
    有机会可以进阶学习

    相关文章

      网友评论

        本文标题:爬虫精进(十) ------ 多协程(爬虫军队)

        本文链接:https://www.haomeiwen.com/subject/zvkjrctx.html