Python爬虫 知识量:11 - 28 - 71
使用Python的multiprocessing模块可以实现多进程爬虫。多进程允许在多个进程中同时执行代码,每个进程有自己的内存空间和执行环境,可以充分利用多核CPU的性能。下面是一个使用multiprocessing模块的示例:
import multiprocessing import requests from bs4 import BeautifulSoup # 定义一个爬虫函数 def crawl_website(url): try: response = requests.get(url) response.raise_for_status() # 确保请求成功 return response.text except requests.RequestException as e: print(f"请求出错: {e}") return None # 定义一个解析函数 def parse_html(html): soup = BeautifulSoup(html, 'html.parser') # 在这里编写解析HTML的逻辑,提取所需的数据 # 例如,提取所有的链接 links = soup.find_all('a') for link in links: print(link.get('href')) # 打印链接 if __name__ == '__main__': start_url = 'http://example.com' # 替换为要爬取的网站地址 pool = multiprocessing.Pool() # 创建一个进程池 results = pool.map(crawl_website, [start_url]) # 将爬取任务提交给进程池并等待结果 # 这里需要对结果进行处理,比如解析HTML并提取所需数据 for result in results: if result: parse_html(result) pool.close() # 关闭进程池 pool.join() # 等待所有进程完成 print("所有进程已完成")
在上面的示例中,使用multiprocessing.Pool()创建了一个进程池pool。然后,将爬取任务crawl_website提交给进程池,并使用pool.map()等待结果。每个进程会独立执行爬取任务,并将结果返回给主进程。最后,对结果进行处理,比如解析HTML并提取所需数据。需要注意的是,在所有进程完成后,需要调用pool.close()关闭进程池,并调用pool.join()等待所有进程完成。
要使用multiprocessing.Pool和queue模块实现多进程爬虫,可以结合使用Queue来管理任务分配和数据传递。下面是一个示例:
import multiprocessing import requests from bs4 import BeautifulSoup import queue # 定义一个爬虫函数 def crawl_website(q, url): while not q.empty(): # 从队列中获取任务 next_url = q.get() try: response = requests.get(next_url) response.raise_for_status() # 确保请求成功 parse_html(response.text) # 解析HTML并提取所需数据 except requests.RequestException as e: print(f"请求出错: {e}") # 定义一个解析函数 def parse_html(html): soup = BeautifulSoup(html, 'html.parser') # 在这里编写解析HTML的逻辑,提取所需的数据 # 例如,提取所有的链接 links = soup.find_all('a') for link in links: print(link.get('href')) # 打印链接 if __name__ == '__main__': start_url = 'http://example.com' # 替换为要爬取的网站地址 q = multiprocessing.Queue() # 创建一个队列对象 pool = multiprocessing.Pool() # 创建一个进程池 # 将起始URL放入队列中 q.put(start_url) # 将队列对象传递给进程池中的进程 results = pool.map(crawl_website, [(q, start_url)]) pool.close() # 关闭进程池 pool.join() # 等待所有进程完成 print("所有进程已完成")
在上面的示例中,首先创建了一个multiprocessing.Queue()对象q来管理任务和数据。然后,使用multiprocessing.Pool()创建了一个进程池pool。将起始URL放入队列中,并将其作为参数传递给进程池中的进程。在每个进程中,使用q.get()从队列中获取任务,并执行相应的爬取操作。最后,等待所有进程完成,并打印出"所有进程已完成"。
Copyright © 2017-Now pnotes.cn. All Rights Reserved.
编程学习笔记 保留所有权利
MARK:3.0.0.20240214.P35
From 2017.2.6