新闻中心

Python爬虫:使用Requests和Re模块递归提取网站所有链接

2025-11-02
浏览次数:
返回列表

python爬虫:使用requests和re模块递归提取网站所有链接

本文介绍了如何使用Python的requests和re模块,编写一个网络爬虫来递归地提取网站上的所有链接。通过示例代码,详细讲解了爬虫的实现思路、关键步骤和注意事项,并提供了优化后的代码示例,避免无限循环,提高爬取效率。

网络爬虫是一种自动浏览网页并提取信息的程序。在Python中,requests库常用于发送HTTP请求获取网页内容,re模块则用于使用正则表达式从文本中提取所需信息。本文将介绍如何结合这两个库,编写一个递归爬虫,提取指定网站的所有链接。

爬虫实现思路

  1. 发送HTTP请求: 使用requests.get()方法向目标URL发送GET请求,获取网页的HTML内容。
  2. 提取链接: 使用re.findall()方法,通过正则表达式匹配HTML内容中的href属性,提取所有链接。
  3. 处理链接: 将提取到的相对链接转换为绝对链接,并去除锚点(#后面的部分)。
  4. 递归爬取: 对提取到的每个链接,递归调用爬取函数,继续提取链接。
  5. 避免无限循环: 使用集合记录已访问过的链接,避免重复爬取,防止无限循环。
  6. 限制爬取深度: 设置最大爬取深度,防止爬虫爬取过多的页面。

关键代码解析

以下是优化后的代码示例,并附带详细注释:

Musho Musho

AI网页设计Figma插件

Musho 76 查看详情 Musho
import requests
import re
from urllib.parse import urljoin, urlparse

def extract_links_from(url):
    """
    从指定URL的网页中提取所有链接。

    Args:
        url: 要提取链接的URL。

    Returns:
        包含所有链接的列表。如果请求失败,返回空列表。
    """
    try:
        response = requests.get(url)
        response.raise_for_status()  # 检查HTTP状态码,如果不是200,则抛出异常
    except requests.exceptions.RequestException as e:
        print(f"Error fetching {url}: {e}")
        return []

    content = str(response.content)
    links = re.findall(r'(?:href=")(.*?)"', content, re.MULTILINE)
    return links

def crawl(url, domain, visited=set(), max_depth=5):
    """
    递归地爬取指定网站的所有链接。

    Args:
        url: 要开始爬取的URL。
        domain: 目标网站的域名。
        visited: 已经访问过的URL集合,用于避免无限循环。
        max_depth: 最大爬取深度。

    Returns:
        包含所有爬取到的链接的列表。
    """
    if max_depth == 0 or url in visited:
        return []

    visited.add(url)
    href_links = extract_links_from(url)
    links_list = []

    for link in href_links:
        link = urljoin(url, link.split("#")[0])  # 将相对链接转换为绝对链接,并去除锚点
        parsed_link = urlparse(link)
        if parsed_link.netloc == domain and link not in visited:
            links_list.append(link)
            links_list.extend(crawl(link, domain, visited, max_depth - 1))  # 递归调用crawl函数
    return links_list

# 示例用法
target_url = "https://www.free-power-point-templates.com/"
parsed_url = urlparse(target_url)
domain = parsed_url.netloc

result = crawl(target_url, domain)
print(result)

代码解释:

  • extract_links_from(url)函数:
    • 使用requests.get(url)发送GET请求,获取网页内容。
    • 使用response.raise_for_status()检查HTTP状态码,确保请求成功。如果请求失败,会抛出异常,防止程序崩溃。
    • 使用re.findall(r'(?:href=")(.*?)"', content, re.MULTILINE)通过正则表达式提取href属性中的链接。正则表达式r'(?:href=")(.*?)"'用于匹配href="和"之间的内容,(?:...)表示非捕获分组,(.*?)表示匹配任意字符,直到遇到下一个"。
  • crawl(url, domain, visited=set(), max_depth=5)函数:
    • 使用if max_depth == 0 or url in visited:作为递归终止条件,避免无限循环和超出最大深度。
    • 使用visited.add(url)将当前URL添加到已访问集合中。
    • 使用urljoin(url, link.split("#")[0])将提取到的相对链接转换为绝对链接,并去除锚点。
    • 使用urlparse(link).netloc == domain判断链接是否属于目标域名。
    • 使用links_list.extend(crawl(link, domain, visited, max_depth - 1))递归调用crawl函数,爬取新的链接。

注意事项

  • 遵守Robots协议: 在爬取网站之前,应该先查看网站的robots.txt文件,了解网站的爬取规则,避免爬取禁止访问的页面。
  • 设置User-Agent: 在发送HTTP请求时,应该设置User-Agent,模拟浏览器行为,避免被网站识别为爬虫。
  • 控制爬取频率: 爬取速度过快可能会给网站服务器带来压力,甚至导致IP被封禁。应该控制爬取频率,设置合理的延迟时间。
  • 异常处理: 在爬取过程中,可能会遇到各种异常,例如网络连接错误、页面不存在等。应该使用try-except语句捕获这些异常,并进行相应的处理。
  • 数据存储: 将爬取到的数据存储到文件或数据库中,方便后续分析和使用。
  • 避免无限循环: 这是最重要的一点,一定要使用visited集合记录已访问的链接,并设置最大爬取深度,防止爬虫陷入无限循环。

总结

本文介绍了使用Python的requests和re模块编写递归爬虫的方法。通过示例代码,详细讲解了爬虫的实现思路、关键步骤和注意事项。在实际应用中,需要根据具体情况进行调整和优化,例如添加代理IP、使用多线程/多进程提高爬取效率等。记住,编写爬虫时一定要遵守网站的规则,尊重网站的权益。

以上就是Python爬虫:使用Requests和Re模块递归提取网站所有链接的详细内容,更多请关注其它相关文章!


# 重写  # SEO霸屏效果  # 汤阴县软文推广营销策划  # 亲子网站建设素材图片  # 招聘网站建设申请  # 大东区网站建设价格咨询  # 网站建设及推广服务包括  # 山西本地网站推广公司电话  # SEO分析检验考研专业  # 潼南外贸网站建设推广  # 贵州遵义学院网站建设  # 数据存储  # 如何实现  # 抛出  # 解决方法  # python  # 自定义  # 多线程  # 转换为  # 递归  # .net  # 状态码  # 爬虫  # ai  # app  # 浏览器  # 网络爬虫  # 正则表达式  # html 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: Win11怎么查看显卡显存 Win11显示适配器属性及专用视频内存查询  QQ邮箱在线使用入口 QQ邮箱个人账号网页版登录  高德地图家和公司地址在哪设置 高德地图通勤路线设置方法【超详细】  Web Components中自定义开关组件状态同步的常见陷阱与解决方案  文心一言怎样用批量生成做多版文案_文心一言用批量生成做多版文案【批量创作】  c++中的const_cast和reinterpret_cast怎么用_c++四种类型转换  凉拌黄瓜怎么拌更入味 凉拌黄瓜简单家常做法  在Go语言中利用后缀数组处理多字符串:实现高效文本匹配与自动补全  圆通快递查询实时追踪 圆通物流包裹状态快速查看  qq游戏大厅官方下载_qq游戏免费下载安装入口  解决 Express.js 中 PUT 请求密码修改失败的路由配置指南  Google翻译怎么语音输入_Google翻译语音输入功能使用与设置方法  抖音DOU+怎么投最有效 抖音付费推广的ROI提升技巧  在WordPress中通过REST API获取BasicAuth保护的远程文章  使用CSS更改登录屏幕输入框中PNG图标颜色的策略与局限性  支付宝解绑银行卡步骤_支付宝如何解除绑定银行卡  wps文字怎么插入目录并自动更新_wps文字如何插入目录并自动更新方法  零跑汽车11月交付量达70327台 实现连续9个月正增长  J*a应用程序首次运行自动创建文件与目录的最佳实践  Bing引擎入口最新2025 Bing搜索免费官方登录  AO3最新入口2025公告_AO3中文官网合集  在J*a中如何隐藏复杂性_使用门面模式组织对象交互  在Go Martini框架中高效服务动态生成图像的实践指南  向日葵客户端怎么进行远程CentOS控制_向日葵客户端远程CentOS控制操作教程  J*aScript数据结构转换:将对象数组按类别分组  极速漫画官方主页网址 极速漫画漫画在线浏览官网链接  outlook中文官网入口地址 outlook官方中文版直达首页链接  Linux如何排查内存不足OOME问题_LinuxOOM分析教程  《燕云十六声》两周内达九百万玩家!位居畅销榜第五  Shopware订单对象中获取产品自定义字段的正确方法  J*aScript map 方法中处理循环元素为空数组的策略  单射、满射与双射的关系 一文理清所有逻辑  葱吃多了会怎样 葱吃多了会伤胃吗  “音游” × “怪文书” 题材的节奏冒险游戏 《晕晕电波症候群》确定于2026年4月发售!  天眼查怎么看公司融资情况 天眼查企业融资历史查询步骤【攻略】  深入理解J*aScript Promise异步执行与微任务队列  J*a递归快速排序中静态变量导致数据累积的陷阱与解决方案  J*a递归快速排序中静态变量导致数据累积问题的解决方案  NVIDIA股价11月重挫12%:下月有望好转 但难回5万亿美元巅峰  必由学官网快捷入口 必由学网页版在线学习平台  J*aScript中管理异步API调用:确保操作顺序与数据一致性  Python getattr() 异常处理深度解析:避免程序意外退出  优酷会员付费后没到账怎么办_优酷会员充值异常及解决方法  Windows7怎么硬盘安装 Windows7提取ISO镜像到非系统盘并运行setup.exe实现硬盘直装【教程】  Lar*el如何正确地在控制器和模型之间分配逻辑_Lar*el代码职责分离与架构建议  在Blazor WebAssembly应用中动态注入客户端特定指标代码的策略  火锅吃太多会怎样 火锅吃太多会上火吗  浏览器打开即用 美图秀秀网页版入口  支付宝碰一碰设备是REDMI手机吗 博主拆机辟谣:处理器、内存都不一样  解决 Vaadin 8 中大文件音频播放与定位时出现的 IOException 

搜索