python रथम पायथन के साथ विकिपीडिया लेख प्राप्त करें




विश्व में सर्वप्रथम महिलाओं को मत देने का अधिकार किस देश में मिला (8)

यूज़र एजेंट शीर्ष लेख को बदलने का प्रयास करें जैसे आप अपने अनुरोध में भेज रहे हैं: उपयोगकर्ता-एजेंट: मोजिला / 5.0 (X11; यू; लिनक्स i686; एन-यूएस; आर.वी.: 1.9.0.1) गीको / 2008072820 उबंटू / 8.04 (हार्डी) फ़ायरफ़ॉक्स / 3.0.1 (लिनक्स टकसाल)

मैं अजगर के urlib के साथ एक विकिपीडिया लेख लाने की कोशिश करता हूं:

f = urllib.urlopen("http://en.wikipedia.org/w/index.php?title=Albert_Einstein&printable=yes")           
s = f.read()
f.close()

हालांकि एचटीएमएल पृष्ठ के बजाय मुझे निम्नलिखित प्रतिक्रिया मिलती है: त्रुटि - विकिमीडिया फाउंडेशन:

Request: GET http://en.wikipedia.org/w/index.php?title=Albert_Einstein&printable=yes, from 192.35.17.11 via knsq1.knams.wikimedia.org (squid/2.6.STABLE21) to ()
Error: ERR_ACCESS_DENIED, errno [No Error] at Tue, 23 Sep 2008 09:09:08 GMT 

विकिपीडिया का अनुरोध ब्लॉक करने लगता है जो कि एक मानक ब्राउज़र से नहीं हैं।

किसी को भी इस के आसपास काम करने के लिए कैसे पता है?


यदि आप विकिपीडिया सामग्री तक पहुंचने की कोशिश कर रहे हैं (और पेज के बारे में कोई विशेष जानकारी की आवश्यकता नहीं है), एपीआई का उपयोग करने के बजाय विकीटेक्स प्राप्त करने के लिए आपको 'action = raw' के साथ index.php पर कॉल करना चाहिए, जैसे में:

'Http://en.wikipedia.org/w/index.php? कार्रवाई = कच्चा और शीर्षक = मुख्य_पेज '

या, अगर आप HTML कोड चाहते हैं, तो 'एक्शन = रेंडर' का प्रयोग करें जैसे:

'Http://en.wikipedia.org/w/index.php? कार्रवाई = रेंडर और शीर्षक = मेन_पेज '

आप 'अनुभाग = 3' जैसी कुछ चीज़ों के साथ सामग्री का सिर्फ एक भाग प्राप्त करने के लिए एक अनुभाग भी परिभाषित कर सकते हैं

आप फिर urllib2 मॉड्यूल (चुने हुए उत्तर में शर्मिंदा के रूप में) का उपयोग कर सकते हैं। हालांकि, अगर आपको पृष्ठ के बारे में जानकारी की आवश्यकता है (जैसे संशोधन), तो आप म्यूजिकल का उपयोग कर बेहतर होगा क्योंकि उपर्युक्त उपरोक्त

यदि आपको अधिक जानकारी की आवश्यकता है तो मिडियाविकि के अकसर पूछें


यह विशिष्ट समस्या का समाधान नहीं है। लेकिन इसके बजाय आप mwclient लाइब्रेरी ( http://botwiki.sno.cc/wiki/Python:Mwclient ) का उपयोग करने के लिए intersting हो सकता है। यह इतना आसान होगा विशेष रूप से जब आप सीधे लेख सामग्री प्राप्त करेंगे, जो आपके लिए HTML को पार्स करने की आवश्यकता को हटा देगा।

मैंने इसे दो परियोजनाओं के लिए इस्तेमाल किया है, और यह बहुत अच्छी तरह से काम करता है।


किसी भी साइट के लिए मैं जो सामान्य समाधान का उपयोग करता हूं वह फ़ायरफ़ॉक्स का उपयोग कर पेज को एक्सेस करना है, और फायरबग जैसी किसी एक्सटेंशन का उपयोग करना, किसी भी कुकी सहित किसी भी HTTP अनुरोध के सभी विवरण रिकॉर्ड करना है।

आपके प्रोग्राम में (इस मामले में पायथन में) आपको एक HTTP अनुरोध भेजने की कोशिश करनी चाहिए जैसा कि फ़ायरफ़ॉक्स से काम करने वाले एक के लिए आवश्यक है। इसमें अक्सर उपयोगकर्ता-एजेंट, रेफेरर और कुकी फ़ील्ड सेट करना शामिल होता है, लेकिन अन्य हो सकते हैं


आपको urllib2 का उपयोग करने की आवश्यकता है जो उपयोगकर्ता एजेंट को बदलने के लिए अजगर स्टडी पुस्तकालय में urllib को ऊपर ले जाती है।

उदाहरणों से सीधे

import urllib2
opener = urllib2.build_opener()
opener.addheaders = [('User-agent', 'Mozilla/5.0')]
infile = opener.open('http://en.wikipedia.org/w/index.php?title=Albert_Einstein&printable=yes')
page = infile.read()

?printable=yes साथ पृष्ठ का अनुरोध करना आपको एक संपूर्ण अपेक्षाकृत स्वच्छ HTML दस्तावेज़ देता है ?action=render आपको सिर्फ एचटीएमएल शरीर देता है मिडियाविकि एक्शन एपीआई के माध्यम से पेज को पार्स करने के लिए action=parse भी इसी तरह आपको सिर्फ एचडीएमएल देता है लेकिन अगर आप बेहतर नियंत्रण चाहते हैं तो पार्स एपीआई सहायता देखें

यदि आप पृष्ठ एचटीएमएल चाहते हैं, तो आप इसे रेंडर कर सकते हैं, नया आरईटीबीज़ एपीआई का इस्तेमाल करना तेजी से और बेहतर है, जो पृष्ठ का कैश्ड एचटीएमएल प्रतिनिधित्व देता है। इस मामले में, https://en.wikipedia.org/api/rest_v1/page/html/Albert_Einstein

नवंबर 2015 तक, आपको अपने उपयोगकर्ता-एजेंट को सेट करने की ज़रूरत नहीं है, लेकिन इसे जोरदार प्रोत्साहित किया जाता है । इसके अलावा, लगभग सभी विकिमीडिया विकीओं को HTTPS की आवश्यकता होती है , इसलिए 301 रीडायरेक्ट से बचें और http के अनुरोधों को बनाये रखें।


आपको एक ब्राउज़र उपयोगकर्ता-एजेंट का प्रतिरूपण करने की आवश्यकता नहीं है; कोई भी उपयोगकर्ता-एजेंट बिल्कुल काम करेगा, सिर्फ रिक्त नहीं होगा।


import urllib
s = urllib.urlopen('http://en.wikipedia.org/w/index.php?action=raw&title=Albert_Einstein').read()

यह उपयोगकर्ता एजेंट को बदलने के बिना मेरे लिए काम करता है। "कार्रवाई = कच्चे" के बिना यह मेरे लिए काम नहीं करता है





http-status-code-403