领先的免费Web技术教程,涵盖HTML到ASP.NET

网站首页 > 知识剖析 正文

Python+Requests+Xpath+lxml 数据采集

nixiaole 2025-08-03 07:22:10 知识剖析 1 ℃

点赞标记,明天就能用上这几个技巧!

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


一、基础工具链配置

  1. 安装核心库
pip install requests lxml# 网络请求与XPath解析
  1. 工作流架构

二、核心模块详解与实战

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解析
  1. 分布式爬虫架构
  • 使用Scrapy-Redis调度任务
  • 将Requests替换为Scrapy的Downloader Middleware

最佳实践

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

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

都看到这里了, 记得帮忙一键三连, 点赞、评论、收藏、关注

Tags:

最近发表
标签列表