无法让我的脚本自动生成一些要在有效负载内使用的值

MIT*_*THU 10 python web-scraping python-3.x

我创建了一个脚本,可通过随后发送两个https请求从目标页面获取html元素。我的脚本可以完美地完成任务。但是,我必须复制chrome开发工具中的四个值以填充其中的四个键payload,以便发送最终的http请求以到达目标页面。这是起始链接,下面是有关如何到达目标页面的说明。

  1. 单击Find Hotel按钮(如果chek-out默认情况下check-in日期比日期长至少一天,则无需更改日期)。
  2. 勾选下图所示的框,然后Book Now按其上方的按钮。现在,它将引导您自动进入目标页面。
  3. 到达标题为的目标页面后Enter Guest Details,从此处解析html元素

在此处输入图片说明

我已经尝试过(使用一个):

import requests
from bs4 import BeautifulSoup

url = 'https://booking.discoverqatar.qa/SearchHandler.aspx?'
second_url = 'https://booking.discoverqatar.qa/PassengerDetails.aspx?'

params = {
    'Module':'H','txtCity':'','hdnCity':'2947','txtHotel':'','hdnHotel':'',
    'fromDate':'05/11/2019','toDate':'07/11/2019','selZone':'','minSelPrice':'',
    'maxSelPrice':'','roomConfiguration':'2|0|','noOfRooms':'1',
    'hotelStandardArray':'63,60,54,50,52,51','CallFrom':'','DllNationality':'-1',
    'HdnNoOfRooms':'-1','SourceXid':'MTEzNzg=','mdx':''
}

payload = {
    'CallFrom':'MToxNjozOCBQTXxCMkN8MToxNjozOCBQTQ==',
    'Btype':'MToxNjozOCBQTXxBfDE6MTY6MzggUE0=',
    'PaxConfig':'MToxNjozOCBQTXwyfDB8MnwwfHwxOjE2OjM4IFBN',
    'usid':'MToxNjozOCBQTXxoZW54dmkzcWVnc3J3cXpld2lsa2ZwMm18MToxNjozOCBQTQ=='  
}

with requests.Session() as s:
    r = s.get(url,params=params,headers={"User-agent":"Mozilla/5.0"})
    res = s.get(second_url,params=payload,headers={
        "User-agent":"Mozilla/5.0",
        "Referer":r.url
        })
    soup = BeautifulSoup(res.text,'lxml')
    print(soup)
Run Code Online (Sandbox Code Playgroud)

在上面的脚本中,我已经复制和值粘贴CallFromBtypePaxConfigusid从开发工具中使用payload

如何自动填写要在有效负载内使用的值?

Kam*_*moo 5

发送到第二个请求的参数是Base64编码的,在解码后它们是:

    'CallFrom':'1:16:38 PM|B2C|1:16:38 PM',
    'Btype':'1:16:38 PM|A|1:16:38 PM',
    'PaxConfig':'1:16:38 PM|2|0|2|0||1:16:38 PM',
    'usid':'1:16:38 PM|henxvi3qegsrwqzewilkfp2m|1:16:38 PM'  
Run Code Online (Sandbox Code Playgroud)

乍一看,您已经注意到它们的模式如下:

$date|$param|$date
Run Code Online (Sandbox Code Playgroud)

$date当前时间在哪里,格式为utc_ts_now.strftime("%I:%M:%S %p")

对于$param这四个参数的部分,我想应该将其固定为CallFromBtypeusid它是会话密钥,您可以在上一个响应中轻松找到它。

PaxConfig是客人人数,与roomConfiguration您在第一个请求中发送的相关。

要自动执行第二个请求,您将首先为每个参数生成解码后的值,然后使用对其进行编码Base64

更新:

    'CallFrom':'1:16:38 PM|B2C|1:16:38 PM',
    'Btype':'1:16:38 PM|A|1:16:38 PM',
    'PaxConfig':'1:16:38 PM|2|0|2|0||1:16:38 PM',
    'usid':'1:16:38 PM|henxvi3qegsrwqzewilkfp2m|1:16:38 PM'  
Run Code Online (Sandbox Code Playgroud)