python3非同步爬蟲 ——aiohttp模板使用
阿新 • • 發佈:2020-10-16
一.簡單使用和講解
import aiohttp import asyncio async def fetch(client): async with client.get('http://httpbin.org/get') as resp: assert resp.status == 200 return await resp.text() async def main(): async with aiohttp.ClientSession() as client: html = await fetch(client) print(html) loop = asyncio.get_event_loop() #返回一個事件迴圈物件,是asyncio.Baseeventloop的例項 for i in range(30): task = loop.create_task(main()) #新增任務 loop.run_until_complete(main()) #執行直至main()執行完
二.asyncio模組(事件相關)
Column | Column |
---|---|
Asyncio.get_event_loop() | 返回一個事件迴圈物件,是asyncio.Baseeventloop的例項 |
Abstracteventloop.stop() | 停止執行事件迴圈 |
Abstracteventloop.run_forever() | 一直執行直到stop() |
Abstracteventloop.run_until_complete(func()) | 執行直至func物件執行完 |
Abstracteventloop.close() | 關閉事件迴圈 |
Abstracteventloop.is_running() | 返回事件迴圈的是否執行 |
Abstracteventloop.create_task(func()) | 新增事件 |
三.asyncio模組回撥(部分程式碼)
loop = asyncio.get_event_loop() #返回一個事件迴圈物件,是asyncio.Baseeventloop的例項
task = loop.create_task(main())
task.add_done_callback(callback) #上面的mian方法的返回值為下面callback方法名所用方法的入參
四.aiohttp請求相關
1.發起請求
import aiohttp import asyncio async def request_get(url): async with aiohttp.ClientSession() as client: # 建立 async with client.get(url) as resp: assert resp.status == 200 # 如果狀態碼是200才往下走,不然拋異常 print( await resp.text()) loop = asyncio.get_event_loop() loop.run_until_complete(request_get("http://httpbin.org/get"))
2.新增請求頭,params,cookies,代理
和reuqest模組類似直接加就可以了
#設定代理
session.get("http://python.org",proxy="http://some.proxy.com")
3.自定義域名解析地址
#我們可以指定域名伺服器的 IP 對我們提供的get或post的url進行解析
from aiohttp.resolver import AsyncResolver
resolver = AsyncResolver(nameservers=["8.8.8.8", "8.8.4.4"])
conn = aiohttp.TCPConnector(resolver=resolver)
4.控制同時連線的數量(連線池)
async def func1():
cookies = {'my_cookie': "my_value"}
conn = aiohttp.TCPConnector(limit=2) #預設100,0表示無限
async with aiohttp.ClientSession(cookies=cookies,connector=conn) as session:
pass
五.aiohttp響應相關
1.獲取網站的響應狀態碼
resp.status
2.獲取網站的請求頭
resp.headers 來檢視響應頭,得到的值型別是一個dict
resp.raw_headers 檢視原生的響應頭,位元組型別
resp.history 檢視重定向的響應頭
3.獲取網站的響應內容
使用text()方法
使用json()方法 json格式
使用read()方法,不進行編碼,為位元組形式
r.content.read(10) 獲取二進位制流前10
注意:text(),read()方法是把整個響應體讀入記憶體,如果你是獲取大量的資料,請考慮使用”位元組流“(StreamResponse)