Я пытаюсь найти информацию о местонахождении в магазине Valero.Используя инструменты разработчика Chrome, я вижу следующие запросы, которые относятся к данным, которые мне в конечном итоге нужно получить (местоположения магазина).Я не уверен, что мне нужно использовать все это, но я включаю их все для справки.
GET запросы в DOC
https://www.valero.com/en-us/ProductsAndServices/Consumers/StoreLocator
- Это URL, который мы видим в chrome
- Здесь указываются файлы cookie и информация о сеансе
- Это нашстартовый запрос
Если мы откроем инструменты разработчика и введем почтовый индекс, мы сможем посмотреть на последующие запросы и то, как возвращаются данные.
https://www.valero.com/en-us/_layouts/15/appredirect.aspx?redirect_uri=https%3A%2F%2Fvaleromaps%2Evalero%2Ecom%2Fhome%3FSPHostUrl%3Dhttps%253A%252F%252Fwww%252Evalero%252Ecom%252Fen%252Dus%26SPHostTitle%3DValero%2520%252D%26SPAppWebUrl%3D%22%22%26SPLanguage%3Den%252DUS%26SPClientTag%3D1%26SPProductNumber%3D15%252E0%252E5047%252E1000%26SenderId%3DC46130E90&client_id=i%3A0i%2Et%7Cms%2Esp%2Eext%7Cb238ea69%2D5f91%2D445c%2D8a7d%2Df55c52f4d807%408bf952c5%2Def34%2D4ac6%2D822d%2D099871ec78da&anon=1 - Это наш запрос parse_page1
POST-запросы в DOC
https://valeromaps.valero.com/home?SPHostUrl=https%3A%2F%2Fwww%2Evalero%2Ecom%2Fen%2Dus&SPHostTitle=Valero%20%2D&SPAppWebUrl=%22%22&SPLanguage=en%2DUS&SPClientTag=1&SPProductNumber=15%2E0%2E5047%2E1000&SenderId=C46130E90 - Это наш запрос parse_page2
GET Запрос в XHR (нужны ли они нам?)
https://www.valero.com/en-us/_api/web/lists/getbytitle('Headerlinks')/items?$orderby=valeroOrder
https://www.valero.com/en-us/_api/web/lists/getbytitle('FooterLinks')/items?$orderby=Group,Order0
https://www.valero.com/en-us/_api/web/lists/getbytitle('Alerts')/items?$filter=Begins%20lt%20datetime%272018-09-19T16:51:52.140Z%27%20and%20Expires%20gt%20datetime%272018-09-19T16:51:52.140Z%27
POST-запрос в XHR
https://valeromaps.valero.com/Home/GetDetailMaster?SPHostUrl=https%3A%2F%2Fwww.valero.com%2Fen-us
- Не думаете, что нам нужен этот запрос?
https://valeromaps.valero.com/Home/Search?SPHostUrl=https%3A%2F%2Fwww.valero.com%2Fen-us
- Это запрос parse_page3, в котором возвращаются наши данные
- должен быть в состоянии напечатать текстовый ответ, содержащий json и все местоположения магазина
Примечания по конфигурации Scrapy
• «COOKIES_ENABLED» = True
• Переопределение Scrapy по умолчаниюuser-agent
Мой код ниже показывает, что я пытаюсь сделать.Установите куки в запросе на запуск, затем отзовитесь на последующие запросы, которые пытаются имитировать то, что происходит на сайте.Проблема, с которой я сталкиваюсь, заключается в том, что файлы cookie устанавливаются после запроса на запуск, а затем передаются в запросе parse_page1, но не передаются ни в одном из последующих запросов, которые, как я считаю, заставляют последний запрос вернутьсообщение «Запрошенный URL был отклонен».вместо мест (хотя ответ 200).Примечание: parse_request () просто распечатывает ответ, а не анализирует местоположения - я обновлю это, как только узнаю, что могу вернуть местоположения.
def start_requests(self):
url = 'https://www.valero.com/en-us/ProductsAndServices/Consumers/StoreLocator'
headers = {
'Connection': 'keep-alive',
'Upgrade-Insecure-Requests': '1',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36',
'DNT': '1',
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',
'Accept-Encoding': 'gzip, deflate, br',
'Accept-Language': 'en-US,en;q=0.9',
'If-Modified-Since': 'Tue, 18 Sep 2018 19:11:50 GMT',
}
yield scrapy.Request(url=url, headers=headers, callback=self.parse_page1)
def parse_page1(self, response):
r = response.text
senderid = re.findall('spAppIFrameSenderInfo\[0\] = new Array\("(.*?)"', r)[0]
url = 'https://www.valero.com/en-us/_layouts/15/appredirect.aspx?redirect_uri=https%3A%2F%2Fvaleromaps%2Evalero%2Ecom%2Fhome%3FSPHostUrl%3Dhttps%253A%252F%252Fwww%252Evalero%252Ecom%252Fen%252Dus%26SPHostTitle%3DValero%2520%252D%26SPAppWebUrl%3D%22%22%26SPLanguage%3Den%252DUS%26SPClientTag%3D1%26SPProductNumber%3D15%252E0%252E5047%252E1000%26SenderId%3D{0}&client_id=i%3A0i%2Et%7Cms%2Esp%2Eext%7Cb238ea69%2D5f91%2D445c%2D8a7d%2Df55c52f4d807%408bf952c5%2Def34%2D4ac6%2D822d%2D099871ec78da&anon=1'.format(senderid)
yield scrapy.Request(url=url, method='POST', callback=self.parse_page2, meta={'senderid': senderid})
def parse_page2(self, response):
senderid = response.meta['senderid']
url = 'https://valeromaps.valero.com/home?SPHostUrl=https%3A%2F%2Fwww%2Evalero%2Ecom%2Fen%2Dus&SPHostTitle=Valero%20%2D&SPAppWebUrl=%22%22&SPLanguage=en%2DUS&SPClientTag=1&SPProductNumber=15%2E0%2E5047%2E1000&SenderId={0}'.format(senderid)
form = {
'SPAppToken': '',
'SPSiteUrl': 'https://www.valero.com/en-us',
'SPSiteTitle': 'Valero -',
'SPSiteLogoUrl': '',
'SPSiteLanguage': 'en-US',
'SPSiteCulture': 'en-US',
'SPRedirectMessage': 'EndpointAuthorityMatches',
'SPErrorCorrelationId': '',
'SPErrorInfo': ''
}
yield scrapy.Request(url=url, method='POST', body=json.dumps(form), callback=self.parse_page3, meta={'senderid': senderid})
def parse_page3(self, response):
url = 'https://valeromaps.valero.com/Home/Search?SPHostUrl=https%3A%2F%2Fwww.valero.com%2Fen-us'
form = {
'NEBound_Lat': '31.943824833980116',
'NEBound_Long': '-94.08231139453125',
'SWBound_Lat': '27.167727791447785',
'SWBound_Long': '-103.12955260546875',
'center_Lat': '29.555776312713952',
'center_Long': '-98.605932',
}
yield scrapy.Request(url=url, method='POST', body=json.dumps(form), callback=self.parse)
def parse_request(self, response):
print(response.text)
Есть ли способ обеспечить сохранение файлов cookie при каждом обратном вызове?Я считаю, что это помогло бы решить проблему, однако, если кто-то заметит лучший способ получения файлов cookie, которые необходимо отправить на запрос, который возвращает данные (# 8 выше), тогда я был бы очень признателен за ваш отзыв.