Python3爬虫(十二) 爬虫性能

 Infi-chu:

http://www.cnblogs.com/Infi-chu/

一、简单的循环串行
一个一个循环,耗时是最长的,是所有的时间综合

1
2
3
4
5
6
7
8
9
10
import requests
url_list = [
    'http://www.baidu.com',
    'http://www.pythonsite.com',
    'http://www.cnblogs.com/'
]
 
for url in url_list:
    result = requests.get(url)
    print(result.text)

二、通过线程池
整体耗时是所有连接里耗时最久的那个,相对于循环来说快了不少

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import requests
from concurrent.futures import ThreadPoolExecutor
 
def fetch_request(url):
    result = requests.get(url)
    print(result.text)
 
url_list = [
    'http://www.baidu.com',
    'http://www.bing.com',
    'http://www.cnblogs.com/'
]
pool = ThreadPoolExecutor(10)
 
for url in url_list:
    #去线程池中获取一个线程,线程去执行fetch_request方法
    pool.submit(fetch_request,url)
 
pool.shutdown(True)

三、线程池+回调函数
定义了一个回调函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
from concurrent.futures import ThreadPoolExecutor
import requests
 
 
def fetch_async(url):
    response = requests.get(url)
 
    return response
 
 
def callback(future):
    print(future.result().text)
 
 
url_list = [
    'http://www.baidu.com',
    'http://www.bing.com',
    'http://www.cnblogs.com/'
]
 
pool = ThreadPoolExecutor(5)
 
for url in url_list:
    v = pool.submit(fetch_async,url)
    #这里调用回调函数
    v.add_done_callback(callback)
 
pool.shutdown()

四、通过进程池
进程池的方式访问,同样的也是取决于耗时最长的,但是相对于线程来说,进程需要耗费更多的资源,同时这里是访问url时IO操作,所以这里线程池比进程池更好

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import requests
from concurrent.futures import ProcessPoolExecutor
 
def fetch_request(url):
    result = requests.get(url)
    print(result.text)
 
url_list = [
    'http://www.baidu.com',
    'http://www.bing.com',
    'http://www.cnblogs.com/'
]
pool = ProcessPoolExecutor(10)
 
for url in url_list:
    #去进程池中获取一个线程,子进程程去执行fetch_request方法
    pool.submit(fetch_request,url)
 
pool.shutdown(True)

五、进程池+回调函数
这种方式和线程+回调函数的效果是一样的,相对来说开进程比开线程浪费资源

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
from concurrent.futures import ProcessPoolExecutor
import requests
 
 
def fetch_async(url):
    response = requests.get(url)
 
    return response
 
 
def callback(future):
    print(future.result().text)
 
 
url_list = [
    'http://www.baidu.com',
    'http://www.bing.com',
    'http://www.cnblogs.com/'
]
 
pool = ProcessPoolExecutor(5)
 
for url in url_list:
    v = pool.submit(fetch_async, url)
    # 这里调用回调函数
    v.add_done_callback(callback)
 
pool.shutdown()

 

posted @   Infi_chu  阅读(660)  评论(0编辑  收藏  举报
编辑推荐:
· 软件产品开发中常见的10个问题及处理方法
· .NET 原生驾驭 AI 新基建实战系列:向量数据库的应用与畅想
· 从问题排查到源码分析:ActiveMQ消费端频繁日志刷屏的秘密
· 一次Java后端服务间歇性响应慢的问题排查记录
· dotnet 源代码生成器分析器入门
阅读排行:
· ThreeJs-16智慧城市项目(重磅以及未来发展ai)
· .NET 原生驾驭 AI 新基建实战系列(一):向量数据库的应用与畅想
· Ai满嘴顺口溜,想考研?浪费我几个小时
· Browser-use 详细介绍&使用文档
· 软件产品开发中常见的10个问题及处理方法
点击右上角即可分享
微信分享提示