Không thể để tập lệnh của tôi tự động tạo ra một vài giá trị trong tải trọng


10

Tôi đã tạo một tập lệnh để lấy các phần tử html từ trang đích bằng cách gửi hai yêu cầu https sau đó. Kịch bản của tôi có thể làm điều hoàn hảo. Tuy nhiên, tôi đã phải sao chép bốn giá trị từ các công cụ phát triển chrome để điền vào bốn khóa bên payloadtrong để gửi các yêu cầu http cuối cùng để đến trang đích. Đây là liên kết bắt đầu và sau đây là mô tả về cách tôi có thể tiếp cận trang đích.

  1. Nhấp vào Find Hotelnút (không cần thay đổi ngày nếu chek-outngày theo mặc định ít nhất một ngày dài hơn check-inngày).
  2. Đánh dấu vào ô như hình bên dưới và nhấn Book Nownút ngay phía trên nó. Bây giờ, nó sẽ tự động dẫn bạn đến trang đích.
  3. Khi đến trang đích có tiêu đề là Enter Guest Details, phân tích các phần tử html từ đó

nhập mô tả hình ảnh ở đây

Tôi đã thử với (làm việc một):

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)

Trong kịch bản trên, chúng tôi đã sao chép và dán giá trị của CallFrom, Btype, PaxConfigusidtừ dev công cụ để sử dụng trong phạm vi payload.

Làm cách nào tôi có thể tự động điền các giá trị được sử dụng trong tải trọng?


Câu trả lời của Kamoo có đủ không? Tôi nghĩ rằng tôi có thể nhận được kết quả, làm theo hướng dẫn của họ.
tmadam

Xin chào @tmadam, cảm ơn sự can thiệp của bạn. Vâng, câu trả lời của Kamoo làm rõ làm thế nào tôi có thể nhận được kết quả nhưng tôi rất nghi ngờ tôi có thể tự thực hiện nó trong kịch bản trên và đó là lý do tôi đặt tiền thưởng để có được câu trả lời đầy đủ. Cảm ơn.
MITHU

Ah tôi thấy. Tôi chắc chắn @Kamoo sẽ cung cấp mã nếu được hỏi.
tmadam

@MITHU Tôi đã cập nhật câu trả lời của mình, xin lưu ý rằng đó Btypecó thể là giá trị động tương ứng với các tùy chọn được chọn từ bước đầu tiên. PaxConfigcũng có thể ở một định dạng khác nếu hành khách bao gồm trẻ em.
Kamoo

Câu trả lời:


5

Params được gửi đến yêu cầu thứ hai được hóa Base64 , sau khi giải mã chúng là:

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

Thoạt nhìn, bạn đã nhận thấy chúng có dạng:

$date|$param|$date

Trong trường hợp $datelà thời gian hiện tại trong định dạng của utc_ts_now.strftime("%I:%M:%S %p").

Đối với $paramphần của bốn tham số này, tôi đoán nó nên được sửa cho CallFromBtype,usidphiên quan trọng, bạn có thể tìm thấy nó dễ dàng trong việc ứng phó trước.

PaxConfig là số lượng khách, nó liên quan đến roomConfiguration bạn được gửi trong yêu cầu đầu tiên.

Để tự động hóa yêu cầu thứ hai, bạn sẽ tạo giá trị được giải mã cho từng tham số trước, sau đó mã hóa chúng bằng Base64 .

Cập nhật:

#!/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()
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.