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

Python/requests_html问题:HTMLSession无法在现有事件循环中运行

亚马逊爬取问题解决方案

1. 修复事件循环错误

原代码使用HTMLSession同步会话调用render()触发错误,因为render()依赖异步的Pyppeteer,必须改用AsyncHTMLSession异步会话:

from requests_html import AsyncHTMLSession
import asyncio

async def crawl_amazon_model():
    async with AsyncHTMLSession() as session:
        # 添加自定义UA,避免被反爬拦截
        headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36'
        }
        r = await session.get('https://www.amazon.com/dp/B07BR3F9N6', headers=headers)
        # 渲染页面,等待2秒确保动态内容加载完成
        await r.html.render(sleep=2)
        
        # 调整XPath,通过文本特征定位目标元素
        target_elements = r.html.xpath("//span[contains(text(), 'Ender 3')]/text()")
        if target_elements:
            # 提取并清理文本,得到"Ender 3"
            print(target_elements[0].strip())
        else:
            print("未找到目标型号内容")

# 执行异步函数
asyncio.run(crawl_amazon_model())

2. 解决XPath返回空列表问题

原XPath//ul/li[3]/span/span[2]失效的核心原因:

  • 亚马逊页面结构动态变化,固定的li索引([3])不可靠
  • 目标内容是动态加载的,未渲染前无法获取

调整后的定位逻辑更稳定:

  • 用contains(text(), 'Ender 3')直接筛选包含目标文本的元素
  • 若需要更精准,可结合元素属性(比如class)定位,例如查找产品规格栏的型号字段:
    # 定位规格表中的型号项
    model_item = r.html.xpath("//th[contains(text(), 'Model')]/following-sibling::td/span/text()")
    

3. 反爬注意事项

  • 必须添加真实的User-Agent,否则会被亚马逊拦截
  • 控制请求频率,避免短时间内多次请求导致IP被封
  • 若渲染仍失败,可尝试增加sleep时长,或设置timeout参数

内容的提问来源于stack exchange,提问作者anderwyang

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 00:39:18