Python+Requests+Xpath+lxml 数据采集
以下是Python中Requests + XPath技术栈的完整解析与应用指南,结合核心原理、实战案例及避坑策略,帮助高效实现网页数据抓取:
🔧 一、基础工具链配置
安装核心库
pip install requests lxml# 网络请求与XPath解析
工作流架构
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')
💡 五、企业级应用扩展
自动化测试集成
结合Selenium
处理复杂JS渲染页面:from selenium.webdriver import Chrome driver = Chrome() driver.get(url) html = driver.page_source tree = etree.HTML(html)# 继续使用XPath解析
- 分布式爬虫架构
- 使用
Scrapy-Redis
调度任务 - 将Requests替换为Scrapy的Downloader Middleware
最佳实践:
- 简单静态页 → Requests+XPath(开发效率最高)
- 动态渲染页 → Selenium/Ajax接口+XPath(兼容性强)
- 大型项目 → Scrapy集成XPath(扩展性最优)
通过上述方案,可覆盖90%网页抓取场景。
版权申明
本文系作者 @lili 原创发布在十指的世界站点。未经许可,禁止转载。
暂无评论数据