json - Web 抓取隐藏 API - 请求标头、cookie 和 XSFR-TOKEN 处理
问题描述
我找到了一个包含页面所有数据的 json 文件。我在浏览器中注意到,下载网页后,js 会发送一个 POST 请求来加载 json 文件。如果我将 json 文件链接直接放在浏览器中,则它是一个 GET 请求。获取网页并使用相关cookie来请求json文件而不是直接请求json链接是更好的做法吗?这种方式看起来更像普通用户?
我还在 POST 和 GET 请求中看到发送了 XSRF-TOKEN。我想这是请求中需要的吗?
这是 POST 与 GET 请求(去掉了分析和第三个工具 cookie)。标头中的哪些项目最好包含在请求中?计划轮换用户代理和 IP。
POST
Host:
Connection: keep-alive
Content-Length: 2
Accept: application/json, text/plain, /
X-XSRF-TOKEN:
ADRUM: isAjax:true
User-Agent:
Content-Type: application/json;charset=UTF -8
来源:
Sec-Fetch-Site:same-origin
Sec-Fetch-Mode:cors
Sec-Fetch-Dest:空
Referer:
Accept-Encoding:gzip,deflate,br
Accept-Language:en,en-US
Cookie:JSESSIONID =; XSRF-令牌=;
获取
主机:
连接:
升级不安全请求:1
用户代理:
接受:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng, / ;q=0.8,应用程序/签名交换;v=b3;q=0.9
Sec-Fetch-Site:无
Sec-Fetch-Mode:导航
Sec-Fetch-Dest:文档
接受编码:gzip、deflate、br
接受语言:en、en -美国
饼干:JSESSIONI=; XSRF-令牌=;
解决方案
因此,玩弄了 javascript 为获取所需数据而发出的 HTTP 请求。这是我想出的代码。我基本上只是删除了字典键和值,直到达到最低要求。
在 chrome 工具中,您可以通过检查页面并转到网络工具来访问 XHR。它发出三个请求,其中两个使用您找到的相同 JSON 文件。您可以将此请求复制为 cURL 命令。将其输入 curl.trillworks.com 可为您提供发出该请求所需的标头、参数和 cookie。我通常会玩,直到获得发出服务器请求所需的最低限度。在这种情况下,您确实需要 cookie 令牌和 JSESSIONID。
因此,为了发出请求,您需要一个新的 X-XSFR 令牌和 JSESSIONID。第一个示例是硬编码的,这只是为了准确说明需要什么。第二个示例是如何使用请求获取 cookie,然后使用它来获取 json 对象而无需硬编码。
硬编码 cookie 代码示例
import requests
cookies = {'JSESSIONID': '6502ACBC7179AAE392EA41A187396ADA.app18'}
headers = {
'X-XSRF-TOKEN': '19672e30-69ca-420e-b649-a7e45031cda6',
'Content-Type': 'application/json;charset=UTF-8'
}
response = requests.post('https://www.tedbaker.com/uk/json/c/category_womens_clothing', headers=headers, cookies=cookies)
response.json()
输出
{'success': True,
'data': {'results': [{'code': '245655-BLACK',
'name': 'Ditsy floral midi dress',
'url': '/uk/Womens/Clothing/Dresses/PHILINA-Ditsy-floral-midi-dress-Black/p/245655-BLACK',
'stock': {'stockLevelStatus': {'code': 'inStock',
'type': 'StockLevelStatus'},
'shippedFromStore': False},
'price': {'currencyIso': 'GBP',
'value': 99.0,
'priceType': 'BUY',
'formattedValue': '£99.00'}, ....
带有 cookie 的代码示例请求
s = requests.Session()
cookies = s.get('https://www.tedbaker.com/uk/Womens/Clothing/c/category_womens_clothing').cookies
headers = {
'Content-Type': 'application/json;charset=UTF-8'
}
response = s.get('https://www.tedbaker.com/uk/json/c/category_womens_clothing', headers=headers, cookies=cookies)
response.json()
解释
我们创建了一个请求会话,因此无论我们发出什么 HTTP 请求,该会话都保持打开状态。在这种情况下,我们向实际的网站地址发出 HTTP Get 请求,从而获取 cookie。然后,我们使用这些 cookie 以及获取 JSON 对象所需的标头的最小输入。
无需对 cookie 进行硬编码。但是由于某种原因,发布请求不起作用,在这种情况下,获取请求就足够了。
推荐阅读
- javascript - 如何使用 sinon 存根非对象函数
- okta - 如何在没有回调的情况下获得 OKTA 隐式响应(桌面应用程序)
- excel - VBA将工作表(带变量名)从另一个工作簿复制到当前工作簿并在当前工作簿中重命名
- python - 类方法 TypeError "Int object not callable"
- ionic-framework - Ionic 4 + FCM - 如何自定义 Firebase 云消息 (FCM) 通知图标和颜色?
- ansible - 数组上的数组创建文件夹ansible
- javascript - 为什么这个 Javascript 代码没有添加到输入中?
- android - 为什么回收站视图中的第一个元素显示不正确?
- dictionary - 在clojure中关联地图中的值
- c# - 从客户端 C# 使用服务器端 PHP 代码