2012-07-12 11 views
8

मैं वेब स्क्रैपर्स बनाना सीख रहा हूं और एक व्यक्तिगत प्रोजेक्ट के लिए TripAdvisor को स्क्रैप करना चाहता हूं, urllib2 का उपयोग करके एचटीएमएल को पकड़ना। हालांकि, मैं एक समस्या में भाग रहा हूं, जहां नीचे दिए गए कोड का उपयोग कर रहा है, एचटीएमएल वापस आ गया है, यह सही नहीं है क्योंकि पेज रीडायरेक्ट करने के लिए एक सेकंड लेता है (आप यूआरएल पर जाकर इसे सत्यापित कर सकते हैं) - इसके बजाय मुझे मिलता है उस पृष्ठ से कोड जो प्रारंभ में संक्षिप्त रूप से प्रकट होता है।पायथन urllib2 - स्क्रैपिंग से पहले लोडिंग/पुनर्निर्देशन को समाप्त करने के लिए पृष्ठ की प्रतीक्षा करें?

क्या यह सुनिश्चित करने के लिए सेट करने के लिए कुछ व्यवहार या पैरामीटर है कि पृष्ठ पूरी तरह से वेबसाइट सामग्री प्राप्त करने से पहले लोडिंग/पुनर्निर्देशन समाप्त हो गया है?

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() 

संपादित करें: जवाब है, पूरी तरह से है, लेकिन, अंत क्या मेरी समस्या यह था हल में:, https://stackoverflow.com/a/3210737/1157283

+0

does not को urllib एक त्रुटि बढ़ा? ऐसे मामलों के लिए एक रीडायरेक्ट डायरेक्टर है ... –

+0

@DonQuestion कोई त्रुटि नहीं, मुझे बस उस पृष्ठ से HTML प्राप्त होता है जो रीडायरेक्ट होने से पहले संक्षिप्त रूप से प्रकट होता है। मैं उस पृष्ठ से एचटीएमएल चाहता हूं जो अंत में दिखाई देता है। यह रीडायरेक्ट डायरेक्टर क्या है, क्या आप विस्तारित कर सकते हैं? – Ken

+0

यदि आप urlopen का उपयोग करते हैं, तो आप openerDirector.open() को पायथन-डॉक्स पर देख रहे हैं - दुर्भाग्य से यह 2-3 शब्दों में समझाया नहीं गया है :-(: http://docs.python.org/library/urllib2.html? हाइलाइट = urllib2 # urllib2.OpenerDirector –

उत्तर

5

Inreresting समस्या नहीं है एक रीडायरेक्ट उस पृष्ठ जावास्क्रिप्ट का उपयोग कर सामग्री को संशोधित करता है, लेकिन urllib2, एक JS इंजन यह सिर्फ GETS डेटा नहीं है, तो आप अपने ब्राउज़र पर विकलांग जावास्क्रिप्ट आप यह मूल रूप से लोड करता है क्या urllib2 रिटर्न

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 और अपने ब्राउज़र में जेएस को अक्षम करना, फ़ायरफ़ॉक्स सामग्री में सबसे आसान -> जावास्क्रिप्ट को अनचेक करें, समान परिणाम सेट उत्पन्न करता है।

तो क्या हम अच्छी तरह से कर सकते हैं, पहले हम की जाँच करनी चाहिए यदि साइट एक API प्रदान करता है, समाप्त अप भ्रूभंग किए जाने की http://www.tripadvisor.com/help/what_type_of_tripadvisor_content_is_available

Travel/Hotel API's? यह, वे हो सकता है लग रहा है जाता है, हालांकि कुछ प्रतिबंधों के साथ।

लेकिन अगर हमें अभी भी जेएस के साथ इसे स्क्रैप करने की आवश्यकता है, तो हम मुख्य रूप से परीक्षण के लिए उपयोग किए जाने वाले seleniumhttp://seleniumhq.org/ का उपयोग कर सकते हैं, लेकिन इसका आसान और काफी अच्छा दस्तावेज़ है।

मैं भी इस Scraping websites with Javascript enabled? और इस http://grep.codeconsult.ch/2007/02/24/crowbar-scrape-javascript-generated-pages-via-gecko-and-rest/

आशा व्यक्त की कि मदद करता है पाया।

एक तरफ ध्यान दें के रूप में:

>>> 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

आपके उत्तर के लिए धन्यवाद। मुझे कुछ को दोहराने का प्रयास करें: इसलिए जब आप "लक्जरी" या "परिवार" जैसी विभिन्न श्रेणियों पर क्लिक करते हैं, तो पृष्ठ पर दिखाई देने वाले परिवर्तन पूरी तरह से उत्पन्न होते हैं जावास्क्रिप्ट? (यानी पृष्ठ के लिए कोड कभी भी नहीं बदलेगा?) और मुझे क्या करने की ज़रूरत है एक ऐसा उपकरण ढूंढें जो जेएस चलाएगा और फिर उस सामग्री को वापस कर देगा? आपने जो सिफारिश की है उससे सबसे आसान/सबसे अच्छा क्या है? मुझे लगता है कि एपीआई है मैं इस मामले में जो करने की कोशिश कर रहा हूं उसके लिए उचित नहीं है। – Ken

+0

सेलेनियम शायद ऐसा करने का सबसे अच्छा तरीका है, यह वास्तविक ब्राउज़र का उपयोग करता है हालांकि यह पूरी तरह से स्वचालित है लेकिन इस तरह इसे कम से कम वर्चुअल फ्रेम-बफर या किसी ब्राउज़र के साथ स्थापित ब्राउज़र की आवश्यकता है डेस्कटॉप वातावरण, क्योंकि यह एक को कॉल करेगा ... –

संबंधित मुद्दे

 संबंधित मुद्दे