使用Python 3与Requests-HTML爬取网站无法获取真实HTML代码求助
解决Requests-HTML爬取Ostseewelle图表数据失败的问题
问题核心
调用render()后仍无法获取目标<td data-label="Künstler">标签,大概率是以下原因导致:
- 网站通过反爬机制识别了Requests-HTML依赖的Headless Chrome
- 图表数据并非页面JS渲染生成,而是通过独立AJAX接口异步加载
render()参数设置不足以等待数据完全加载
解决方向与实现
1. 优化Requests-HTML的请求与渲染配置
给请求添加真实浏览器请求头,调整渲染参数模拟真实访问行为:
from requests_html import HTML, HTMLSession charts = {'ODC50': { 'name': 'ODC50', 'anz': 50, 'url': 'https://www.mix1.de/charts/dance50.htm', 'entry': 'div.charts-main-block', 'date': '#mix1_content div.mybox_content' }, 'DDPHot50': { 'name': 'DDP Hot50', 'anz': 50, 'url': 'https://www.deutsche-dj-playlist.de/hot-50/dance', 'entry': 'div.list div.entry', 'date': 'div.header div.title' }, 'Ostseewelle': { 'name': 'Ostseewelle', 'anz': 20, 'url': 'https://www.ostseewelle.de/sendungen/H%C3%B6rercharts-id379456.html', 'entry': 'section', 'date': 'h3.text-center.titel1' } } choice = 'Ostseewelle' chart_site = charts.get(choice).get('url') session = HTMLSession() # 添加真实浏览器请求头 headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36' } r = session.get(chart_site, headers=headers) # 调整渲染参数:延长等待时间,禁用Headless检测特征 r.html.render( sleep=5, keep_page=True, scrolldown=10, timeout=60, args=['--no-sandbox', '--disable-setuid-sandbox', '--user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36'] ) print(r.status_code) html = r.html tds = html.xpath('//td[@data-label="Künstler"]') print(f'Gefundene Einträge: {len(tds)}') # 验证结果 for td in tds[:5]: print(td.text) print('Programm beendet')
2. 直接调用AJAX接口(高效稳定)
打开浏览器开发者工具(F12),切换到Network > XHR标签,刷新页面可找到加载图表数据的API接口,直接请求接口获取JSON数据:
import requests headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36', 'Referer': 'https://www.ostseewelle.de/sendungen/H%C3%B6rercharts-id379456.html' } # 替换为实际找到的API接口URL api_url = 'https://www.ostseewelle.de/api/charts/horercharts' response = requests.get(api_url, headers=headers) if response.status_code == 200: data = response.json() # 解析提取艺术家信息 for entry in data.get('entries', []): print(f"Künstler: {entry.get('artist')}") else: print(f"API请求失败,状态码: {response.status_code}")
3. 切换到Playwright工具(更可靠的渲染)
若Requests-HTML始终无法绕过反爬,用Playwright模拟更真实的浏览器行为:
from playwright.sync_api import sync_playwright chart_site = 'https://www.ostseewelle.de/sendungen/H%C3%B6rercharts-id379456.html' with sync_playwright() as p: browser = p.chromium.launch(headless=False) # 先禁用headless调试 page = browser.new_page(user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36') page.goto(chart_site, wait_until='networkidle') # 等待目标元素加载完成 page.wait_for_selector('td[data-label="Künstler"]') # 获取所有目标元素 tds = page.query_selector_all('td[data-label="Künstler"]') print(f'Gefundene Einträge: {len(tds)}') for td in tds[:5]: print(td.text_content()) browser.close()
关键提示
优先尝试调用AJAX接口,这是最稳定高效的方式,避免渲染页面的开销和反爬检测;若必须渲染页面,务必模拟真实浏览器的请求头与行为。
内容的提问来源于stack exchange,提问作者Chaos Klaus
相关产品推荐
相关产品推荐

