web scraping - czy jest możliwy

0

Cześć, próbuję wyciągnąć kursy wydarzeń sportowych ze strony: https://www.orbitexch.com/ - a konkretnie to jsonowy plik, które je zawiera. Chciałbym stworzyć bazę danych z historycznymi kursami, porównaniami etc. Niestety póki co bez skutku. Strona jest oporna i "nie pozwala" na wyciągnięcie jsona z wartościami kursów. Chciałbym się zapytać czy w ogóle jest taka możliwość aby wyciągnąć te dane z tej strony. Nie znam się zbyt na web scrapingu, podstawy ogarniam i zdaję sobie sprawę, że strona ma (prawdopodobnie) zabezpieczenia anti-scrapingowe, ale czy jest jakakolwiek możliwość aby je obejść. Korzystam z curl'a do tworzenia zapytania http POST. Poniżej zamieszczam jak ono wygląda wraz z odpowiedzią. Z tego co zauważyłem link do json'a, którego potrzebuję, za każdym razem zmienia swoją końcówkę. W kodzie poniżej, jak można zauważyć, serwer wysyła mi komunikat HTTP 200, a zawartość to jedna mała litera "o". Proszę o pomoc i wyjaśnienie - jak (jeśli to możliwe) wyciągnąć wartości tego json'a. Przy tworzeniu zapytania, posługiwałem się narzędziem deweloperskim z Chroma aby podejrzeć w którym pliku wysyłane są wartości kursów, a także użyłem wartości z "header request" tego pliku. Z góry dzięki za pomoc.

Request:

$url = "https://www.orbitexch.com/customer/ws/multiple-market-prices/917/31ndecct/xhr?t=1590161691981";

$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($ch, CURLINFO_HEADER_OUT, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);
curl_setopt($ch,CURLOPT_HEADER, true);

$httpHeader = [
    '"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36",
    "Accept":"application/json",
    "Content-Type":"application/json",
    "Host":"www.orbitexch.com",
    "Origin":"https://www.orbitexch.com",
    "Connection":"keep-alive",
    "Cookie":"_ga=GA1.2.1656233833.1589476933; _gid=GA1.2.1008686933.1590154787; BIAB_HOW_TO_LINKS=true; i18next=en; BIAB_TZ=-120; BIAB_SHOW_TOOLTIPS=false; BIAB_WAS_ON_AV=false; _gat=1; CSRF-TOKEN=bc094ae88d3f5252e14b6798dc5466f558
    "Host":"https://www.orbitexch.com",
    "Referer":"https://www.orbitexch.com/customer/inplay/all/1",
    "Sec-Fetch-Dest":"empty",
    "Sec-Fetch-Mode":"cors",
    "Sec-Fetch-Site":"same-origin",
    "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36",
    "Referer":"https://www.orbitexch.com/customer/inplay/highlights/1"'];

curl_setopt($ch, CURLOPT_HTTPHEADER, $httpHeader);
$postData = "1590177727949";
curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);
$info = curl_getinfo($ch);

# execute
$output = curl_exec($ch);
$http_status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);

Response:

response: 

HTTP/1.1 200 OK
Date: Fri, 22 May 2020 20:20:18 GMT
Content-Type: application/javascript;charset=UTF-8
Transfer-Encoding: chunked
Connection: keep-alive
Server: PWS/8.3.1.0.8
X-Content-Type-Options: nosniff
X-XSS-Protection: 1; mode=block
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
X-Frame-Options: DENY
Cache-Control: no-store, no-cache, must-revalidate, max-age=0
Via: 1.1 hsh149:1 (W)
X-Px: ms hsh149WAW(origin)
X-Ws-Request-Id: 5ec83402_hsh150_16690-48318

o
1

Wszystko co da się zobaczyć w przeglądarce, da się też "zescrapować" - na niektóre rzeczy potrzeba jednak więcej czasu, cierpliwości i wiedzy.

Screenshot from 2020-05-22 22-41-23.png

Ta strona nie chce żeby ją scrapować, co nie oznacza, że nie da się tego zrobić. Musisz zrozumieć krok po kroku każde żądanie. Prawdopodobnie nie wyciągniesz danych jednym zapytaniem. Pamiętaj o obsłudze cookies po stronie cURL. Polecam też narzędzie - https://incarnate.github.io/curl-to-php/ (kopiujesz żądanie jako cURL i przerabiasz na PHP).

Przed rozpoczęciem prac upewnij się, że nie ma łatwiejszego sposobu na zdobycie tych danych, może jakieś api, może inna strona www.

0

Dzięki wielkie za (tak szybką również!) odpowiedź. W takim razie postaram się to zrozumieć i powalczyć z tymi zapytaniami i je ogarnąć. Dzięki również za to narzędzie. Jeśli chodzi o API to wysłałem maila do supportu, odpowiedzieli, że nie udostępniają żadnych narzędzi deweloperskich. Z tego co wiem, żadne inne strony "nie wyciągają" danych z tej.

0

Obecnie utknąłem na tym zapytaniu POST, nie rozumiem skąd została wzięta treść "Request Payload" - są te numery wydarzeń sportowych wraz z identyfikatorami rynków do obstawiania. Wcześniej jedynie została przesłana jedna, mała litera "o". Stąd też nie rozumiem skąd przeglądarka "wzięła" te dane do requesta skoro wcześniej serwer nic takiego nie przesłał.

orb1.png

1

Zawsze możesz użyć selenium, poczekać aż dynamiczny content wczyta się na stronie i sparsować dane używająć xpath czy też css selectorów.

0

Dzięki za podpowiedź. Myślałem nad tym, ale nie wiem jak będzie z szybkością takiego rozwiązania i opóźnieniem. Jeśli nie uda mi się tego załatwić zapytaniami to jedyne co mi chyba zostanie to faktycznie Selenium.

1 użytkowników online, w tym zalogowanych: 0, gości: 1