Я пытаюсь создать паука, который аутентифицируется на веб-сайте, отправляя запрос формы, а затем отправляет полезную нагрузку на URL-адрес для получения ответа JSON с необходимой мне информацией.
Проблема в том, что я могуне проверяет, работает ли аутентификация, и кажется, что полезная нагрузка, которую я отправляю позже, имеет какую-то ошибку, поскольку она выдает ошибку POST 500 для веб-страницы.

I 'мы пытались отправить запрос формы, копируя параметры на изображении ниже, получая Viewstate и некоторую другую информацию с помощью селекторов css


Этодля аутентификации.
После аутентификации мне нужно отправить полезную нагрузку на сервер, чтобы я мог получить JSON с нужной мне информацией.
Я получил URL-адрес и данные формы в видениже:


Исходный код из полезной нагрузки:
{"TipoViagem":1,"TipoPesquisa":2,"QuantidadeAdulto":1,"QuantidadeCrianca":0,"QuantidadeBebe":0,"Cabine":"Y","RestricaoPesquisa":null,"IndiceBusca":0,"Observacao":null,"Trechos":[{"OrigemCompleta":"São Paulo / SP, Brasil - Aeroporto Internacional de São Paulo-Guarulhos (GRU)","DestinoCompleto":"Fortaleza / CE, Brasil (FOR)","LocalOrigem":"GRU","LocalDestino":"FOR","Data":"2019-10-25 16:38","DataAtual":1571972400000,"DataMinima":"2018-10-25T00:00:00","Periodo":0,"JanelaTempo":2,"TipoJanelaTempo":1,"PaisOrigem":29,"PaisDestino":29,"CidadeDestino":674,"CidadeOrigem":5287,"MsgFaixaPreco":"","MsgFaixaPeriodo":""},{"OrigemCompleta":"Fortaleza / CE, Brasil (FOR)","DestinoCompleto":"São Paulo / SP, Brasil - Aeroporto Internacional de São Paulo-Guarulhos (GRU)","LocalOrigem":"FOR","LocalDestino":"GRU","Data":"2019-10-26 16:38","DataAtual":1571972400000,"DataMinima":"2018-10-25T00:00:00","Periodo":0,"JanelaTempo":2,"TipoJanelaTempo":1,"PaisOrigem":29,"PaisDestino":29,"CidadeDestino":5287,"CidadeOrigem":674,"MsgFaixaPreco":"","MsgFaixaPeriodo":""}],"FiltrarAeroportosProximos":true,"Provedores":[]}
Код, который я использую ниже (используя scrapy с питоном):
from scrapy.spiders import Spider
from scrapy.utils.response import open_in_browser
from scrapy.http import *
from scrapy.http import Request
import json
class MySpider(Spider):
name = 'Tourhouse'
start_urls = [
'https://www2.itm.tur.br/th/default.aspx?cliente=ambev'
#'http://quotes.toscrape.com/login'
] #FIRST LEVEL
def parse(self, response):
token = response.css('form input::attr(value)').extract()
cookies =response.headers.getlist("set-cookie")
Headers1 = {
':authority' : 'www2.itm.tur.br',
':method' : 'POST',
':path' : '/th/default.aspx?cliente=ambev',
':scheme' : 'https',
'accept' : 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3',
#'accept-encoding' : 'gzip, deflate, br',
#'accept-language' : 'pt-BR,pt;q=0.9,en-US;q=0.8,en;q=0.7',
#'cache-control' : 'max-age=0',
#'content-length' : '25682',
'content-type' : 'application/x-www-form-urlencoded',
'cookie' : cookies,
'origin' : 'https://www2.itm.tur.br',
'referer' : 'https://www2.itm.tur.br/th/default.aspx?cliente=ambev',
#'sec-fetch-mode' : 'navigate',
#'sec-fetch-site' : 'same-origin',
#'sec-fetch-user' : '?1',
#'upgrade-insecure-requests' : '1',
'user-agent' : 'Mozilla / 5.0 (WindowsNT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36',
}
return FormRequest.from_response(response, formdata={
'__LASTFOCUS' : '',
'__EVENTTARGET' : '',
'__EVENTARGUMENT' : '',
'__VIEWSTATE' : token[0],
'__VIEWSTATEGENERATOR' : token[1],
'__VIEWSTATEENCRYPTED' : '',
'LoginView1$Login1$UserName' : '/company/email@company.com.br',
'LoginView1$Login1$User' : 'email@company.com.br',
'LoginView1$Login1$Password' : 'password',
'LoginView1$Login1$LoginButton' : 'Acessar',
'pwrRecuperaSenha$UserNameContainerID$UserName' : '',
}, method='POST', headers=Headers1,dont_filter=True, callback = self.send_payload,cb_kwargs=dict(cookies=cookies))
def send_payload(self, response, cookies):
redirect_url_list = response.request.meta.get('redirect_urls')
url = "https://www2.itm.tur.br/th/nx/api/pesquisas/aereas/brandedFares/?t=2"
print(cookies)
print(redirect_url_list)
Headers2 = {
'authority' : 'www2.itm.tur.br',
'method' : 'POST',
'path' : '/th/nx/api/pesquisas/aereas/brandedFares/?t=2',
'scheme' : 'https',
'accept' : 'application/json, text/plain, */*',
'accept-encoding' : 'gzip, deflate, br',
'accept-language' : 'pt-BR,pt;q=0.9,en-US;q=0.8,en;q=0.7',
'cache-control' : 'max-age=0',
'content-length' : 1106,
'content-type' : 'application/json;charset=UTF-8',
'cookie' : cookies,
'origin' : 'https://www2.itm.tur.br',
'referer' : 'https://www2.itm.tur.br/th/nx/default.aspx',
'sec-fetch-mode' : 'cors',
'sec-fetch-site' : 'same-origin',
'user-agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36',
}
payload = {'TipoViagem': 1,
'TipoPesquisa': 2,
'QuantidadeAdulto': 1,
'QuantidadeCrianca': 0,
'QuantidadeBebe': 0,
'Cabine': 'Y',
'RestricaoPesquisa': '',
'IndiceBusca': 0,
'Observacao': '',
'Trechos': [
{
'OrigemCompleta': 'São Paulo / SP, Brasil - Aeroporto Internacional de São Paulo-Guarulhos (GRU)',
'DestinoCompleto': 'Fortaleza / CE, Brasil (FOR)',
'LocalOrigem' : 'GRU',
'LocalDestino' : 'FOR',
'Data': '2019-10-29 10:43',
'DataAtual': 1572318000000,
'DataMinima': '2018-10-29T00:00:00',
'Periodo': 0,
'JanelaTempo': 2,
'TipoJanelaTempo': 1,
'PaisOrigem': 29,
'PaisDestino': 29,
'CidadeDestino': 674,
'CidadeOrigem': 5287,
'MsgFaixaPreco': '',
'MsgFaixaPeriodo': ''},
{'OrigemCompleta': 'Fortaleza / CE, Brasil (FOR)',
'DestinoCompleto': 'São Paulo / SP, Brasil - Aeroporto Internacional de São Paulo-Guarulhos (GRU)',
'LocalOrigem': 'FOR',
'LocalDestino': 'GRU',
'Data': '2019-10-30 10:43',
'DataAtual': 1572318000000,
'DataMinima': '2018-10-29T00:00:00',
'Periodo': 0,
'JanelaTempo': 2,
'TipoJanelaTempo': 1,
'PaisOrigem': 29,
'PaisDestino': 29,
'CidadeDestino': 5287,
'CidadeOrigem': 674,
'MsgFaixaPreco': '',
'MsgFaixaPeriodo': ''}],
'FiltrarAeroportosProximos': True,
'Provedores': []}
yield Request(url, body = json.dump(payload), method='POST' ,dont_filter=True , headers=Headers2, callback=self.start_scraping)
def start_scraping(self, response):
data = json.loads(response.body)
print(data)
open_in_browser(response)
pass
сЯ ожидал ответа json с необходимой мне информацией, но вместо этого я получаю сообщение об ошибке 500
* ОБНОВЛЕНИЕ: я добавил заголовки, и это сделало работу для аутентификации, но не для запроса POST впоследствии.
Я получаю ошибку 400 для этого второго запроса, я не знаю, передает ли он много информации в заголовках или не проходит проверку подлинности во втором запросе. Я также подозреваю о файлах cookie, так как я не вижу их часть аутентификатора (когда я печатаю его в начале кода), которую можно увидеть внутри файлов cookie с именем «SqlAuthCookie» в браузере.