首页 > 解决方案 > 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-令牌=;

标签: jsonweb-scrapingcookies

解决方案


因此,玩弄了 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 进行硬编码。但是由于某种原因,发布请求不起作用,在这种情况下,获取请求就足够了。


推荐阅读