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
相关产品推荐
相关产品推荐

