一 背景知识

    爬虫的本质就是一个socket客户端与服务端的通信过程,如果我们有多个url待爬取,采用串行的方式执行,只能等待爬取一个结束后才能继续下一个,效率会非常低。

需要强调的是:串行并不意味着低效,如果串行的都是纯计算的任务,那么cpu的利用率仍然会很高,之所以爬虫程序的串行低效,是因为爬虫程序是明显的IO密集型程序。

关于IO模型详见链接:http://www.cnblogs.com/linhaifeng/articles/7454717.html

    那么该如何提高爬取性能呢?

二 同步、异步、回调机制

1、同步调用:即提交一个任务后就在原地等待任务结束,等到拿到任务的结果后再继续下一行代码,效率低下

import requests

def get_page(url):
    response=requests.get(url)
    if response.status_code == 200:
        return response.text


urls=['https://www.baidu.com/','http://www.sina.com.cn/','https://www.python.org']
for url in urls:
    res=get_page(url) #调用一个任务,就在原地等待任务结束拿到结果后才继续往后执行
    print(len(res))
同步调用

2、一个简单的解决方案:多线程或多进程

#在服务器端使用多线程(或多进程)。多线程(或多进程)的目的是让每个连接都拥有独立的线程(或进程),这样任何一个连接的阻塞都不会影响其他的连接。
from multiprocessing import Process
from threading import Thread
import requests

def get_page(url):
    response=requests.get(url)
    if response.status_code == 200:
        return response.text


if __name__ == '__main__':
    urls=['https://www.baidu.com/','http://www.sina.com.cn/','https://www.python.org']
    for url in urls:
        p=Process(target=get_page,args=(url,))
        p.start()
        # t=Thread(target=get_page,args=(url,))
        # t.start()
多进程或多线程

相关文章:

  • 2021-06-11
  • 2021-11-16
  • 2021-09-23
猜你喜欢
  • 2022-01-18
  • 2021-11-20
  • 2021-11-23
  • 2021-04-13
  • 2021-09-23
相关资源
相似解决方案