一、庫簡介
Requests-HTML是Python中集網絡請求與HTML解析于一體的全能型庫,由知名開發者Kenneth Reitz團隊維護。它完美結合了Requests的易用性和Parsel的選擇器功能,并內置JavaScript渲染引擎,特別適合現代動態網頁抓取。最新版本(v0.10.0)已全面兼容Python 3.6+環境。
二、核心功能詳解
1. 環境準備
# 終端安裝
pip install requests-html# 基礎導入
from requests_html import HTMLSession
2. 基礎網絡請求
# 創建會話對象(推薦方式)
session = HTMLSession()# GET請求示例
response = session.get('https://example.com')# POST請求示例
data = {'key': 'value'}
response = session.post('https://httpbin.org/post', data=data)
3. HTML解析三板斧
# 原始HTML查看
print(response.html.raw_html)# CSS選擇器(支持嵌套查詢)
articles = response.html.find('div.article', first=True)# XPath表達式
titles = response.html.xpath('//h2/text()')
4. 動態頁面處理
# 強制渲染JavaScript(自動執行JS)
response.html.render() # 需安裝pyppeteer# 異步渲染(提升性能)
async def get_dynamic_content():r = await session.get('https://dynamic-site.com')await r.html.arender()
5. 表單與文件操作
# 文件上傳示例
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. 智能編碼檢測
# 自動識別網頁編碼
response.encoding = response.apparent_encoding# 手動設置編碼(日文頁面示例)
response.encoding = 'euc-jp'
2. 連接池優化
# 創建帶連接池的會話
from requests.adapters import HTTPAdapteradapter = HTTPAdapter(pool_connections=10, pool_maxsize=100)
session = HTMLSession()
session.mount('https://', adapter)
3. 異常處理機制
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("連接失敗,正在重試...")
四、實戰案例:豆瓣電影數據抓取
from requests_html import HTMLSessionsession = 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).textrating = item.find('.rating_num', first=True).textmovies.append({'title': title,'rating': float(rating)})return moviesexcept 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: 確保已安裝瀏覽器依賴:
pip install pyppeteer
python -m pyppeteer_installer
Q2: 如何處理驗證碼?
A: 推薦方案:
- 使用OCR庫(如tesseract)識別簡單驗證碼
- 接入第三方打碼平臺(推薦超級鷹)
- 復雜場景建議使用Selenium模擬瀏覽器
Q3: 遇到TooManyRedirects
錯誤
A: 修改請求參數:
response = session.get(url, allow_redirects=False)
七、版本更新亮點(v0.10.0)
- 新增WebAssembly支持
- 優化移動端UserAgent池
- 增強CSS選擇器性能(提升40%)
- 修復已知內存泄漏問題
八、學習資源推薦
- 官方文檔
- 動態網頁抓取實戰
- 反爬蟲對抗指南
通過本文的系統學習,您將掌握從基礎請求到動態頁面處理的完整技能鏈。實際開發中建議結合具體場景調整參數,并遵守目標網站的robots.txt
協議。