Home / Uncategorized / Robotukai: POST requests

Robotukai: POST requests

Kai kuriems duomenų šaltinims duomenis nuskaityti reikia per POST tipo užklausa, o ne GET. Šiame pavyzdyje aprašysime kaip nuskaityti duomenis Python programavimo kalboje naudojant POST užklausas.

POST užklausos. Jas skiriasi nuo GET užklausų pagrinde tuom, kaip perduodami duomenys iš naršyklės serveriui. Naudojant GET metodą, duomenys perduodami UR parametre (t.y.: www.domenas.lt?param1=reikšmė1&param2=reikšmė2…, o naudojant POST metodą parametrai URL nesimato – užkoduojami užklausos viduje). Pamatyti ar naudojam GET, ar POST užklausa galima naršyklėje: Network tabe -> Headers:

POST užklausa per Network tabą

Nuskaitykime butų duomenis NT projekto “Ryto namai” svetainėje. Pagal konkrečių duomenų paiešką (pvz. viena iš matomų kainų 173597 EUR), identifikuojame kad butų lentelė gražinama per API, naudojant šį adresą, veikiantį POST metodų: https://www.rytonamai.lt/api/filter. Network skilties “Response” tabe iš tiesų matome butų lentelę nusakantį HTML kodą:

Butų lentelė – API

Paspaudus dešinę pelės klavišą ties iškviečiamu API (/api/filter), nukopijuokite visus užklausos parametrus, t.y. Copy -> Copy as cURL. Įklijavus nukopijuotą dalį matytume tokį tekstą:

curl ‘https://www.rytonamai.lt/api/filter’ \
-H ‘authority: www.rytonamai.lt’ \
-H ‘accept: application/json, text/javascript, /; q=0.01′ \
-H ‘accept-language: en-GB,en-US;q=0.9,en;q=0.8,lt;q=0.7’ \
-H ‘cache-control: no-cache’ \
-H ‘content-type: application/x-www-form-urlencoded; charset=UTF-8’ \
-H ‘cookie: hideCookieBar=1; october_session=eyJpdiI6InNZbzA3TWUyTUpCN2FHUkQ5SzNpNWc9PSIsInZhbHVlIjoiNTRtVUo2ODcwek04RUMrZG5ZYUMwZGdRTWlvNGJ0d1BibmNnTVlja2lna2oxdXQ5ck02S1dnKzJMZVB3TEJnWDZmbEd4VXlEQ1JhdGZXZ0R6WFJycHRSRnVkS2hpR0VuUHhoaTlORmRwQ0FvYkNDQkp1TnhWa3Q4TWRmREhqZHYiLCJtYWMiOiIyNzcxMzZmNzkxZWE4NDU0ZGZiN2U3MDQyOTMwOTA4MTY1MTJlYjI1YjM1NDg0MDNhZWFhZDFhYjRlMjk4YTc5In0%3D’ \
-H ‘origin: https://www.rytonamai.lt’ \
-H ‘pragma: no-cache’ \
-H ‘referer: https://www.rytonamai.lt/rinktis-busta’ \
-H ‘sec-ch-ua: “.Not/A)Brand”;v=”99″, “Google Chrome”;v=”103″, “Chromium”;v=”103″‘ \
-H ‘sec-ch-ua-mobile: ?0’ \
-H ‘sec-ch-ua-platform: “macOS”‘ \
-H ‘sec-fetch-dest: empty’ \
-H ‘sec-fetch-mode: cors’ \
-H ‘sec-fetch-site: same-origin’ \
-H ‘user-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36’ \
-H ‘x-requested-with: XMLHttpRequest’ \
–data-raw ‘free=0&discount=0&area%5B%5D=20&area%5B%5D=80&rooms%5B%5D=1&rooms%5B%5D=4&floor%5B%5D=0&floor%5B%5D=4’ \
–compressed

Šis tekstas iš esmės nusako kokių parametrų reikia norint gauti lygiai tokį patį Python programoje. Teliko konvertuoti tai į Python requests bilbiotekos užklausą. Tai galime padaryti rankiniu būdu, arba patogu pasinaudoti internetiniais įrankiais (pvz. google “CURL” to “Python request”)

Pavyzdys: CURL converter įrankis keičia CURL formatą į kodą pasirinktai kalbai

Gausime HTMLa:

<a href=”https://www.rytonamai.lt/aukstas/0/1″ class=”table__row  free reveal”><div class=”table__col”><p>1</p></div><div class=”table__col”><p>0</p></div><div class=”table__col”><p>3</p></div><div class=”table__col”><p>55.64</p></div><div class=”table__col”><p>173597 €</p></div><div class=”table__col”><p>Laisva</p></div></a>…

Parasome jam reguliaru reiskini

rg = re.compile('<a href="(.*?)" class="table__row.*?"><div class="table__col"><p>(.*?)</p></div><div class="table__col"><p>(.*?)</p></div><div class="table__col"><p>(.*?)</p></div><div class="table__col"><p>(.*?)</p></div><div class="table__col"><p>(.*?) €</p></div><div class="table__col"><p>(.*?)</p></div>')
results = rg.findall(html)

for result in results:
  print result

Jis išspausdintų tokius rezultatus:

('https://www.rytonamai.lt/aukstas/0/1', '1', '0', '3', '55.64', '173597', 'Laisva')
('https://www.rytonamai.lt/aukstas/0/2', '2', '0', '2', '52.05', '158232', 'Laisva')
('https://www.rytonamai.lt/aukstas/0/3', '3', '0', '1', '37.84', '117682', 'Laisva')
('https://www.rytonamai.lt/aukstas/0/4', '4', '0', '1', '37.71', '117278', 'Laisva')
('https://www.rytonamai.lt/aukstas/1/5', '5', '1', '2', '46.63', '143620', 'Laisva')
('https://www.rytonamai.lt/aukstas/1/6', '6', '1', '3', '64.28', '197340', 'Laisva')
('https://www.rytonamai.lt/aukstas/1/7', '7', '1', '2', '51.06', '156754', 'Laisva')

Tai atitnka tokius stulpelius:

['www', 'id', 'floor', 'rooms', 'area', 'price', 'status']

Leave a Reply

Your email address will not be published. Required fields are marked *