正如上面的标题所述,我收到 403 错误。生成的 URL 是有效的,我可以打印它们,然后在浏览器中打开它们就可以了。
我有一个用户代理,它与我的浏览器在访问我想直接从 Chrome 开发工具中抓取的页面时发送的用户代理完全相同。我尝试过使用会话而不是直接请求,我尝试过使用 urllib,并且我尝试过使用通用 request.get。
这是我正在使用的代码,即 403。与 request.get 等结果相同。
headers = {'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.157 Safari/537.36'}
session = requests.Session()
req = session.get(URL, headers=headers)
所以,是的,我假设我没有创建用户代理写入,所以它可以告诉我正在抓取。但我不确定我错过了什么,或者如何找到它。
我从 DevTools 获取了所有标头,然后开始一一删除标头,我发现它只需要
Accept-Language
并且不需要 User-Agent
并且不需要 Session。
import requests
url = 'https://www.g2a.com/lucene/search/filter?&search=The+Elder+Scrolls+V:+Skyrim¤cy=nzd&cc=NZD'
headers = {
'Accept-Language': 'en-US;q=0.7,en;q=0.3',
}
r = requests.get(url, headers=headers)
data = r.json()
print(data['docs'][0]['name'])
结果:
The Elder Scrolls V: Skyrim Special Edition Steam Key GLOBAL
添加一些标题如下(不仅是
User-Agent
):
def start_requests(self):
headers = {
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8',
'Accept-Encoding': 'gzip, deflate, br',
'Accept-Language': 'en-US,en;q=0.5',
'Connection': 'keep-alive',
'Cookie': 'AMCV_0D15148954E6C5100A4C98BC%40AdobeOrg=1176715910%7CMCIDTS%7C19271%7CMCMID%7C80534695734291136713728777212980602826%7CMCAAMLH-1665548058%7C7%7CMCAAMB-1665548058%7C6G1ynYcLPuiQxYZrsz_pkqfLG9yMXBpb2zX5dvJdYQJzPXImdj0y%7CMCOPTOUT-1664950458s%7CNONE%7CMCAID%7CNONE%7CMCSYNCSOP%7C411-19272%7CvVersion%7C5.4.0; s_ecid=MCMID%7C80534695734291136713728777212980602826; __cfruid=37ff2049fc4dcffaab8d008026b166001c67dd49-1664418998; AMCVS_0D15148954E6C5100A4C98BC%40AdobeOrg=1; s_cc=true; __cf_bm=NIDFoL5PTkinis50ohQiCs4q7U4SZJ8oTaTW4kHT0SE-1664943258-0-AVwtneMLLP997IAVfltTqK949EmY349o8RJT7pYSp/oF9lChUSNLohrDRIHsiEB5TwTZ9QL7e9nAH+2vmXzhTtE=; PHPSESSID=ddf49facfda7bcb4656eea122199ea0d',
'If-Modified-Since': 'Tue, 04 May 2021 05:09:49 GMT',
'If-None-Match': 'W/"12c6a-5c17a16600f6c-gzip"',
'Sec-Fetch-Dest': 'document',
'Sec-Fetch-Mode': 'navigate',
'Sec-Fetch-Site': 'none',
'Sec-Fetch-User': '?1',
'TE': 'trailers',
'Upgrade-Insecure-Requests': '1',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:105.0) Gecko/20100101 Firefox/105.0'
}
for url in self.start_urls:
yield Request(url, headers=headers)