发送表格请求和有效载荷

时间:2019-10-25 20:15:36

标签: python api scrapy

我正在尝试构建一个蜘蛛,该蜘蛛在发送表单请求的网站中进行身份验证,然后将有效负载发送到URL以接收包含我所需信息的JSON响应。

问题是我无法验证身份验证是否正常,并且随后发送的有效负载似乎存在某种错误,因为它为网页提供了POST错误500。

image

我尝试过发送表单请求,以复制下面的参数,并使用CSS选择器获取Viewstate和其他信息

image2

image3

这是用于身份验证。

身份验证后,我需要将有效负载发送到服务器,以便我可以接收包含所需信息的JSON。

我得到了如下URL和表单数据:

image4

image5

有效负载中的源代码:

{"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中看到。

0 个答案:

没有答案