(非同期クローラー)リクエストとaiohttpでのプロキシIPの使用

(非同期クローラー)リクエストとaiohttpでのプロキシIPの使用


クローラーがうまくクロールしたい場合は、IPプロキシが不可欠です。現在、Webサイトには基本的にいくつかのクロール防止対策があります。アクセス速度がわずかに速い場合は、IPがブロックされていることがわかります。それ以外の場合は、検証のために送信されます。プロキシIPの使用について説明するために一般的に使用される2つのモジュールを次に示します。言うことはあまりありませんが、始めてください。

ここに画像の説明を挿入

リクエストでのプロキシIPの使用:リクエストでプロキシIPを使用するには、プロキシパラメータを追加するだけです。プロキシのパラメータ値はディクショナリ、キーはプロキシプロトコル(http / https)、値は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のキー値(http / https)はURLと一致している必要があります。一致していない場合、ローカルIPを使用して直接アクセスされます。

aiohttpでのプロキシIPの使用:
requestsモジュールは非同期をサポートしていないため、aiohttpは強制的に使用され、多くのピットが削除されます。
その使用法はリクエストに似ています。また、get()メソッドにパラメーターを追加しますが、この時点では、パラメーター名はプロキシであり、パラメーター値は文字列であり、文字列内のプロキシプロトコルは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')

ここに画像の説明を挿入
エラー訂正プロセスは少し長いですが、幸いなことに、私はそれを使用する方法を知っています。

最後に、美しい絵、さゆならが見えます〜
ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/qq_43965708/article/details/109622238