一、库简介
Requests-HTML是Python中集网络请求与HTML解析于一体的全能型库,由知名开发者Kenneth Reitz团队维护。它完美结合了Requests的易用性和Parsel的选择器功能,并内置JavaScript渲染引擎,特别适合现代动态网页抓取。最新版本(v0.10.0)已全面兼容Python 3.6+环境。
二、核心功能详解
1. 环境准备
python
# 终端安装
pip install requests-html
# 基础导入
from requests_html import HTMLSession
2. 基础网络请求
python
# 创建会话对象(推荐方式)
session = HTMLSession()
# GET请求示例
response = session.get('https://example.com')
# POST请求示例
data = {'key': 'value'}
response = session.post('https://httpbin.org/post', data=data)
3. HTML解析三板斧
python
# 原始HTML查看
print(response.html.raw_html)
# CSS选择器(支持嵌套查询)
articles = response.html.find('div.article', first=True)
# XPath表达式
titles = response.html.xpath('//h2/text()')
4. 动态页面处理
python
# 强制渲染JavaScript(自动执行JS)
response.html.render() # 需安装pyppeteer
# 异步渲染(提升性能)
async def get_dynamic_content():
r = await session.get('https://dynamic-site.com')
await r.html.arender()
5. 表单与文件操作
python
# 文件上传示例
with open('file.txt', 'rb') as f:
files = {'upload_file': f}
response = session.post('https://upload.com', files=files)
# 表单提交(含验证码处理)
form = response.html.find('form#login', first=True)
form_data = {
'username': 'admin',
'password': '123456',
'captcha': 'abcd' # 需配合OCR处理
}
response = session.post(form.attrs['action'], data=form_data)
三、高级特性
1. 智能编码检测
python
# 自动识别网页编码
response.encoding = response.apparent_encoding
# 手动设置编码(日文页面示例)
response.encoding = 'euc-jp'
2. 连接池优化
python
# 创建带连接池的会话
from requests.adapters import HTTPAdapter
adapter = HTTPAdapter(pool_connections=10, pool_maxsize=100)
session = HTMLSession()
session.mount('https://', adapter)
3. 异常处理机制
python
try:
response = session.get('https://flaky-site.com', timeout=5)
response.raise_for_status()
except requests.exceptions.HTTPError as err:
print(f"HTTP错误: {err}")
except requests.exceptions.ConnectionError:
print("连接失败,正在重试...")
四、实战案例:豆瓣电影数据抓取
python
from requests_html import HTMLSession
session = HTMLSession()
def scrape_douban(url):
try:
r = session.get(url)
r.html.render() # 执行JS渲染
movies = []
for item in r.html.find('.item'):
title = item.find('.title', first=True).text
rating = item.find('.rating_num', first=True).text
movies.append({
'title': title,
'rating': float(rating)
})
return movies
except Exception as e:
print(f"抓取失败: {str(e)}")
return []
# 执行抓取
data = scrape_douban('https://movie.douban.com/top250')
print(f"成功获取{len(data)}条电影数据")
五、性能优化建议
- 持久化会话:复用Session对象减少TCP连接开销
- 并发控制:使用asyncio实现异步请求(示例见附录)
- 缓存策略:对静态资源启用本地缓存
- 代理旋转:配合住宅IP代理应对反爬
六、常见问题解决
Q1: 渲染时出现pyppeteer
错误
A: 确保已安装浏览器依赖:
bash
pip install pyppeteer
python -m pyppeteer_installer
Q2: 如何处理验证码?
A: 推荐方案:
- 使用OCR库(如tesseract)识别简单验证码
- 接入第三方打码平台(推荐超级鹰)
- 复杂场景建议使用Selenium模拟浏览器
Q3: 遇到TooManyRedirects
错误
A: 修改请求参数:
python
response = session.get(url, allow_redirects=False)
七、版本更新亮点(v0.10.0)
- 新增WebAssembly支持
- 优化移动端UserAgent池
- 增强CSS选择器性能(提升40%)
- 修复已知内存泄漏问题
八、学习资源推荐
通过本文的系统学习,您将掌握从基础请求到动态页面处理的完整技能链。实际开发中建议结合具体场景调整参数,并遵守目标网站的robots.txt
协议。