我正在使用一个相对千篇一律的代码从我用另一段代码抓取的几百个 url 异步请求 HTML。该代码完美运行。
不幸的是,由于大量请求,这导致我的 IP 被阻止。
我的想法是编写一些代码来获取一些代理 IP 地址,将它们放在一个列表中,并在发送请求时随机循环它们。假设我在创建此列表时没有问题,我在概念化如何将这些代理 IP 的随机轮换拼接到我的异步请求代码中时遇到了麻烦。到目前为止,这是我的代码。
async def download_file(url):
async with aiohttp.ClientSession() as session:
async with session.get(url) as resp:
content = await resp.read()
return content
async def write_file(n, content):
filename = f'sync_{n}.html'
with open(filename, 'wb') as f:
f.write(content)
async def scrape_task(n, url):
content = await download_file(url)
await write_file(n, content)
async def main():
tasks = []
for n, url in enumerate(open('links.txt').readlines()):
tasks.append(scrape_task(n,url))
await asyncio.wait(tasks)
if __name__ == '__main__':
asyncio.run(main())
我在想我需要说:
conn = aiohttp.TCPConnector(local_addr=(x, 0), loop=loop)
async with aiohttp.ClientSession(connector=conn) as session:
...
作为我的代码的第二行和第三行,其中 x 将是前面定义的列表中的随机 IP 地址之一。我该怎么做呢?我不确定将整个代码放在一个简单的同步循环中是否会破坏使用异步请求的目的。
如果有一个更简单的解决方案来解决因快速触发请求而被网站阻止的问题,那也将非常有帮助。请注意我对编码很陌生。