You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 10:14:56