페이로드 내에서 사용할 스크립트에서 자동으로 몇 가지 값을 생성 할 수 없습니다.


10

이후에 두 개의 https 요청을 보내 대상 페이지에서 html 요소를 가져 오는 스크립트를 만들었습니다. 내 스크립트는 완벽하게 할 수 있습니다. 그러나 payload대상 페이지에 도달하기 위해 최종 http 요청을 보내려면 크롬 개발 도구에서 4 개의 값을 복사하여 4 개의 키를 채우십시오 . 이것은 시작 링크 이며 다음은 타겟 페이지에 도달하는 방법에 대한 설명입니다.

  1. 버튼을 클릭하십시오 Find Hotel( chek-out날짜가 기본적으로 check-in날짜 보다 하루가 더 긴 경우 날짜 를 변경할 필요가 없습니다 ).
  2. 아래 이미지처럼 상자를 선택하고 Book Now바로 위 의 버튼을 누릅니다. 이제 자동으로 대상 페이지로 연결됩니다.
  3. 이라는 제목의 타겟 페이지에 도달하면 Enter Guest Detailshtml 요소를 구문 분석하십시오.

여기에 이미지 설명을 입력하십시오

나는 (하나를 사용하여) 시도했다.

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내에서 사용하기에 DEV에서 도구를 payload.

페이로드 내에서 사용할 값을 자동으로 채우려면 어떻게해야합니까?


Kamoo의 대답이 충분하지 않습니까? 지시에 따라 결과를 얻을 수 있다고 생각합니다.
tmadam

안녕하세요 @tmadam, 귀하의 개입에 감사드립니다. 예, Kamoo의 답변은 결과를 얻는 방법에 대해 명확하지만 위의 스크립트 내에서 직접 구현할 수 있을지는 의문입니다. 이것이 바로 현상금이 본격적인 답변을 얻도록하는 이유입니다. 감사.
MITHU

아, 알겠습니다 요청하면 @Kamoo가 코드를 제공 할 것이라고 확신합니다.
tmadam

@MITHU 대답을 업데이트했습니다 Btype. 첫 번째 단계에서 선택한 옵션에 해당하는 동적 값일 수 있습니다. PaxConfig승객이 어린이를 포함하는 경우 다른 형식 일 수도 있습니다.
Kamoo

답변:


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은 IS 세션 키, 당신은 이전 응답에서 쉽게 찾을 수 있습니다.

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()
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.