2012-09-17 24 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

श्रीकर का जवाब देखें।पेज जावास्क्रिप्ट का उपयोग करके गतिशील रूप से उत्पन्न होता है। कुंजी "एल्बम 1। एक्रिट एलिमेंट (0)" में है। –

उत्तर

10

urlopen से आप जो प्राप्त कर रहे हैं वह कच्चा वेबपृष्ठ है जिसका अर्थ है कि कोई जावास्क्रिप्ट निष्पादित नहीं किया गया है css का उपयोग नहीं किया जाता है; जहां के रूप में आप क्या क्रोम (या अन्य ब्राउज़र) से प्राप्त अंतिम वेबपेज जो निष्पादन जावास्क्रिप्ट शामिल है अंतर इसलिए, सीएसएस प्रतिपादन आदि जो सभी के urlopen में ऐसा नहीं होता है ...

(एचटीएमएल बदल हो सकता है), उम्मीद है कि इस स्पष्ट है

+0

क्या डोम का उपयोग होने पर क्रोम का * स्रोत * दृश्य बदलता है? फ़ायरफ़ॉक्स एक नहीं करता है। – delnan

+2

@ डेलनान ओपी स्पष्ट रूप से नहीं कहता है कि वह निरीक्षण तत्व (जो करता है) के बजाय व्यू स्रोत (जो नहीं बदलता) का उपयोग कर रहा है। –

+0

@ श्रीकर धन्यवाद मैं अंतिम वेबपृष्ठ को पार्स करने के लिए urlopen के बजाय मुझे क्या उपयोग करना चाहिए? –

3

इसके अलावा, कुछ वेबसाइटों एक तथाकथित ब्राउज़र स्विच जो विभिन्न स्रोत को जन्म दे सकता है जब विभिन्न ब्राउज़रों का प्रयोग दिखाया जा रहा है (उदाहरण के लिए मोबाइल ब्राउज़र के लिए एक प्रकाश संस्करण को दिखाने)।

उपयोगकर्ता-एजेंट को "मोज़िला/5.0 (विंडोज एनटी 6.1; WOW64) ऐप्पलवेबकिट/537.1 (केएचटीएम, जैसे गेको) जैसे कुछ को बदलने के लिए http://www.diveintopython.net/http_web_services/user_agent.html पर एक नज़र डालें क्रोम/21.0.1180.89 सफारी/537.1" (जो वास्तव में मेरा उपयोगकर्ता-एजेंट है)।

9

आप अपनी समस्या हल करने के लिए पाइथन सेलेनियम का उपयोग कर सकते हैं। यहां एक उदाहरण कोड है।

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

1

ऐसा लगता है जैसे आप किसी लाइब्रेरी है कि एक ब्राउज़र की तरह काम करते हैं और आप के लिए जावास्क्रिप्ट चला सकते हैं चाहते हैं , तो आपको परिणामस्वरूप स्रोत कोड दें। विंडमिल आपके लिए ऐसा करने में सक्षम होना चाहिए।
http://www.packtpub.com/article/web-scraping-with-python

6

आप इस मुद्दे को हल करने के लिए Firefox के साथ सेलेनियम का उपयोग कर सकते हैं, लेकिन यह कई मामलों में उपयुक्त नहीं हो सकता: (http://www.getwindmill.com/)

कैसे तुम यहाँ क्या चाहते हैं के लिए उपयोग करने पर एक अच्छा लेख है जैसे-जैसे ब्राउज़र आप कोड चलाते समय हर बार पॉप अप करता है। एक और विचार है कि एक हेडलेस ब्रोसर जैसे फैंटॉमजेएस का उपयोग करना।

इस के लिए सबसे अच्छा तरीका है मशीनीकरण पुस्तकालय का प्रयोग है। पाइप के माध्यम से मशीनीकरण स्थापित करें।

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.