2012-07-12 15 views
8

Uczę się tworzyć skrobaczki internetowe i chcę zadrapać serwis TripAdvisor za osobisty projekt, chwytając go za pomocą urllib2. Jednakże mam problem z tym, że przy użyciu poniższego kodu html, który otrzymuję, nie jest poprawny, ponieważ wydaje się, że druga strona zajmuje przekierowanie (możesz to sprawdzić odwiedzając adres URL) - zamiast tego otrzymuję kod ze strony, która początkowo pojawia się na krótko.python urllib2 - poczekaj na zakończenie strony ładowanie/przekierowanie przed skrobaniem?

Czy istnieje pewne zachowanie lub parametr, który należy ustawić, aby upewnić się, że strona została całkowicie załadowana/przekierowana przed uzyskaniem zawartości witryny?

import urllib2 
from bs4 import BeautifulSoup 

bostonPage = urllib2.urlopen("http://www.tripadvisor.com/HACSearch?geo=34438#02,1342106684473,rad:S0,sponsors:ABEST_WESTERN,style:Szff_6") 
soup = BeautifulSoup(bostonPage) 
print soup.prettify() 

Edycja: Odpowiedź jest dokładny, jednak w końcu co rozwiązać mój problem został w ten sposób: https://stackoverflow.com/a/3210737/1157283

+0

doesnt urllib podnieść błąd? jest taki przekierowanie dla takich przypadków ... –

+0

@DonQuestion Bez błędu, po prostu dostaję kod HTML ze strony, która pojawia się krótko przed przekierowaniem. Chcę html ze strony, która pojawia się na końcu. Co to jest redirectdirector, możesz rozwinąć? – Ken

+0

jeśli używasz urlopen, używasz OpenerDirector.open() spójrz na python-docs - niestety nie jest to wyjaśnione w 2-3 słowach :-(: http://docs.python.org/library/urllib2.html? highlight = urllib2 # urllib2.OpenerDirector –

Odpowiedz

5

Inreresting problem nie jest przekierowanie jest to, że strona modyfikuje zawartość za pomocą JavaScript, ale urllib2 nie posiada JS silnik to po prostu GETS danych, jeśli wyłączoną obsługę JavaScript w przeglądarce można zauważyć ładuje zasadniczo tę samą treść jak to, co urllib2 zwrotów

import urllib2 
from BeautifulSoup import BeautifulSoup 

bostonPage = urllib2.urlopen("http://www.tripadvisor.com/HACSearch?geo=34438#02,1342106684473,rad:S0,sponsors:ABEST_WESTERN,style:Szff_6") 
soup = BeautifulSoup(bostonPage) 
open('test.html', 'w').write(soup.read()) 

test.html i wyłączanie JS w przeglądarce, najłatwiej w treści firefox -> odznacz pole wyboru javascript, generuje identyczne zestawy wyników.

Więc co możemy zrobić dobrze, najpierw powinniśmy sprawdzić, czy witryna oferuje API, złomowanie ma tendencję do boczyć się http://www.tripadvisor.com/help/what_type_of_tripadvisor_content_is_available

Travel/Hotel API's? wygląda mogą one, choć z pewnymi ograniczeniami.

Ale jeśli nadal będziemy musieli to zeskrobać, z JS, możemy użyć seleniumhttp://seleniumhq.org/, który jest głównie używany do testowania, ale jest łatwy i ma dość dobre dokumenty.

Znalazłam też to Scraping websites with Javascript enabled? i ten http://grep.codeconsult.ch/2007/02/24/crowbar-scrape-javascript-generated-pages-via-gecko-and-rest/

nadzieję, że pomoże.

Na marginesie:

>>> import urllib2 
>>> from bs4 import BeautifulSoup 
>>> 
>>> bostonPage = urllib2.urlopen("http://www.tripadvisor.com/HACSearch?geo=34438#02,1342106684473,rad:S0,sponsors:ABEST_WESTERN,style:Szff_6") 
>>> value = bostonPage.read() 
>>> soup = BeautifulSoup(value) 
>>> open('test.html', 'w').write(value) 
+0

Dziękuję za odpowiedź. Pozwólcie, że spróbuję powtórzyć niektóre z nich: więc po kliknięciu na różne kategorie, takie jak "Luksus" lub "Rodziny", zmiany widoczne na stronie są generowane wyłącznie przez javascript? (tj. kod strony nigdy się nie zmienia?) I co muszę zrobić, to znaleźć narzędzie, które uruchomi JS, a następnie zwróci tę treść? Co jest najłatwiejsze/najlepsze z tego, co polecasz? Czuję, że api jest nie jest odpowiedni dla tego, co próbuję zrobić w tym przypadku: – Ken

+0

selen może być najlepszym sposobem na to, używa rzeczywistej przeglądarki, ale w pełni zautomatyzowany, ale jako taki potrzebuje przeglądarki zainstalowanej z co najmniej wirtualnym buforem ramki lub środowisko graficzne, ponieważ będzie je wywoływać ... –

Powiązane problemy