Python異步爬蟲requests和aiohttp中代理IP的使用
爬蟲要想爬的好,IP代理少不瞭。。現在網站基本都有些反爬措施,訪問速度稍微快點,就會發現IP被封,不然就是提交驗證。下面就兩種常用的模塊來講一下代理IP的使用方式。話不多說,直接開始。
requests中代理IP的使用:
requests
中使用代理IP隻需要添加一個proxies
參數即可。proxies
的參數值是一個字典,key
是代理協議(http/https),value
就是ip和端口號,具體格式如下。
try: response = requests.get('https://httpbin.org/ip', headers=headers, proxies={'https':'https://221.122.91.74:9401'}, timeout=6) print('success') # 檢測代理IP是否使用成功 # 第一種方式,返回發送請求的IP地址,使用時要在 get() 添加 stream = True # print(response.raw._connection.sock.getpeername()[0]) # 第二種方式,直接返回測試網站的響應數據的內容 print(response.text) except Exception as e: print('error',e)
註意: peoxies
的key
值(http/https
)要和url
一致,不然會直接使用本機IP直接訪問。
aiohttp中代理IP的使用:
由於requests
模塊不支持異步,迫不得已使用aiohttp
,掉瞭不少坑。
它的使用方式和requests
相似,也是在get()
方法中添加一個參數,但此時的參數名為proxy
,參數值是字符串,且字符串中的代理協議,隻支持http
,寫成https
會報錯。
這裡記錄一下我的糾錯歷程。。
首先根據網上的使用方式,我先試瞭一下下面的代碼。
async def func(): async with aiohttp.ClientSession() as session: try: async with session.get("https://httpbin.org/ip", headers=headers, proxy='http://183.220.145.3:80', timeout=6) as response: page_text = await response.text() print('success') print(page_text) except Exception as e: print(e) print('error') if __name__=='__main__': asyncio.run(func())
修改後,再來
async def func(): con = aiohttp.TCPConnector(verify_ssl=False) async with aiohttp.ClientSession(connector=aiohttp.TCPConnector(verify_ssl=False)) as session: try: async with session.get("https://httpbin.org/ip", headers=headers, proxy='http://183.220.145.3:80', timeout=6) as response: # print(response.raw._connection.sock.getpeername()[0]) page_text = await response.text() print(page_text) print('success') except Exception as e: print(e) print('error')
非但沒有解決反倒多瞭一個警告,好在改一下就好。額~懶得粘瞭,直接來最終版本吧。。
# 修改事件循環的策略,不能放在協程函數內部,這條語句要先執行 asyncio.set_event_loop_policy(asyncio.WindowsSelectorEventLoopPolicy()) async def func(): # 添加trust_env=True async with aiohttp.ClientSession(connector=aiohttp.TCPConnector(ssl=False), trust_env=True) as session: try: async with session.get("https://httpbin.org/ip", headers=headers, proxy='http://183.220.145.3:80', timeout=10) as response: page_text = await response.text() print(page_text) print('success') except Exception as e: print(e) print('error')
雖然糾錯過程有點長,但好在知道怎麼用瞭。
到此這篇關於Python異步爬蟲requests和aiohttp中代理IP的使用的文章就介紹到這瞭,更多相關requests和aiohttp中代理IP內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- Python Http發送請求淺析
- Python使用signal定時結束AsyncIOScheduler任務的問題
- Python爬蟲之requests庫基本介紹
- 淺談Python協程asyncio
- 熱門問題python爬蟲的效率如何提高