2010-01-27 8 views
16

के साथ जावास्क्रिप्ट द्वारा उत्पन्न स्क्रैप एचटीएमएल मुझे पाइथन के साथ एक साइट को स्क्रैप करने की आवश्यकता है। मैं urlib मॉड्यूल के साथ स्रोत एचटीएमएल कोड प्राप्त करता हूं, लेकिन मुझे जावास्क्रिप्ट फ़ंक्शन द्वारा उत्पन्न कुछ HTML कोड को स्क्रैप करने की आवश्यकता है (जो HTML स्रोत में शामिल है)। साइट पर "इन" में यह फ़ंक्शन क्या है कि जब आप कोई बटन दबाते हैं तो यह कुछ HTML कोड आउटपुट करता है। मैं पाइथन कोड के साथ इस बटन को "दबाएं" कैसे कर सकता हूं? क्या स्कैपर मेरी मदद कर सकता है? मैंने फायरबग के साथ POST अनुरोध पर कब्जा कर लिया लेकिन जब मैं इसे यूआरएल पर पास करने का प्रयास करता हूं तो मुझे 403 त्रुटि मिलती है। कोई सुझाव?पाइथन

+2

मेल सूचियों के लिए वेब पृष्ठों से obfuscated पते खोदना? –

+0

मैंने एक समान प्रश्न का उत्तर दिया [पायथन के भीतर जावास्क्रिप्ट लिंक पर क्लिक करें?] (Http://stackoverflow.com/questions/5207948/click-on-a-javascript-link-within-python/5227031#5227031) –

उत्तर

10

पायथन में, मुझे लगता है कि Selenium 1.0 जाने का रास्ता है। यह एक पुस्तकालय है जो आपको अपनी पसंद की भाषा से वास्तविक वेब ब्राउज़र को नियंत्रित करने की अनुमति देता है।

आपको अपनी स्क्रिप्ट चलाने वाली मशीन पर वेब ब्राउज़र स्थापित करने की आवश्यकता है, लेकिन ऐसा लगता है कि बहुत सारी जावास्क्रिप्ट का उपयोग करने वाली वेबसाइटों को प्रोग्रामेटिक रूप से पूछताछ करने का सबसे विश्वसनीय तरीका है।

+0

है अनुरोध और सुंदर सूप के साथ ऐसा करने का कोई तरीका है? मैं अनुरोधों का उपयोग कर रहा हूं और यह हर दूसरे मामले में ठीक काम करता है लेकिन यह। अगर अनुरोध इस बात को हल कर सकते हैं तो कृपया मुझे बताएं। – Shaardool

+0

@ शारदूल: क्या हल करें? जावास्क्रिप्ट द्वारा ब्राउज़र में जेनरेट किए गए HTML को स्क्रैप करना? नहीं - इसके लिए आपको कुछ ऐसी चीज चाहिए जो जावास्क्रिप्ट चलाती है ताकि वह HTML उत्पन्न कर सके। सुंदर सूप जावास्क्रिप्ट नहीं चलाता है। –

+0

अंतर्दृष्टि के लिए धन्यवाद, क्या अनुरोध पुस्तकालय इसे कर सकता है?यह सर्वर पर AJAX अनुरोधों के साथ अच्छी तरह से काम करता है, लेकिन मैं जानना चाहता हूं कि यह जावास्क्रिप्ट के साथ काम कर सकता है जो HTML को भी बनाता है। हालांकि, मुझे उनके दस्तावेज में ऐसी कोई चीज़ नहीं मिली। – Shaardool

4

मुझे इसे पहले (.NET में) करना था और आपको मूल रूप से ब्राउज़र होस्ट करना होगा, बटन पर क्लिक करने के लिए इसे प्राप्त करना होगा, और उसके बाद ब्राउज़र के DOM (दस्तावेज़ ऑब्जेक्ट मॉडल) से पूछताछ करें जेनरेट एचटीएमएल पर।

यह निश्चित रूप से HTML क्लाइंट-साइड उत्पन्न करने के लिए अजाक्स/जावास्क्रिप्ट दृष्टिकोण की तरफ बढ़ने वाले वेब ऐप्स के डाउनसाइड्स में से एक है।

2

Scrapy के लिए (महान अजगर ढांचे scraping) है scrapyjs: एक अतिरिक्त डाउनलोडर हैंडलर/मिडलवेयर हैंडलर जावास्क्रिप्ट स्क्रैप करने में सक्षम सामग्री उत्पन्न।

यह वेबकिट इंजन पर pygtk, पायथन-वेबकिट, और पायथन-जेएसवेबिट द्वारा आधारित है और यह काफी सरल है।

6

चूंकि यहां कोई व्यापक उत्तर नहीं है, इसलिए मैं आगे बढ़ूंगा और एक लिखूंगा।

बंद स्क्रैप करने के लिए जे एस पृष्ठों प्रदान की गई है, हम एक ब्राउज़र के लिए JavaScript इंजन है कि आवश्यकता होगी (Ei, समर्थन जावास्क्रिप्ट प्रतिपादन)

विकल्प तरह मशीनीकरण, url2lib काम नहीं करेगा क्योंकि वे नहीं DO जावास्क्रिप्ट का समर्थन करें।

सेटअप PhantomJSSelenium साथ चलाने के लिए:

तो यहाँ तुम क्या करते है। दोनों के लिए निर्भरता स्थापित करने के बाद (this देखें), आप पूरी तरह से प्रस्तुत वेबसाइट लाने के लिए निम्न कोड का उपयोग उदाहरण के रूप में कर सकते हैं।

from selenium import webdriver 

driver = webdriver.PhantomJS() 
driver.get('http://jokes.cc.com/') 
soupFromJokesCC = BeautifulSoup(driver.page_source) #page_source fetches page after rendering is complete 
driver.save_screenshot('screen.png') # save a screenshot to disk 

driver.quit()