使用Python的requests_html爬取动态网站遇AsyncHTMLSession属性错误
解决AsyncHTMLSession爬取SEC动态页面的AttributeError问题
问题根源
session.get(url)是异步方法,直接赋值给response得到的是异步任务对象(_asyncio.Future),不是实际的响应对象,所以根本没有html属性。必须用await等待这个异步请求完成,才能拿到带html属性的响应实例。
修正后的可运行代码
import asyncio from requests_html import AsyncHTMLSession async def crawl_sec_report(): url = "https://www.sec.gov/ix?doc=/Archives/edgar/data/0000789019/000095017023035122/msft-20230630.htm" # 加浏览器请求头,绕SEC的反爬拦截 headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36' } session = AsyncHTMLSession() # 核心:await session.get()才能拿到真正的响应 response = await session.get(url, headers=headers) # 等待JS渲染页面,sleep参数给足时间加载动态内容 await response.html.arender(sleep=3) # 输出结果 print(response.html) print(response.html.html) # 关闭会话 await session.close() # 启动异步函数 asyncio.run(crawl_sec_report())
必看注意点
- 所有异步操作(
session.get()、arender()、session.close())都必须加await,不然会直接返回任务对象而非结果 - SEC官网反爬严格,必须加
User-Agent,否则大概率返回403禁止访问 - 如果页面加载慢,把
arender()里的sleep调大(比如sleep=5),确保动态内容完全渲染
内容的提问来源于stack exchange,提问作者moyato
相关产品推荐
相关产品推荐

