2012-09-17 2 views
12

나는 다음과 같은 웹 페이지를 가져 오기 위해 노력하고있어 :urllib.urlopen.read()가 (가) 소스 코드와 일치하지 않는 이유는 무엇입니까?

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

이 결과는, 예를 들어 구글 크롬을 사용하여 웹 페이지의 소스 코드를 검사 할 때 내가 무엇을보고 일치하지 않습니다.

이 문제가 발생하는 이유와 문제점을 극복하기 위해 코드를 향상시킬 수있는 방법을 알려주십시오.

도움 주셔서 감사합니다.

+1

차이점은 무엇입니까? –

+0

안녕하세요, urllib.urlopen.read()는 예를 들어 몸체에 ' \ n

\ n'을 제공합니다. 이는 페이지의 내용에 대한 정보가 너무 작습니다. –

+0

Srikar의 대답을 참조하십시오.페이지는 자바 스크립트를 사용하여 동적으로 생성됩니다. 키는 "Album1.EcritElement (0)"에 있습니다. –

답변

10

urlopen에서 얻는 것은 자바 스크립트가 실행되지 않은 원시 웹 페이지입니다. CSS는 사용되지 않습니다. 어디에서 당신이 크롬 (또는 다른 브라우저)에서 얻을 수있는 것은 실행 가능한 자바 스크립트 (HTML을 변경할 수도 있음), CSS 렌더링 등을 포함하는 최종 웹 페이지입니다 ... urlopen ...

따라서 차이점은, 이 부분이 분명해지기를 바랍니다.

+0

DOM을 조작하면 Chrome의 * 소스 *보기가 변경됩니까? 파이어 폭스는 그렇지 않습니다. – delnan

+2

@delnan OP는 요소 검사가 아니라보기 소스 (변경하지 않음)를 명시 적으로 사용하고 있다고 말하지 않습니다. –

+0

@SrikarThanks 그러면 최종 웹 페이지를 분석하기 위해 urlopen 대신 무엇을 사용해야합니까? –

3

또한 일부 웹 사이트에는 다른 브라우저를 사용할 때 (예 : 모바일 브라우저에 밝은 버전 표시) 다른 소스가 표시 될 수있는 브라우저 스위치가 있습니다.

사용자 에이전트를 "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (Gecko와 같은 KHTML) Chrome/21.0.1180.89 Safari/537.1"과 같은 것으로 변경하는 방법은 http://www.diveintopython.net/http_web_services/user_agent.html을 참조하십시오. 실제로 내 User-Agent입니다).

9

python Selenium을 사용하여 문제를 해결할 수 있습니다. 다음은 예제 코드입니다. 일의 당신의 나머지는 당신의 선택 브라우저 인스턴스 몇 가지 더 예에 따라 때문에 그런

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 

당신이 브라우저처럼 행동하고 당신을 위해 자바 스크립트를 실행할 수있는 라이브러리를 원하는 것 소리

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

다른 의견은 기본 질문 인 "왜?"에 대답하지만이 대답 만 실제 문제를 해결하는 방법을 알려줍니다. – rbp

6

당신은 문제를 해결하기 위해 파이어 폭스와 셀레늄을 사용할 수 있지만, 많은 경우에 적합하지 않을 수 있습니다 : (http://www.getwindmill.com/)

당신이 여기 원하는 것을 위해 그것을 사용하는 방법에 대한 좋은 기사가있다 브라우저가 코드를 실행할 때마다 팝업으로 표시됩니다. 또 다른 아이디어는 PhantomJS와 같은 머리없는 broswer를 사용하는 것입니다.

가장 좋은 방법은 mechanize 라이브러리를 사용하는 것입니다. pip를 통해 기계 장치를 설치하십시오.

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 

또한 수면과 실행 스크립트에 대한 옵션을 제공합니다 :

pip install mechanize 

그런 다음 다음과 같은 코드를 사용할 수 있습니다. 에서 읽을 수 있습니다 documentation.

관련 문제