第十章 aiohttp:加速加速

在這裏插入圖片描述

簡介

asyncio實現了TCP、UDP、SSL等協議,aiohttp則是基於asyncio實現的異步請求HTTP框架。可以用於爬蟲三部曲的第一步,替換之前的requests請求,進行請求加速,後邊解析存儲還是不變。

中文文檔地址: https://www.cntofu.com/book/127/index.html

安裝

pip install aiohttp

但是使用清華源更快:
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple requests

知識

這個庫,基本上就是requests的異步版,語法使用方式,幾乎一樣。

Session機制

和requests的session類似。

aiohttp.ClientSession. 首先要建立一個session對象,然後用該session對象去打開網頁。

import asyncio
import aiohttp
from aiohttp import ClientSession,ClientResponse
import time
import requests

# aiohttp實現
async def print_page():
    async with aiohttp.ClientSession() as session:
        async with session.get("http://www.baidu.com") as resp:
            print(resp.status)
            body = await resp.read()
            print("響應內容長度:",len(body))

startTime = time.time()
loop = asyncio.get_event_loop()
tasks = asyncio.wait([print_page() for i in range(100)])
loop.run_until_complete(tasks)
endTime = time.time()
print("aiohttp庫請求百度首頁消耗時間:",endTime - startTime)

這裏順便也記錄了一下消耗的時間,大家可以通過簡單的requests的代碼,直觀的比較aiohttp和requests的區別

# requests實現
startTime = time.time()
for i in range(100):
    response = requests.get("http://www.baidu.com")
    print(response.status_code,len(response.content))
endTime = time.time()
print("requests庫請求百度首頁消耗時間:",endTime - startTime)

雖然結果會受到各種各樣的因素影響,尤其是網絡因素,但是明顯aiohttp還是完勝的。

添加請求頭

這個比較簡單,將headers放於session.get/post的選項中即可。注意headers數據要是dict格式。

import asyncio
import aiohttp

# aiohttp實現
async def print_page():
    headers = {
        "User-Agent":"my test UA"
    }
    async with aiohttp.ClientSession() as session:
        async with session.get("http://127.0.0.1:5000/",headers=headers) as resp:
            print(resp.status)
            body = await resp.read()
            print("響應內容長度:",len(body))
            print(body.decode())

loop = asyncio.get_event_loop()
loop.run_until_complete(print_page())
loop.close()

添加Cookie

import asyncio
import aiohttp

# aiohttp實現
async def print_page():
    cookies = {
        "keyA": "valueA",
        "keyB": "valueB",
        "keyC": "valueC",
    }
    async with aiohttp.ClientSession() as session:
        async with session.get("http://127.0.0.1:5000/Cookie",cookies = cookies) as resp:
            print(resp.status)
            body = await resp.read()
            print("響應內容長度:",len(body))
            print(body.decode())

loop = asyncio.get_event_loop()
loop.run_until_complete(print_page())
loop.close()

添加代理

import asyncio
import aiohttp

# aiohttp實現
async def print_page():
    headers = {
        "User-Agent":"my test UA"
    }
    async with aiohttp.ClientSession() as session:
        async with session.get("http://ip.27399.com/",proxy="http://47.95.249.140:8118") as resp:
            print(resp.status)
            body = await resp.read()
            print("響應內容長度:",len(body))
            print(body.decode())

loop = asyncio.get_event_loop()
loop.run_until_complete(print_page())
loop.close()

任務

可以拿之前的一些練習,測試對比一下requests與aiohttp的差別

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章