最近试着爬小说...突然发现用requests效率不尽人意,查阅了一番,发现了还有aiohttp的存在,不过需要3.5.3以上的版本才能装...
看了下写的demo,10+MB的小说爬取内容仅需大约30s。在本地试了下代码...发现那个网站已经没了...自己试了下效率的确比差很多,但是远不及那个demo中30s爬取百万字数...
大致代码如下...也不是很熟悉,可能有点问题- -
# -*- coding: utf-8 -*-
import requests
import asyncio
import aiohttp
import time
from bs4 import BeautifulSoup
header = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:34.0) Gecko/20100101 Firefox/34.0'}
base_url = 'http://www.xbiquge.la'
test_url = 'http://www.xbiquge.la/13/13959/'
def test_1():
res = requests.get( test_url,headers = header )
res.encoding = 'utf8'
text = res.text
soup = BeautifulSoup(text,'lxml')
dd_list = soup.find_all('dd')
for dd in dd_list[:100]:
url = dd.find('a').get('href')
res = requests.get( base_url+url,headers=header )
async def test_2():
async with aiohttp.ClientSession() as session:
async with session.get(test_url,headers=header) as res:
res.encoding = 'utf8'
text = await res.text()
soup = BeautifulSoup(text,'lxml')
dd_list = soup.find_all('dd')
for dd in dd_list[:100]:
url = dd.find('a').get('href')
res = await session.get( base_url+url,headers=header )
if __name__ == '__main__':
start = time.time()
test_1()
end = time.time()
print('requests所需时间', end - start )
start1 = time.time()
loop = asyncio.get_event_loop()
loop.run_until_complete( test_2() )
end1 = time.time()
print('aiohttp所需时间', end1 - start1 )
10个章节的所需时间
requests所需时间 5.313061952590942
aiohttp所需时间 3.9156949520111084
50个章节的所需时间
requests所需时间 22.11073350906372
aiohttp所需时间 11.036090612411499
80个章节的所需时间
requests所需时间 37.615445375442505
aiohttp所需时间 19.95256543159485
100个章节的所需时间
requests所需时间 48.59591746330261
aiohttp所需时间 25.8391056060791
这结果貌似跟我想象的和之前测别的的结果有点偏差...不过效率的差距很明显。