(非同期クローラー)リクエストと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')
エラー訂正プロセスは少し長いですが、幸いなことに、私はそれを使用する方法を知っています。
最後に、美しい絵、さゆならが見えます〜