【发布时间】: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 请求中手动删除了它,因为它是一个无关紧要的过滤器,它可以工作。