Python实现深度优先爬虫:精准爬取百度域名下链接,模拟输出详细信息
下面是一个示例 Python 爬虫程序,采用深度优先策略爬取 www.baidu.com,模拟你给出的输出信息。程序使用 requests 获取网页并用 BeautifulSoup 提取新链接,记录访问深度和访问计数。爬取流程截至时仅演示打印核心信息,避免真实爬取造成过大访问压力,方便展示思路。 ```python import requests from bs4 import BeautifulSoup from urllib.parse import urljoin, urlparse class DepthFirstCrawler: def __init__(self, seed_url, max_depth=3, max_visits=20): self.seed_url = seed_url self.max_depth = max_depth self.max_visits = max_visits self.visited = set() self.visited_count = 0 # 用列表模拟栈,存放 (url, depth) self.unvisited = [(seed_url, 1)] print(f'Add the seeds url [\'{seed_url}\'] to the unvisited url list') def get_links(self, url): """请求url并解析出新链接,简单限制只提取baidu域名下链接""" try: resp = requests.get(url, timeout=5) resp.encoding = resp.apparent_encoding except Exception: return [] soup = BeautifulSoup(resp.text, 'html.parser') links = set() for a_tag in soup.find_all('a', href=True): link = urljoin(url, a_tag['href']) parsed = urlparse(link) if 'baidu.com' in parsed.netloc: # 过滤类似 mailto:, javascript:等链接 if parsed.scheme in ('http', 'https'): links.add(link) return list(links) def crawl(self): while self.unvisited and self.visited_count < self.max_visits: url, depth = self.unvisited.pop() # 深度优先用栈结构,pop末尾元素(后进先出) if url in self.visited: continue print(f'Pop out one url "{url}" from unvisited url list') links = self.get_links(url) print(f'Get {len(links)} new links') self.visited.add(url) self.visited_count += 1 print(f'Visited url count: {self.visited_count}') print(f'Visited deepth: {depth}') if links: print(f'{len(links)} unvisited links:') else: print('0 unvisited links:') if depth < self.max_depth: for link in links: if link not in self.visited: self.unvisited.append((link, depth + 1)) # 结束时可能还剩多少未访问 if self.unvisited: print(f'{len(self.unvisited)} unvisited links:') else: print('No unvisited links left') if __name__ == '__main__': seed = 'http://www.baidu.com' crawler = DepthFirstCrawler(seed_url=seed, max_depth=3, max_visits=20) crawler.crawl() ``` 代码说明: - 使用列表模拟栈结构实现深度优先(pop最近加入的url)。 - 访问时打印当前栈顶url、获取新链接数、访问计数与深度。 - 仅爬取 baidu.com 域名下的 http/https 链接。 - 设置最大访问次数和最大深度防止死循环与访问过多。 - 输出格式基本模拟你给的示例提示。 注意的逻辑点: 1. 实现深度优先通过列表的 pop() 实现栈结构访问顺序。 2. 新链入栈时深度+1,控制最大深度限制,避免无限递归。 3. 过滤域名和协议,避免加入无效或跨域链接,保证爬取安全与准确。 ######[AI写代码神器 | 2142点数解答 | 2025-05-13 15:54:49]
- Python 运行报错:urllib3 网络连接创建失败,原因及排查建议(字节豆包 | 161点数解答 | 2024-10-31 00:39:36)458
- Python 实现球类:精准计算半径、表面积与体积,附输入验证与异常处理!(阿里通义 | 261点数解答 | 2024-11-28 21:19:39)343
- Python 实战:学生信息列表转字典、遍历、深拷贝及数据修改全流程(GPT | 422点数解答 | 2024-10-29 15:43:54)414
- Python实战:学生成绩列表转字典,深拷贝与数据修改操作全解析(字节豆包 | 254点数解答 | 2024-10-29 16:01:39)405
- 数字化制图综合平台:助力企业转型,推动烟草物流图纸智能化设计 (字节豆包 | 490点数解答 | 2024-10-30 20:30:29)142
- 数字化制图综合平台:引领烟草物流及多领域设计革新 在企业数字化转型的时代浪潮中,数字化制图技术创新应用成为产业升级与提升竞争力的关键。企业对高效、精准、智能化设计解决方案需求迫切,构建集二维到三维正逆向工程快捷化、干涉检测可视化、设备明细数据提取自动化以及设备模块模型库于一体的综合平台意义重大。 此平台集成先进数字化制图工具与智能算法,可实现二维设计到三维建模的无缝转换,大大缩短设计周期。正逆向工程能快速切换,满足不同场景设计需求。内置干涉检测功能可实时监测设计潜在冲突,保障设计方案可行与安全。设备明细数据自动提取提高设计准确性与效率。设备模块模型库为设计师提供丰富资源,支持设计标准化与模块化,加速项目推进。 整体来看,该综合平台的应用极大促进了烟草物流行业及更广泛领域的技术创新与效率提升。在烟草物流方案图纸智能化设计中,它提升了图纸设计效率与质量,使设计工作更加高效、精准。对于企业而言,这一平台带来显著竞争优势,能帮助企业在数字化转型中脱颖而出,在激烈的市场竞争中占据有利地位,推动整个行业向更高效、更智能的方向发展。 (阿里通义 | 216点数解答 | 2024-10-30 20:30:51)170
- 51 单片机:定时器 0 实现 8 个 LED 循环点亮,附代码及优化建议(字节豆包 | 1193点数解答 | 2024-12-27 15:10:29)310
- 牛客网难题:小z序列运算,求原始与重排后最大值!(GPT | 662点数解答 | 2024-11-23 17:43:39)172
- PHP+MySQL打造含用户注册登录(带验证码)、后台提交与前端表格展示功能的网站(字节豆包 | 835点数解答 | 2025-02-12 15:16:01)157
- 牛客网:构造长度为n且连续m个数和为完全平方数的严格递增整数序列(字节豆包 | 669点数解答 | 2025-07-10 15:27:32)115
- C++ 实现:计算使两数组相等的最少操作次数及注意事项(字节豆包 | 605点数解答 | 2025-11-05 22:15:18)57
- Java调用Python接口中文乱码?设置UTF - 8编码一招解决!(讯飞星火 | 263点数解答 | 2024-06-06 17:07:59)389