Utworzyłem skrypt, aby pobrać elementy HTML ze strony docelowej, wysyłając następnie dwa żądania https. Mój skrypt potrafi to zrobić bezbłędnie. Musiałem jednak skopiować cztery wartości z narzędzi chrome dev, aby wypełnić cztery klucze payload
w celu wysłania ostatecznych żądań HTTP do strony docelowej. To jest link początkowy, a poniżej znajduje się opis, w jaki sposób mogłem dotrzeć do strony docelowej.
- Kliknij
Find Hotel
przycisk (nie trzeba zmieniać dat, jeślichek-out
data jest domyślnie co najmniej o jeden dzień dłuższa niżcheck-in
data). - Zaznacz pole jak na obrazku poniżej i naciśnij
Book Now
przycisk tuż nad nim. Teraz powinien automatycznie doprowadzić Cię do strony docelowej. - Po osiągnięciu strony docelowej zatytułowanej jako
Enter Guest Details
, przeanalizuj stamtąd elementy HTML
Próbowałem z (działającym):
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)
W powyższym skrypcie mam skopiowane i wklejone wartość CallFrom
, Btype
, PaxConfig
a usid
od dev narzędzi do użytku wewnątrz payload
.
Jak mogę automatycznie wpisać wartości, które będą używane w ramach ładunku?
python
python-3.x
web-scraping
MITHU
źródło
źródło
Btype
może to być wartość dynamiczna odpowiadająca opcjom wybranym od pierwszego kroku.PaxConfig
może również mieć inny format, jeśli pasażerowie obejmują dzieci.Odpowiedzi:
Parametry wysyłane do drugiego żądania są kodowane w standardzie Base64 , po dekodowaniu są to:
Na pierwszy rzut oka już widać, że są w wzorach:
Gdzie
$date
jest aktualny czas w formacieutc_ts_now.strftime("%I:%M:%S %p")
.W przypadku
$param
sekcji tych czterech parametrów, myślę, że należy to naprawićCallFrom
iBtype
,usid
jest kluczem sesji , można go łatwo znaleźć w poprzedniej odpowiedzi.PaxConfig
liczy się gość, jest on związany zroomConfiguration
tobą wysłanym w pierwszej prośbie.Aby zautomatyzować drugie żądanie, najpierw należy wygenerować zdekodowaną wartość dla każdego parametru, a następnie zakodować je
Base64
.Aktualizacja:
źródło