如何使用requests_html实现等待页面完全加载后再爬取内容?
requests_html等待动态页面加载的实现方法
requests_html可以实现等待页面加载完成的功能,你可以通过调整render()方法的参数满足需求,同时你的现有代码存在一处核心逻辑错误会导致即使渲染完成也拿不到对应内容。
调整要点
- 给
render()方法添加sleep参数:参数单位为秒,代表页面完成基础渲染后额外等待的时长,专门用于应对异步加载内容的页面,这类电商列表页建议设置2~5秒即可。 - 可选添加
timeout参数:设置页面渲染的最长超时时间,避免页面异常时程序长时间卡住,默认值为8秒,可根据网络情况适当调高。 - 修正内容获取逻辑:
response.content是请求返回的原始未渲染静态源码,渲染后的完整页面内容需要从response.html.html属性获取。
修正后代码
from requests_html import HTMLSession from bs4 import BeautifulSoup from lxml import etree s = HTMLSession() response = s.get( 'https://www.dickssportinggoods.com/f/tents-accessories?pageNumber=2') # sleep参数可根据实际加载速度调整,网络差可以适当调大 response.html.render(sleep=3, timeout=20) # 调用渲染后的页面内容 soup = BeautifulSoup(response.html.html, "html.parser") dom = etree.HTML(str(soup)) item = dom.xpath('//a[@class="rs_product_description d-block"]/text()')[0] print(item)
注意事项
首次调用render()方法时会自动下载对应的Chromium内核,等待下载完成即可正常运行。如果调整sleep=3后仍拿不到对应内容,可以尝试继续加大sleep的数值。
内容的提问来源于stack exchange,提问作者Ibtsam Ahmad
相关产品推荐
相关产品推荐

