广度优先爬虫(Breadth-First Crawler)是一种遍历或搜索树或图的算法。在Python中,我们可以使用队列(Queue)来实现广度优先爬虫。以下是一个简单的广度优先爬虫示例,用于抓取网页内容:
requests
库,如果没有安装,可以使用以下命令安装:pip install requests
bfs_spider.py
的文件,并在其中编写以下代码:import requests
from bs4 import BeautifulSoup
from collections import deque
def bfs_crawl(start_url, max_depth):
visited = set()
queue = deque([(start_url, 0)])
while queue:
url, depth = queue.popleft()
if depth > max_depth:
continue
if url not in visited:
print(f"Crawling: {url} (Depth: {depth})")
visited.add(url)
try:
response = requests.get(url)
response.raise_for_status()
content = response.text
soup = BeautifulSoup(content, "html.parser")
# 提取页面中的链接
links = [a["href"] for a in soup.find_all("a", href=True)]
# 将链接添加到队列中
for link in links:
queue.append((link, depth + 1))
except requests.exceptions.RequestException as e:
print(f"Error: {e}")
if __name__ == "__main__":
start_url = "https://example.com"
max_depth = 2
bfs_crawl(start_url, max_depth)
在这个示例中,我们首先导入所需的库,然后定义一个名为bfs_crawl
的函数。这个函数接受两个参数:起始URL和最大深度。我们使用一个队列来存储待爬取的URL及其深度,并使用一个集合来存储已访问过的URL。
在while
循环中,我们从队列中弹出一个URL及其深度,然后检查是否超过了最大深度。如果没有超过,我们继续爬取该页面。我们使用requests
库获取页面内容,并使用BeautifulSoup
库解析HTML。然后,我们从页面中提取所有链接,并将它们添加到队列中,以便在下一轮迭代中爬取。
最后,我们在__main__
部分调用bfs_crawl
函数,传入起始URL和最大深度。
要运行此示例,请在命令行中输入以下命令:
python bfs_spider.py
这将启动广度优先爬虫,从https://example.com
开始,爬取两层深度内的所有网页。