Python爬虫因JavaScript导致请求结果与网页不符,无法获取产品链接
解决BC Liquor Stores产品链接爬取问题
页面依赖JavaScript渲染,但这类电商网站通常会通过后端API异步加载产品数据,而非直接在初始HTML中渲染。你之前用的requests、urllib只能拿到初始静态HTML,requests_html的渲染可能未等待API请求完成,所以找不到/product/链接。
最优方案:直接调用产品数据API
- 打开浏览器开发者工具(F12),切换到「Network」标签,刷新目标页面。
- 筛选「XHR」或「Fetch」类型的请求,查找返回产品列表的接口(通常URL包含
api、product等关键词)。 - 复制该API的请求URL、参数和请求头,直接用requests请求即可获取结构化的产品数据,从中提取链接或拼接
/product/格式的URL。
代码示例(基于常见API结构)
import requests # 替换为你找到的实际API地址 api_url = "https://www.bcliquorstores.com/api/product-catalogue" # 原页面的查询参数直接复用 params = { "categoryclass": "coolers & ciders", "special": "new product", "sort": "name.raw:asc", "page": 1 } headers = { "Host": "www.bcliquorstores.com", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/111.0", "Accept": "application/json", "Accept-Language": "en-US,en;q=0.7,fa;q=0.3", "X-Requested-With": "XMLHttpRequest" # 多数异步API需要此请求头 } # 发起API请求 response = requests.get(api_url, params=params, headers=headers) product_data = response.json() # 提取并生成产品链接(根据实际返回的字段调整,比如urlSlug、productId等) for item in product_data.get("items", []): product_link = f"https://www.bcliquorstores.com/product/{item['urlSlug']}" print(product_link)
备选方案:优化requests_html渲染
如果暂时找不到API,可尝试延长渲染等待时间,确保API请求完成:
from requests_html import AsyncHTMLSession asession = AsyncHTMLSession() r = await asession.get(url, headers=headers) # 延长等待时间,确保页面完全加载 await r.html.arender(wait=5, scrolldown=1) # 直接提取所有产品链接元素 product_links = r.html.find("a[href*='/product/']") for link in product_links: print(link.attrs['href'])
优先推荐API方案,比模拟浏览器渲染更高效、稳定,也避免了Selenium的繁琐。
内容的提问来源于stack exchange,提问作者LoMaPh
相关产品推荐
相关产品推荐

