Python 协程多进程并发访问 URL - 高效爬取网页数据
下面是一个使用协程和多进程并发访问 URL 的示例程序,通过限制并发请求数,可以有效提高网页爬取效率:
import asyncio
import aiohttp
from concurrent.futures import ThreadPoolExecutor, ProcessPoolExecutor
async def fetch(session, url):
async with session.get(url) as response:
return await response.text()
async def process_urls(urls, max_concurrent):
semaphore = asyncio.Semaphore(max_concurrent)
async with aiohttp.ClientSession() as session:
tasks = []
for url in urls:
task = asyncio.ensure_future(process_url(session, url, semaphore))
tasks.append(task)
return await asyncio.gather(*tasks)
async def process_url(session, url, semaphore):
async with semaphore:
return await fetch(session, url)
def read_urls_from_file(file_name):
with open(file_name, 'r') as file:
return file.read().splitlines()
def main():
file_name = 'urls.txt'
num_lines = 10 # 读取的行数
max_concurrent = 5 # 每批最多的进程数,即并发请求数
urls = read_urls_from_file(file_name)[:num_lines]
loop = asyncio.get_event_loop()
executor = ThreadPoolExecutor(max_workers=max_concurrent)
asyncio.set_event_loop(loop)
try:
result = loop.run_until_complete(process_urls(urls, max_concurrent))
print(result)
finally:
loop.close()
if __name__ == '__main__':
main()
该程序首先使用 read_urls_from_file() 函数从文件中读取指定行数的 URL。然后定义了 fetch() 函数,使用 aiohttp 库发起异步的 URL 请求并获取返回的文本内容。
process_url() 函数使用 semaphore 来限制并发请求数,实现每批最多 m 个进程。
process_urls() 函数创建一个 ClientSession 对象,然后使用 asyncio.gather() 同时执行多个 process_url() 函数,返回所有 URL 的文本结果。
在 main() 函数中,我们指定了读取的行数和每批最多的进程数。然后使用 asyncio 的事件循环来运行 process_urls() 函数,最后获取返回的结果并打印。
通过使用协程和多进程,可以有效地提高 URL 访问的效率,实现高效的网页爬取。
原文地址: https://www.cveoy.top/t/topic/p3PX 著作权归作者所有。请勿转载和采集!