python - 无法让我的脚本自动生成几个值以在有效负载中使用

标签 python python-3.x web-scraping

我创建了一个脚本,通过随后发送两个 https 请求来从目标页面获取 html 元素。我的脚本可以完美地完成这件事。但是,我不得不从 chrome 开发工具中复制四个值来填充 payload 中的四个键。为了发送最终的http请求到达目标页面。这是 starting link 以下是关于我如何到达目标页面的描述。

  • 点击 Find Hotel按钮(如果 chek-out 日期默认至少比 check-in 日期长一天,则无需更改日期)。
  • 勾选下图所示的框,然后按 Book Now按钮就在它上面。现在,它应该会自动引导您到目标页面。
  • 到达标题为 Enter Guest Details 的目标页面后, 从那里解析 html 元素

  • enter image description here

    我试过(工作一个):
    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)
    

    在上面的脚本中,我复制并粘贴了 CallFrom 的值。 , Btype , PaxConfigusid从开发工具中使用 payload .

    How can I fill in the values automatically to be used within payload?

    最佳答案

    发送到第二个请求的参数是 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'  
    

    乍一看,您已经注意到它们具有以下模式:
    $date|$param|$date
    

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

    对于 $param这四个参数的部分,我想应该是固定为CallFromBtype , usid session 关键,您可以在之前的回复中轻松找到它。
    PaxConfig是客人数,它与roomConfiguration有关您发送了第一个请求。

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

    更新:

    #!/usr/bin/env python3.7
    import base64
    from datetime import datetime
    
    import requests
    
    
    def first_request(session, params):
        url = 'https://booking.discoverqatar.qa/SearchHandler.aspx'
        r = session.get(url, params=params)
        return r
    
    
    def second_request(session, params):
        url = 'https://booking.discoverqatar.qa/PassengerDetails.aspx'
        r = session.get(url, params=params)
        return r
    
    
    def main():
        params1 = {
            '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':                ''
        }
        session = requests.Session()
        _ = first_request(session, params1)
        asp_session = session.cookies.get("ASP.NET_SessionId")
    
        params2 = {
            # Could related to options "Available" / "On Request"
            "Btype":     "A",
    
            # Try out other guest counts to make sure
            "PaxConfig": params1["roomConfiguration"] * 2,
    
            "CallFrom": "B2C",
            "usid":     asp_session
        }
        date = datetime.utcnow().strftime("%I:%M:%S %p")
        for k, v in params2.items():
            v = "|".join([date, v, date])
            v = base64.b64encode(bytes(v, "utf-8")).decode("utf-8")
            params2[k] = v
        r = second_request(session, params2)
        print(r.text)
    
    
    if __name__ == '__main__':
        main()
    

    关于python - 无法让我的脚本自动生成几个值以在有效负载中使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58612344/

    相关文章:

    python - TensorFlow 中不同类型的划分

    python - print 的 end 参数会导致 time.sleep 的不同行为

    python-3.x - 查找图像中圆的质心和颜色值

    html - 尝试收集产品价格信息时,rvest 网络抓取返回空数据框

    javascript - Node 骑士调用队列

    java - 正则表达式不匹配

    python - 字典分解并创建具有相同值的新字典

    python - PyCharm:在区域上运行 `black -S`

    python - 类中的类定义?

    class - class() : and class(object): in python 2. 6-3.x 之间有区别吗?