Неможливо дозволити моєму сценарію автоматично генерувати декілька значень, які будуть використані в межах корисного навантаження


10

Я створив сценарій для отримання елементів html з цільової сторінки, надсилаючи згодом два https-запити. Мій сценарій може зробити цю справу бездоганно. Однак мені довелося скопіювати чотири значення з інструментів хромованого розробника, щоб заповнити чотири ключі всередині 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)

У наведеному вище сценарії я скопіювати і вставити значення CallFrom, Btype, PaxConfigі usidвід розробника інструментів для використання в payload.

Як я можу автоматично заповнити значення, які будуть використовуватися в межах корисного навантаження?


Чи не є відповідь Камоо достатньою? Я думаю, що міг би отримати результати, дотримуючись їхніх вказівок.
tmadam

Привіт @tmadam, дякую за ваше втручання. Так, відповідь Камоо пояснює, як я можу отримати результати, але я дуже сумніваюся, що я можу це реалізувати самостійно в рамках вищезазначеного сценарію, і саме тому я встановив щедрості, щоб отримати повноцінну відповідь. Дякую.
МІТУ

А, бачу. Я впевнений, що @Kamoo надасть код, якщо його запитають.
tmadam

@MITHU Я оновив свою відповідь, зауважте, що Btypeможе бути динамічне значення, що відповідає опціям, вибраним на першому кроці. PaxConfigможе також бути в іншому форматі, якщо серед пасажирів є діти.
Камоо

Відповіді:


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'  

З першого погляду ви вже помічаєте, що вони в моделях:

$date|$param|$date

Де $dateпоточний час у форматі utc_ts_now.strftime("%I:%M:%S %p").

Для $paramчастини цих чотирьох параметрів, я припускаю , що це має бути виправлено на CallFromі Btype, usidє сесія ключ, ви можете легко знайти її в попередній відповіді.

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()
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.