我正在尝试构建一个蜘蛛,该蜘蛛在发送表单请求的网站中进行身份验证,然后将有效负载发送到URL以接收包含我所需信息的JSON响应。
问题是我无法验证身份验证是否正常,并且随后发送的有效负载似乎存在某种错误,因为它为网页提供了POST错误500。
我尝试过发送表单请求,以复制下面的参数,并使用CSS选择器获取Viewstate和其他信息
这是用于身份验证。
身份验证后,我需要将有效负载发送到服务器,以便我可以接收包含所需信息的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":[]}
我正在使用的代码如下(对python使用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
* UPDATE:我添加了标头,然后完成了身份验证的工作,但之后没有执行POST请求。
此第二个请求出现错误400,我不知道它是否传递给标头中的很多信息,或者是否未在第二个请求中传递身份验证。我还怀疑这些cookie,因为我看不到它的身份验证器部分(当我在代码开头打印它时),该部分可以在浏览器中的名称为“ SqlAuthCookie”的cookie中看到。