2017-06-08 17 views
16

Używam YQL, aby uzyskać strony html do czytania informacji z niego. Od dziś dostaję komunikat zwrotny "tabela html nie jest już obsługiwana Zobacz https://policies.yahoo.com/us/en/yahoo/terms/product-atos/yql/index.htm dla YQL Warunki użytkowania"YQL: tabela html nie jest już obsługiwana

przykład w konsoli: https://developer.yahoo.com/yql/console/#h=select+ * + z + html + gdzie +% url 3D% 22http% 3A% 2F% 2Fwww.google.de% 22

Czy Yahoo zatrzymało tę usługę? Czy ktoś wie coś w rodzaju komunikatu od Yahoo? Zastanawiam się, czy jest to po prostu bug czy oni naprawdę zatrzymał tę usługę ...

Cała dokumentacja jest nadal istnieje (html skrobanie): https://developer.yahoo.com/yql/guide/yql-select-xpath.html, https://developer.yahoo.com/yql/

Jakiś czas temu napisałem w YQL forum od Yahoo, teraz ten już nie istnieje (a przynajmniej go nie znajduję). Jak skontaktować się z Yahoo, aby dowiedzieć się, czy ta usługa naprawdę się zatrzymała?

poważaniem, hebr3

+0

Tak, nie działa również dla mnie. Dają nam link do strony "Warunki YQL użycia", ale nie jest to pomoc. Wygląda na to, że usługa YQL nadal działa , ale jako komunikat o błędzie stwierdza, że ​​kwerenda "tabela HTML" nie jest już obsługiwana . Tak więc, próbuję znaleźć inny sposób na zeskrobanie tabeli HTML ze strony internetowej. Być może jest tam inna usługa YQL , która może pomóc wyodrębnić tabelę ze strony internetowej lub istnieje alternatywne zapytanie w YQL, które mogę wypróbować. Chyba będę musiał przeczytać dokumenty na YQL, aby się dowiedzieć. – user1467483

+0

@ user1467483 błąd nie wynika z tabel HTML. Jest związany z tabelą YQL o nazwie "html". Wyobraź sobie YQL jak każdy inny język zapytań - informacje są przechowywane w strukturach tabel. Jeśli chodzi o znalezienie alternatywy dla YQL, nie jest to konieczne. Musisz po prostu znaleźć alternatywny stół YQL. Zobacz moją odpowiedź –

+0

Jestem na GAE przy użyciu wyjścia JSON tabeli html YQL i przejście do skrobania refactor za pomocą lxml. Aby nie zepsuć interfejsu do istniejącego kodu, przydatne byłoby posiadanie przykładowego wyjścia YQL, szczególnie JSON, co było dość osobliwe. Dokumentacja [XML-to-JSON-transformation] (https://developer.yahoo.com/yql/guide/xml_to_json.html) nie jest pełną specyfikacją (np. Jak obsługiwała mieszane węzły?). Proszę udostępnić próbki html vs. json, jak [this one] (https://stackoverflow.com/a/8763933/591336). – vicmortelmans

Odpowiedz

1

Dziękuję bardzo za Twój kod.

Pomogło mi stworzyć własny skrypt do czytania tych stron, których potrzebuję. Nigdy wcześniej nie programowałem PHP, ale z twoim kodem i mądrością internetu mogłem zmienić twój skrypt na moje potrzeby.

PHP

<? 
    header('Access-Control-Allow-Origin: *'); //all 
    $url = $_GET['url']; 
    if (substr($url,0,25) != "https://www.xxxx.yy") { 
     echo "Only https://www.xxxx.yy allowed!"; 
     return; 
    } 
    $xpathQuery = $_GET['xpath']; 

    //need more hard check for security, I made only basic 
    function check($target_url){ 
     $check = curl_init(); 
     //curl_setopt($check, CURLOPT_HTTPHEADER, array("REMOTE_ADDR: $ip", "HTTP_X_FORWARDED_FOR: $ip")); 
     //curl_setopt($check, CURLOPT_INTERFACE, "xxx.xxx.xxx.xxx"); 
     curl_setopt($check, CURLOPT_COOKIEJAR, 'cookiemon.txt'); 
     curl_setopt($check, CURLOPT_COOKIEFILE, 'cookiemon.txt'); 
     curl_setopt($check, CURLOPT_TIMEOUT, 40000); 
     curl_setopt($check, CURLOPT_RETURNTRANSFER, TRUE); 
     curl_setopt($check, CURLOPT_URL, $target_url); 
     curl_setopt($check, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']); 
    curl_setopt($check, CURLOPT_FOLLOWLOCATION, false); 
     $tmp = curl_exec ($check); 
     curl_close ($check); 
     return $tmp; 
    } 

    // get html 
    $html = check($url); 
    $dom = new DOMDocument(); 
    @$dom->loadHTML($html); 

    // apply xpath filter 
    $xpath = new DOMXPath($dom); 
    $elements = $xpath->query($xpathQuery); 
    $temp_dom = new DOMDocument(); 
    foreach($elements as $n) $temp_dom->appendChild($temp_dom->importNode($n,true)); 
    $renderedHtml = $temp_dom->saveHTML(); 

    // return html in json response 
    // json structure: 
    // {html: "xxxx"} 
    $post_data = array(
     'html' => $renderedHtml 
    ); 
    echo json_encode($post_data); 

?> 

JavaScript

$.ajax({ 
    url: "url of service", 
    dataType: "json", 
    data: { url: url, 
      xpath: "//*" 
      }, 
    type: 'GET', 
    success: function() { 
      }, 
    error: function(data) { 
      } 
}); 
+2

To może nie być rozwiązaniem dla wszystkich, ponieważ posiada własny serwer proxy, wszystkie żądania trafią do witryny docelowej pochodzącej z serwera. W przypadku niektórych zadań może to być niepożądane. Piękno YQL polegało na tym, że można uzyskać dostęp do zapisanych w pamięci podręcznej (czasami nie) wersji stron i do strony docelowej, która wyglądałaby tak, jak pożądany ruch indeksujący wyszukiwania. I naśladować wersje z pamięci podręcznej, aby zmniejszyć liczbę żądań, które będziesz musiał przechowywać, a czasem sporo danych. I będzie to więcej niż jeden skrypt wielkości ekranu. Więc uważam, że nie jest to odpowiedź ogólna. – SerrNovik

+1

Zgadzam się z SerrNovik. To rozwiązanie jest płytką alternatywą dla YQL, a nie sposobem na zachowanie YQL zgodnie z wymaganiami. Warto wnieść wkład, ale nie jest to odpowiednia odpowiedź na oryginalne pytanie. Dodatkowo, wielu programistów używa YQL, aby wyeliminować CORS z równania. Twoje rozwiązanie działa tylko w przypadku dokumentów na tym samym hoście. –

+0

tak, wszystko w porządku, podoba mi się również tabela html YQL - ale YQL zatrzymał usługę bez żadnego ostrzeżenia (przynajmniej ja jej nie otrzymałem) i dlatego moja usługa już nie działała -> Z mojego punktu widzenia YQL nie był już wiarygodny i potrzebowałem zastępstwa – hebr3

0

sam problem tutaj. Zepsułem skrypt i trochę czasu zajęło mi stwierdzenie, że ta tabela nie jest już obsługiwana. Są też inni publiczni pełnomocnicy (Loading cross domain endpoint with jQuery AJAX), ale wszyscy mają pewne ograniczenia i mogą zostać zablokowani, jeśli istnieje zbyt wiele żądań w przeciwieństwie do yahoo z jego pamięcią podręczną.

14

Wygląda na to, że Yahoo rzeczywiście zakończyło obsługę biblioteki html z dnia 6/8/2017 (zgodnie z moimi dziennikami błędów). Wydaje się, że nie ma jeszcze oficjalnego ogłoszenia tego.

Na szczęście istnieje biblioteka społeczności YQL, która może być użyta zamiast oficjalnej biblioteki html z kilkoma zmianami w twojej bazie kodów. Zobacz htmlstring table in the YQL Console.

Zmień zapytanie YQL, aby odwoływać się do htmltable zamiast html i dołącz środowisko społecznościowe do zapytania REST. Na przykład:

// Old code 
var site = "http://www.test.com/foo.html"; 
var yql = "select * from html where url='" + site + "' AND xpath='//div'"; 
var resturl = "http://query.yahooapis.com/v1/public/yql?q=" + encodeURIComponent(yql) + "&format=json"; 

// New code 
var site = "http://www.test.com/foo.html"; 
var yql = "select * from htmlstring where url='" + site + "' AND xpath='//div'"; 
var resturl = "http://query.yahooapis.com/v1/public/yql?q=" + encodeURIComponent(yql) + "&format=json&env=store%3A%2F%2Fdatatables.org%2Falltableswithkeys"; 
+3

Dziękuję bardzo za tę podpowiedź. Używam tylko publicznej wersji YQL, do htmlstring będę musiał użyć jednego z uwierzytelniania. W każdym razie kończę pracę z Yahoo YQL - miałem teraz kilka problemów z ich stabilnością, dostępnością itd. (Choć jest to usługa bezpłatna, potrzebowałbym niezawodności i wydaje się, że nie istnieje). Założyłem teraz własny serwer i używam własnej usługi internetowej, aby uzyskać potrzebne strony html. – hebr3

+0

Jestem w stanie używać htmlstring bez uwierzytelniania. Zastanawiam się, dlaczego nie jesteś. PS, jeśli moja odpowiedź jest odpowiednia, proszę rozważyć oznaczenie jej jako zaakceptowanej odpowiedzi. –

+0

Mój błąd, działa również w publicznej wersji – hebr3

0

Nawet YQL nie obsługuje tabelę HTML już, mam sobie sprawę, że zamiast tworzenia jednego połączenia sieciowego i analizowania na wyniki to możliwe wykonanie kilku połączeń.Na przykład, moja rozmowa zanim będzie wyglądać następująco:

select html from rss where url="http://w1.weather.gov/xml/current_obs/KFLL.rss" 

Które powinny dać mi informacje jako takie poniżej

enter image description here

Teraz będę musiał użyć tych dwóch:

select title from rss where url="http://w1.weather.gov/xml/current_obs/KFLL.rss"

select description from rss where url="http://w1.weather.gov/xml/current_obs/KFLL.rss"

.. aby uzyskać to, czego chcę. Nie wiem, dlaczego odrzucili coś takiego bez wyraźnej listy awaryjnej, ale w ten sposób powinieneś mieć dostęp do swoich danych.

Powiązane problemy