爬虫高性能相关


高性能相关

如何实现多个任务的同时进行 而且还效率高

串行实现

效率最低最不可取

import requests

urls = [
    'http://www.baidu.com/',
    'https://www.cnblogs.com/',
    'https://www.cnblogs.com/news/',
    'https://cn.bing.com/',
    'https://stackoverflow.com/',
]

for url in urls:
    response = requests.get(url)
    print(response)

多线程

多线程存在线程利用率不高的问题

import requests
import threading


urls = [
    'http://www.baidu.com/',
    'https://www.cnblogs.com/',
    'https://www.cnblogs.com/news/',
    'https://cn.bing.com/',
    'https://stackoverflow.com/',
]

def task(url):
    response = requests.get(url)
    print(response)

for url in urls:
    t = threading.Thread(target=task,args=(url,))
    t.start()

协程+IO切换

gevent内部调用greenlet(实现了协程)

基于协程比线程更加省资源

from gevent import monkey; monkey.patch_all()
import gevent
import requests


def func(url):
    response = requests.get(url)
    print(response)

urls = [
    'http://www.baidu.com/',
    'https://www.cnblogs.com/',
    'https://www.cnblogs.com/news/',
    'https://cn.bing.com/',
    'https://stackoverflow.com/',
]
spawn_list = []    
for url in urls:
    spawn_list.append(gevent.spawn(func, url))    # 创建协程 

gevent.joinall(spawn_list)

事件循环

基于事件循环的异步非阻塞模块:Twisted

from twisted.web.client import getPage, defer
from twisted.internet import reactor

def stop_loop(arg):
    reactor.stop()


def get_response(contents):
    print(contents)

deferred_list = []

url_list = [
    'http://www.baidu.com/',
    'https://www.cnblogs.com/',
    'https://www.cnblogs.com/news/',
    'https://cn.bing.com/',
    'https://stackoverflow.com/',
]

for url in url_list:
    deferred = getPage(bytes(url, encoding='utf8')) # 拿到了要爬取的任务,并没有真正的执行爬虫
    deferred.addCallback(get_response)    # 要调用的回调函数 
    deferred_list.append(deferred) # 将所有的任务加入带一个列表里面


dlist = defer.DeferredList(deferred_list)    # 检测所有的任务是否都被循环
dlist.addBoth(stop_loop)    # 如果列表中的任务都完成了就停止循环,执行停止的函数 

reactor.run()

优质内容筛选与推荐>>
1、854858776777
2、基于vue的图片查看插件vue-photo-preview
3、Repository模式
4、Mysql Limit操作
5、信息系统开发平台OpenExpressApp - 学习必备知识


长按二维码向我转账

受苹果公司新规定影响,微信 iOS 版的赞赏功能被关闭,可通过二维码转账支持公众号。

    阅读
    好看
    已推荐到看一看
    你的朋友可以在“发现”-“看一看”看到你认为好看的文章。
    已取消,“好看”想法已同步删除
    已推荐到看一看 和朋友分享想法
    最多200字,当前共 发送

    已发送

    朋友将在看一看看到

    确定
    分享你的想法...
    取消

    分享想法到看一看

    确定
    最多200字,当前共

    发送中

    网络异常,请稍后重试

    微信扫一扫
    关注该公众号





    联系我们

    欢迎来到TinyMind。

    关于TinyMind的内容或商务合作、网站建议,举报不良信息等均可联系我们。

    TinyMind客服邮箱:support@tinymind.net.cn