Betiğimin faydalı yükte kullanılmak üzere otomatik olarak birkaç değer üretmesine izin verilemiyor


10

Daha sonra iki https isteği göndererek hedef sayfadan html öğelerini almak için bir komut dosyası oluşturdum. Senaryom bunu kusursuz bir şekilde yapabilir. Ancak, payloadhedef sayfaya ulaşmak için nihai http isteklerini göndermek için dört değeri doldurmak için chrome dev araçlarından dört değeri kopyalamak zorunda kaldım . Bu başlangıç ​​bağlantısıdır ve hedef sayfaya nasıl ulaşabileceğimin açıklaması aşağıdadır.

  1. Tıklayın Find Hoteldüğmesiyle (eğer tarihleri değiştirmek gerek chek-outtarihi en az bir gün daha uzun varsayılan olarak check-intarih).
  2. Aşağıdaki görüntü gibi kutuyu işaretleyin ve Book Nowhemen üstündeki düğmeye basın . Şimdi sizi otomatik olarak hedef sayfaya yönlendirmelidir.
  3. Olarak adlandırılan hedef sayfaya ulaştıktan sonra Enter Guest Details, html öğelerini oradan ayrıştırın

resim açıklamasını buraya girin

Ben denedim (çalışan bir):

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)

Yukarıdaki komut dosyasında ben kopyaladıktan ve değerini yapıştırılan CallFrom, Btype, PaxConfigve usidiçinde kullanılmak üzere dev gelen araçlar payload.

Yükte kullanılacak değerleri otomatik olarak nasıl doldurabilirim?


Kamoo'nun cevabı yeterli değil mi? Bence onların talimatlarını takip ederek sonuç alabildim
tmadam

Merhaba @madamdam, müdahalen için teşekkürler. Evet, Kamoo'nun cevabı sonuçları nasıl elde edebileceğimi açıklığa kavuşturuyor, ancak yukarıdaki senaryo içinde kendim uygulayabileceğimden şüpheliyim ve bu yüzden tam teşekküllü bir cevap almak için ödülü ayarlamamın nedeni budur. Teşekkürler.
MITHU

Ah, anlıyorum. Eminim @Kamoo istenirse kod sağlayacaktır.
tmadam

@MITHU Cevabımı güncelledim, lütfen Btypeilk adımdan seçilen seçeneklere karşılık gelen dinamik bir değer olabileceğini unutmayın . PaxConfigyolcular çocukları içeriyorsa farklı bir biçimde de olabilir.
Kamoo

Yanıtlar:


5

İkinci isteğe gönderilen parametreler Base64 kodludur, kod çözme işleminden sonra:

    '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'  

İlk bakışta, bunların şu kalıplarda olduğunu fark ettiniz:

$date|$param|$date

Biçiminde $dategeçerli saat nerede utc_ts_now.strftime("%I:%M:%S %p").

İçin $parambu dört parametre bölümünde, bunu için sabit olmalıdır tahmin CallFromve Btype, usidolduğu seans anahtarı, önceki yanıtta kolayca bulabilirsiniz.

PaxConfigkonuk sayısıdır, roomConfigurationilk istekte size gönderilir.

İkinci isteği otomatikleştirmek için, önce her bir parametre için kodu çözülen değeri oluşturur, ardından bunları kodlarsınız Base64.

Güncelleme:

#!/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()
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.