如何仅用Requests库爬取StockX站点AJAX异步加载的完整页面内容
核心原因
你用Requests请求拿到的只是服务端返回的静态HTML代码,Requests本身不支持执行JavaScript,所以哪怕你加了sleep等待也无法触发AJAX请求加载后续内容,这和浏览器加载页面的逻辑完全不同。
纯Requests实现方案
1. 直接调用站点内部AJAX接口
- 打开浏览器的F12开发者工具,切换到「网络」标签,筛选「Fetch/XHR」分类后刷新目标页面,找到返回你所需动态内容的接口,StockX的商品数据大多由
api.stockx.com域名下的接口返回,返回格式为结构化JSON,比解析HTML更高效。 - 复制该接口的完整请求头、查询参数、有效Cookie,直接用Requests发起请求即可拿到全量数据。
2. 提取页面内嵌的初始数据
StockX会把基础商品数据预先注入到静态HTML的<script>标签中,你可以通过正则匹配提取这段JSON数据,无需额外调用接口:
import requests import re import json from bs4 import BeautifulSoup session = requests.Session() # 补齐所有浏览器请求该页面时带的请求头,不要只传User-Agent headers = { 'User-Agent': 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:80.0) Gecko/20100101 Firefox/80.0', 'Accept-Language': 'en-US,en;q=0.5', 'Referer': 'https://stockx.com/', 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8' } # 补齐浏览器中获取的有效Cookie,尤其是stockx_session字段 cookies = { 'stockx_homepage': "sneakers", } mainURL = "https://stockx.com/adidas-crazy-byw-x-2-ubiq" resp = session.get(mainURL, headers=headers, cookies=cookies) # 匹配页面内嵌的全局数据变量 data_pattern = re.compile(r'window.__INITIAL_STATE__ = (.*?);', re.S) match_res = data_pattern.findall(resp.text) if match_res: product_data = json.loads(match_res[0])['product'] # 直接从结构化数据中取所需字段即可 print(product_data)
注意事项
- StockX反爬机制较严,请求时必须把
x-api-key、stockx_session这类校验字段补充完整,否则会被拦截。x-api-key可以从浏览器请求头中复制,也可以从页面加载的JS文件中提取,有效期较长。 - 控制请求频率,单次请求间隔不低于3秒,IP被限制时可搭配代理IP池使用。
内容的提问来源于stack exchange,提问作者hassan
相关产品推荐
相关产品推荐

