【问题标题】:Getting a 403 error using Scrapy Request使用 Scrapy 请求获取 403 错误
【发布时间】:2018-06-18 23:50:43
【问题描述】:

当我将 Python requests 模块用于以下 HTTP 请求时,它会返回一个我需要的字典:

import requests

payload = {'x-algolia-application-id':'Q0TMLOPF1J','x-algolia-api-key':'30a0c84a152d179ea8aa1a7a59374d08', 'hitsPerPage':'40', 'numericFilters': ['startdate > 1511095966851'],'facets': '*' }  

url = 'https://q0tmlopf1j-3.algolianet.com/1/indexes/sitecore-events'

r = requests.get(url, params=payload).json()

但是,当我尝试将其实现为一个scrapy请求时,我可以解析结果:

def start_requests(self):
    payload = {'x-algolia-application-id':'Q0TMLOPF1J','x-algolia-api-key':'30a0c84a152d179ea8aa1a7a59374d08', 'hitsPerPage':'40', 'numericFilters': ['startdate > 1511095966851'],'facets': '*' }  

    url = 'https://q0tmlopf1j-3.algolianet.com/1/indexes/sitecore-events'

    yield scrapy.Request(url,
                                   body=json.dumps(payload), 
                                   method='GET',
                                   callback=self.parse_item)

def parse_item(self,response):
    # I want to parse the dict here

我收到 403 错误。我知道我做错了一些简单的事情,是什么?

【问题讨论】:

  • 是的,我试过了。它仍然给出 403。
  • 具体来说:站点 API 返回 API 密钥或应用程序 ID 无效的错误,但事实并非如此,因为相同的凭据使用请求工作。
  • url编码后打印检查
  • 这带来了一个有趣的发现:dict 元素 "'numericFilters': ['startdate > 1511095966851']" 没有被 Scrapy 正确转换为 URL,这就是问题所在。 Requests 将其完全剥离。我从 Scrapy 请求中手动删除了它,因为它是一个无关紧要的过滤器,它可以工作。

标签: python request scrapy


【解决方案1】:

我知道您已经通过省略参数“解决”了问题,但正确的做法是使用FormRequest

yield scrapy.FormRequest(
    url=url,
    method='GET',
    formdata=payload,
    callback=self.parse_item
)

【讨论】:

  • 你的意思是这会正确解析省略的参数吗?它不是;它仍然返回 403 错误。但是,没有它它也可以工作。
  • 非常适合我。我得到与请求相同的响应。
猜你喜欢
  • 2023-04-05
  • 2016-10-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-27
  • 1970-01-01
  • 2013-06-30
  • 1970-01-01
相关资源
最近更新 更多