以下是Python中Requests + XPath技术栈的完整解析与应用指南,结合核心原理、实战案例及避坑策略,帮助高效实现网页数据抓取:


🔧 一、基础工具链配置

  1. 安装核心库

    pip install requests lxml# 网络请求与XPath解析
  2. 工作流架构

    graph LR
    A[发送请求] --> B[获取HTML]
    B --> C[XPath解析]
    C --> D[数据提取]

🚀 二、核心模块详解与实战

1. Requests:网络请求引擎

  • 高效发送请求

    import requests
    url = "https://example.com"
    headers = {"User-Agent": "Mozilla/5.0"}# 绕过基础反爬
    response = requests.get(url, headers=headers, timeout=5)
  • 关键参数:proxies(代理IP)、cookies(会话保持)
  • 编码处理

    response.encoding = response.apparent_encoding# 自动检测编码
    html = response.text# 获取解码后的文本

2. XPath:精准数据提取

  • 解析HTML

    from lxml import etree
    tree = etree.HTML(html)# 生成可解析对象
  • 核心语法
表达式作用示例
//div全局搜索div标签//div[@class="header"]
/直接子节点//ul/li
[@attr="value"]属性筛选//a[@href="/login"]
text()提取文本//h1/text()
contains(@attr, "val")模糊属性匹配//div[contains(@class, "price")]

实战场景

# 提取豆瓣图书标题与链接
titles = tree.xpath('//div[@class="title"]/a/text()')
links = tree.xpath('//div[@class="title"]/a/@href')

⚡ 三、高频实战案例

案例1:电商价格监控(静态页)

url = "https://www.zbj.com/service/saas"
resp = requests.get(url)
tree = etree.HTML(resp.text)

# 提取服务商信息
for div in tree.xpath('//div[contains(@class, "service-card")]'):
title = div.xpath('.//h3/text()')[0].strip()
price = div.xpath('.//span[@class="price"]/text()')[0]
print(f"服务:{title},价格:{price}")

技巧:使用相对路径.避免全局搜索干扰

案例2:动态渲染页面破解(Ajax数据)

# 直接请求Ajax接口(以58同城为例)
ajax_url = "https://api.58.com/ershoufang"
params = {"page": 1, "size": 30}
json_data = requests.get(ajax_url, params=params).json()

# 解析JSON中的关键字段
for item in json_data["data"]["list"]:
title = item["title"]
price = item["price"]

原理:通过浏览器开发者工具捕获XHR请求


⚠️ 四、避坑指南与进阶技巧

1. 高频问题解决

问题场景解决方案
中文乱码response.encoding = 'utf-8' 或使用chardet自动检测
XPath返回空列表检查元素是否动态加载;使用contains()替代精确匹配
多层嵌套结构文本丢失element.xpath('string(.)') 提取完整文本
反爬封锁轮换User-Agent + IP代理;添加Referer

2. 性能优化

  • 并发请求:结合aiohttp异步库
  • 缓存机制:使用requests_cache减少重复请求

    import requests_cache
    requests_cache.install_cache('demo_cache')

💡 五、企业级应用扩展

  1. 自动化测试集成
    结合Selenium处理复杂JS渲染页面:

    from selenium.webdriver import Chrome
    driver = Chrome()
    driver.get(url)
    html = driver.page_source
    tree = etree.HTML(html)# 继续使用XPath解析
  2. 分布式爬虫架构
  3. 使用Scrapy-Redis调度任务
  4. 将Requests替换为Scrapy的Downloader Middleware

最佳实践

  • 简单静态页 → Requests+XPath(开发效率最高)
  • 动态渲染页 → Selenium/Ajax接口+XPath(兼容性强)
  • 大型项目 → Scrapy集成XPath(扩展性最优)

通过上述方案,可覆盖90%网页抓取场景。

分类: 默认分类技术 标签: python数据采集RequestsXpathlxml

评论

暂无评论数据

暂无评论数据

目录