2012-09-17 14 views
12

Próbuję pobrać następującą stronę internetową:Dlaczego funkcja urllib.urlopen.read() nie odpowiada kodem źródłowym?

import urllib 
urllib.urlopen("http://www.gallimard-jeunesse.fr/searchjeunesse/advanced/(order)/author?catalog[0]=1&SearchAction=1").read() 

Wynik nie odpowiada temu, co widzę podczas inspekcji kodu źródłowego strony sieci Web przy użyciu przeglądarki Google Chrome dla przykładu.

Czy możesz mi powiedzieć, dlaczego tak się dzieje i jak mogę poprawić swój kod, aby przezwyciężyć ten problem?

Dziękuję za pomoc.

+1

Jakie są różnice? –

+0

Witam, urllib.urlopen.read() daje mi na przykład w organizmie: ' \ n

\ n' która jest zbyt mała informacja dotycząca tego, co znajduje się na stronie. –

+0

Zobacz odpowiedź Srikara.Strona jest generowana dynamicznie przy użyciu javascript. Klucz znajduje się w "Album1.EcritElement (0)". –

Odpowiedz

10

co otrzymujesz od urlopen jest surowy strona czyli nie jest wykonywana javascript css nie jest używana; gdzie to, co dostajesz z Chrome (lub innych przeglądarek), to końcowa strona internetowa zawierająca wykonywalny javascript (który może zmieniać HTML), rendering css itd., z których wszystkie nie występują w urlopen ...

Z tego powodu różnica, nadzieję, że to jest jasne

+0

Czy widok * źródła * Chrome zmienia się, gdy DOM jest manipulowany? Firefox nie. – delnan

+2

@delnan OP nie mówi wprost, że używa View Source (które się nie zmienia) zamiast Inspect Element (co robi). –

+0

@SrikarDzięki, czego powinienem użyć zamiast urlopuen, aby następnie przetworzyć końcową stronę WWW? –

3

również niektóre strony mają tak zwany przełącznik przeglądarki, która może prowadzić do innego źródła są pokazane przy użyciu różnych przeglądarek (np pokazać światła wersji dla przeglądarek mobilnych).

Zobacz, jak zmienić User-Agent na "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, jak Gecko) Chrome/21.0.1180.89 Safari/537.1" (który jest w rzeczywistości moim User-Agentem).

9

możesz użyć python Selenium, aby rozwiązać swój problem. Oto przykładowy kod.

from selenium import webdriverr 
url = "http://www.gallimard-jeunesse.fr/searchjeunesse/advanced/(order)/author?catalog[0]=1&SearchAction=1" 
browser = webdriver.Firefox() 
browser.get(url) 
sleep(10) 
all_body_id_html = browser.find_element_by_id('body') # you can also get all html 

potem na swoją reszta prac według swojego wyboru kilka przykład z instancji przeglądarki

def login(user='ssdf', password="cisin123"): 
content = browser.find_element_by_id('content') 
content.find_element_by_xpath('.//tbody/tr[2]//input[contains(@class,"textbox")]').send_keys(user) 
content.find_element_by_xpath('.//tbody/tr[3]//input[contains(@class,"textbox")]').send_keys(password) 
content.find_element_by_css_selector(".button").click() 
+1

chociaż drugi komentarz odpowiada na podstawowe pytanie "dlaczego?", Tylko ta odpowiedź podpowie, jak rozwiązać rzeczywisty problem. – rbp

6

Można użyć selen z Firefox do rozwiązywania problemu, ale może nie być odpowiednie w wielu przypadkach gdy przeglądarka wyświetla się za każdym razem, gdy uruchamiasz kod. Innym pomysłem jest użycie bezgłowego broswer'a, takiego jak PhantomJS.

Najlepszym sposobem na to jest do korzystania z biblioteki Mechanize. Zamontuj mechanize za pomocą pip.

pip install mechanize 

Następnie można użyć następującego kodu:

import mechanize 

mb = mechanize.Browser() 
mb.addheaders = [('User-agent', 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.1) Gecko/2008071615 Fedora/3.0.1-1.fc9 Firefox/3.0.1')] 
mb.set_handle_robots(False) 
url = "http://www.gallimard-jeunesse.fr/searchjeunesse/advanced/(order)/author?catalog[0]=1&SearchAction=1" 
response = mb.open(url).read() 
print response 

Zapewnia również opcję skryptów snu i wykonawczych. Można je czytać w documentation.

Powiązane problemy