每当我想在www.example.com上刮amazon.com,我都失败了。因为产品信息会根据amazon.com中的位置而变化
此变更信息如下:
- 1-价格
- 2-运费
- 3-报关费
- 4-发运状态
改变 selenium 的位置是简单的,但处理速度非常慢。所以这就是为什么我需要刮与scrapy或请求。
然而,尽管我在浏览器中模仿了cookie和标题,但amazon.com不允许我更改位置。
有两个大问题。
1.有一个名为“ubid-main”的数据,我无法导出此数据的副本。这是没有数据的亚马逊。它不允许更改位置。
1.虽然我对标头数据做了同样的处理,但输出数据之间有一个区别。我在浏览器中使用了完全相同的头,但是在浏览器中Content-Type是json,但是在我编写的代码中,它是text / html;字符集= UTF-8。
有趣的是,没有关于这个主题的信息,你无法对世界第一的购物网站进行定位抓取。
请大家告诉我谁知道这个问题的答案。如果有一个解决方案作为scrapy或要求,这是足够的。说真的,我没有解决这个问题一年。
import requests
from lxml import etree
from random import choice
from urllib3.exceptions import InsecureRequestWarning
import urllib.parse
import urllib3.request
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
def location():
headersdelivery = {
'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.190 Safari/537.36',
'content-type':'application/x-www-form-urlencoded',
'accept':'text/html,*/*',
'x-requested-with':'XMLHttpRequest',
'contenttype':'application/x-www-form-urlencoded;charset=utf-8',
'origin':'https://www.amazon.com',
'sec-fetch-site':'same-origin',
'sec-fetch-mode':'cors',
'sec-fetch-dest':'empty',
'referer':'https://www.amazon.com/',
'accept-encoding':'gzip, deflate, br',
'accept-language':'tr-TR,tr;q=0.9,en-US;q=0.8,en;q=0.7'
}
payload = {
'locationType':'LOCATION_INPUT',
'zipCode':'34249',
'storeContext':'generic',
'deviceType':'web',
'pageType':'Gateway',
'actionSource':'glow',
'almBrandId':'undefined'}
sessionid = requests.session()
url = "https://www.amazon.com/gp/delivery/ajax/address-change.html"
ulkesecmereq = sessionid.post(url, headers=headersdelivery, data=payload,verify=False)
return sessionid
def response(locationsession):
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.190 Safari/537.36',
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
'Accept-Language': 'en-US,en;q=0.5',
'Accept-Encoding': 'gzip, deflate, br',
'Connection': 'keep-alive',
'Upgrade-Insecure-Requests': '1',
'TE': 'Trailers'}
postdata = {
'storeContext':'generic',
'pageType':'Gateway'
}
req = locationsession.post("https://www.amazon.com/gp/glow/get-location-label.html",headers=headers, data=postdata, verify=False)
print(req.content)
locationsession = location()
response(locationsession)
2条答案
按热度按时间55ooxyrt1#
首先,你应该从基础amazon页面获得令牌
anti-csrftoken-a2z
:1.使用特定的用户代理向
www.amazon.com
发出请求:Mozilla ...
1.通过XPATH选择器获取JSON数据:
//span[@id='nav-global-location-data-modal-action']/@data-a-modal
此选择器的JSON示例:
1.为下一个请求生成标头:
1.向链接发出请求:https://www.amazon.com/gp/glow/get-address-selections.html?deviceType=desktop&pageType=Gateway&storeContext=NoStoreName&actionSource=desktop-modal,其中包含步骤2中的标头和步骤1中的响应Cookie。
1.从响应中提取
CSRF_TOKEN
:正则表达式:'CSRF_TOKEN : "(.+?)"'
1.为下一个请求生成标头:
1.向以下对象发出POST请求:
https://www.amazon.com/gp/delivery/ajax/address-change.html
与表单数据:带有步骤5中的头和步骤3中的响应cookie。
如果所有的文件你都应该得到这样的响应:
1.保存步骤6中的响应cookie,并将其用于后续请求
具有所有逻辑的Python脚本:
同样,使用Scrapy Framework的类似逻辑:
Shell命令:
ht4b089n2#
我在标头中看到了CSRF令牌(anti-csrftoken-a2 z),您在位置请求中没有看到它,还有一个位置请求(https://www.amazon.co.uk/gp/glow/get-address-selections.html?deviceType=desktop&pageType=Gateway&storeContext=NoStoreName&actionSource=desktop-modal)也没有看到。您应该像在浏览器中一样实现所有请求。
Chrome中的简单示例:
Chrome -> devtools -> network -> XHR
copy as curl
复制并转换为此处的请求库(https://curl.trillworks.com/)。