目的:
在爬虫中使用异步实现高性能的数据爬取操作。
异步爬虫的方式:
1、多线程,多进程(不建议):
好处:可以为相关阻塞的操作单独开启线程,阻塞操作就可以异步执行。
弊端:无法无限制的开启多线程或者多进程。
2、线程池、进程池(适当的使用):
好处:可以降低系统对进程或者线程创建和销毁的一个频率,从而很好的降低系统的开销。
弊端:池中线程或进程的数量是有上限。
原则:线程池处理的是阻塞且耗时的操作。
不加线程池的操作:
# coding:utf-8
import requests
import time
headers = {
"User-Agent": "Mozilla/5.0(Windows NT 6.1;WOW64) AppleWebKit/537.36(KABUL, like Gecko) "
"Chrome/86.0.4240.198Safari/537.36 "
}
urls = [
'https://mirrors.tuna.tsinghua.edu.cn/apache/accumulo/1.10.2/accumulo-1.10.2-bin.tar.gz',
'https://mirrors.tuna.tsinghua.edu.cn/apache/accumulo/2.1.0/accumulo-2.1.0-bin.tar.gz',
'https://mirrors.tuna.tsinghua.edu.cn/apache/activemq/5.16.5/apache-activemq-5.16.5-bin.zip'
]
def get_content(url):
print("正在获取:", url)
# get方法是一个阻塞的方法
resp = requests.get(url, headers=headers)
if resp.status_code == 200:
return resp.content
def parse_content(content):
print("响应数据的长度为:", len(content))
start_time = time.time()
for url in urls:
content = get_content(url)
parse_content(content)
end_time = time.time()
print('%d second'% (end_time-start_time))
增加线程池的操作:
# coding:utf-8
# coding:utf-8
import requests
import time
from multiprocessing.dummy import Pool
headers = {
"User-Agent": "Mozilla/5.0(Windows NT 6.1;WOW64) AppleWebKit/537.36(KABUL, like Gecko) "
"Chrome/86.0.4240.198Safari/537.36 "
}
urls = [
'https://mirrors.tuna.tsinghua.edu.cn/apache/accumulo/1.10.2/accumulo-1.10.2-bin.tar.gz',
'https://mirrors.tuna.tsinghua.edu.cn/apache/accumulo/2.1.0/accumulo-2.1.0-bin.tar.gz',
'https://mirrors.tuna.tsinghua.edu.cn/apache/activemq/5.16.5/apache-activemq-5.16.5-bin.zip'
]
def get_content(url):
print("正在获取:", url)
# get方法是一个阻塞的方法
resp = requests.get(url, headers=headers)
if resp.status_code == 200:
return resp.content
def parse_content(content):
print("响应数据的长度为:", len(content))
start_time = time.time()
# 实例化一个线程池对象
pool = Pool(3)
# 将列表中的每一个列表元素传递给get_content中进行处理。
pool.map(get_content, urls)
end_time = time.time()
print('%d second'% (end_time-start_time))
pool.close()
pool.join()
线程池的应用:
from multiprocessing.dummy import Pool
urls = [
'https://mirrors.tuna.tsinghua.edu.cn/apache/accumulo/1.10.2/accumulo-1.10.2-bin.tar.gz',
'https://mirrors.tuna.tsinghua.edu.cn/apache/accumulo/2.1.0/accumulo-2.1.0-bin.tar.gz',
'https://mirrors.tuna.tsinghua.edu.cn/apache/activemq/5.16.5/apache-activemq-5.16.5-bin.zip'
]
start_time = time.time()
# 实例化一个线程池对象
pool = Pool(3)
# 将列表中的每一个列表元素传递给get_content中进行处理。
pool.map(get_content, urls)
end_time = time.time()
print('%d second'% (end_time-start_time))
pool.close()
pool.join()