欢迎访问我的网站与公众号!点击与扫码即可进入,谢谢关注!

高性能异步爬虫

目的: 在爬虫中使用异步实现高性能的数据爬取

普通请求(单线程串行方式执行)

循环请求会堵塞后一个请求

1
2
3
4
5
urls = ['http://xxxx.rar','http://xxxx.rar','http://xxxx.rar']
# 单线程请求爬取
for url in urls:
content = get_content(url)
parse_content(content)

异步

一个进程有个多个线程

  1. 多线程,多进程(不推荐)

    • 好处: 可以为相关堵塞的操作单独开启线程/进程,阻塞操作就可以异步执行
    • 弊端: 无法无限的开启多线程/多进程
  2. 线程池/进程池(适当使用)

    • 好处: 可以降低系统对进程/线程创建和销毁的频率,从而很好降低系统开销
    • 弊端: 池中进程/线程数量也有上限
  3. 单线程+异步协程(推荐):
    python3.4以上才有的

    1. event_loop: 事件循环
      • 相当于一个无限循环,可以把一些函数注册到这个循环上,当满足某种条件,函数就会被循环执行
    2. coroutine: 协程对象
      • 可以将携程对象注册到事件循环中,他会被事件循环调用,可以使用async关键字来定义一个方法,这个方法在调用时不会被立即执行,而是返回一个协程对象
    3. task: 任务
      • 它是对协程对象的进一步封装,包含了任务的各个状态
    4. future:
      • 代表将来执行或还没有执行的任务,实际上和task没有本质区别
    5. async:
      • 定义一个协程
        6: await:
      • 用来挂起阻塞方法的执行