2015-01-06 8 views
12

मैं खुद को कुछ बुनियादी वेब स्क्रैपिंग सिखाने की कोशिश कर रहा हूं। अजगर के अनुरोध मॉड्यूल का उपयोग करना, मैं विभिन्न वेबसाइटों के लिए एचटीएमएल हड़पने के लिए सक्षम जब तक मैं इस की कोशिश की थी:पाइथन अनुरोधों का उपयोग कर एचटीएमएल प्राप्त करें?

>>> r = requests.get('http://www.wrcc.dri.edu/WRCCWrappers.py?sodxtrmts+028815+por+por+pcpn+none+mave+5+01+F') 
मूल HTML इस पृष्ठ के लिए स्रोत है कि करने के बजाय

, मैं मिलता है:

>>> r.text 
'\x1f\ufffd\x08\x00\x00\x00\x00\x00\x00\x03\ufffd]o\u06f8\x12\ufffd\ufffd\ufffd+\ufffd]... 

>>> r.content 
b'\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\x03\xed\x9d]o\xdb\xb8\x12\x86\xef\xfb+\x88]\x14h... 

मैं मैंने प्रलेखन से और एसओ और अन्य उदाहरणों से अनुमान लगा सकते हैं कि प्रत्येक वाक्यविन्यास के साथ प्राप्त/पोस्ट के कई संयोजनों की कोशिश की है। मैं समझ नहीं पा रहा हूं कि मैं ऊपर क्या देख रहा हूं, इसे किसी भी चीज़ में बदलने में सक्षम नहीं हूं, जिसे मैं पढ़ सकता हूं, और यह नहीं समझ सकता कि मैं वास्तव में क्या चाहता हूं। मेरा सवाल है, मैं उपरोक्त पृष्ठ के लिए एचटीएमएल कैसे प्राप्त करूं?

+0

, यहाँ काम करने के लिए लगता है सिर्फ अजगर 2.7 – Kroltan

+0

'परीक्षण = html.fromstring (r.text) पर सटीक यूआरएल के साथ इसे करने की कोशिश' –

+1

ईद अत्यधिक वेब scraping http के लिए BeautifulSoup की सलाह देते हैं: // सुंदर-soup- 4.readthedocs.org/en/latest/#। यह आपके जीवन को बहुत आसान बना देगा। – Ron

उत्तर

13

प्रश्न में सर्वर आपको gzipped प्रतिक्रिया दे रहा है। सर्वर भी बहुत टूटा है; यह निम्न हेडर भेजता है:

$ curl -D - -o /dev/null -s -H 'Accept-Encoding: gzip, deflate' http://www.wrcc.dri.edu/WRCCWrappers.py?sodxtrmts+028815+por+por+pcpn+none+mave+5+01+F 
HTTP/1.1 200 OK 
Date: Tue, 06 Jan 2015 17:46:49 GMT 
Server: Apache 
<!DOCTYPE HTML PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "DTD/xhtml1-transitional.dtd"><html xmlns="http: //www.w3.org/1999/xhtml" lang="en-US"> 
Vary: Accept-Encoding 
Content-Encoding: gzip 
Content-Length: 3659 
Content-Type: text/html 

<!DOCTYPE..> लाइन है एक मान्य HTTP हेडर। इस प्रकार, शेष शीर्षलेख Server को अनदेखा कर रहे हैं। क्यों सर्वर अस्पष्ट है कि अस्पष्ट है; सभी संभावित हूड WRCCWrappers.py एक सीजीआई स्क्रिप्ट है जो हेडर आउटपुट नहीं करता है लेकिन इसमें डैक्ट टाइप लाइन के बाद एक डबल न्यूलाइन शामिल है, अपाचे सर्वर को अतिरिक्त हेडर डालने में डुप्लिकेट करना।

इस प्रकार, requests यह भी पता नहीं लगाता है कि डेटा gzip-encoded है। डेटा सब वहाँ है, आपको बस इसे डीकोड करना होगा। या आप कर सकते हैं अगर यह अधूरा नहीं था।

काम के आसपास सर्वर संपीड़न के साथ परेशान करने के लिए नहीं बताने के लिए है:

headers = {'Accept-Encoding': 'identity'} 
r = requests.get(url, headers=headers) 

और एक असम्पीडित प्रतिसाद दिया है।

संयोग

, अजगर 2 पर HTTP हेडर पार्सर इतना सख्त नहीं है और डॉक प्रकार एक हैडर घोषित करने के लिए प्रबंधित करता है:

>>> pprint(dict(r.headers)) 
{'<!doctype html public "-//w3c//dtd xhtml 1.0 transitional//en" "dtd/xhtml1-transitional.dtd"><html xmlns="http': '//www.w3.org/1999/xhtml" lang="en-US">', 
'connection': 'Keep-Alive', 
'content-encoding': 'gzip', 
'content-length': '3659', 
'content-type': 'text/html', 
'date': 'Tue, 06 Jan 2015 17:42:06 GMT', 
'keep-alive': 'timeout=5, max=100', 
'server': 'Apache', 
'vary': 'Accept-Encoding'} 

और content-encoding जानकारी बच जाता है, तो वहाँ requests की उम्मीद के रूप में, आप के लिए सामग्री डीकोड ।

+0

यह अनुरोध 2.4.3' –

+0

@ पैड्राइक कनिंघम का उपयोग करके मेरे लिए ठीक काम करता है: 2.5.1 के साथ नहीं। सर्वर HTTP और HTML के मिश्रण के साथ प्रतिक्रिया करता है। –

+0

@ पैड्राइक कनिंघम: पायथन 2 या पायथन 3? यह यहां अधिक प्रभाव का हो सकता है। –

0

इस यूआरएल के लिए HTTP शीर्षलेख अब तय किए गए हैं।

>>> import requests 
>>> print requests.__version__ 
2.5.1 
>>> r = requests.get('http://www.wrcc.dri.edu/WRCCWrappers.py?sodxtrmts+028815+por+por+pcpn+none+mave+5+01+F') 
>>> r.text[:100] 
u'\n<!DOCTYPE html>\n<HTML>\n<HEAD><TITLE>Monthly Average of Precipitation, Station id: 028815</TITLE></H' 
>>> r.headers 
{'content-length': '3672', 'content-encoding': 'gzip', 'vary': 'Accept-Encoding', 'keep-alive': 'timeout=5, max=100', 'server': 'Apache', 'connection': 'Keep-Alive', 'date': 'Thu, 12 Feb 2015 18:59:37 GMT', 'content-type': 'text/html; charset=utf-8'} 
संबंधित मुद्दे

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