首頁 > 軟體

Python非同步爬蟲requests和aiohttp中代理IP的使用

2022-03-02 10:00:04

爬蟲要想爬的好,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)

注意: peoxieskey值(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內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com