उपयोगकर्ता एजेंट को urllib2.urlopen पर बदलना


99

मैं urlib2.urlopen पर डिफ़ॉल्ट के अलावा एक उपयोगकर्ता एजेंट के साथ एक वेबपेज कैसे डाउनलोड कर सकता हूं?

जवाबों:


61

पायथन में सभी के पसंदीदा डाइव से यूजर-एजेंट सेट करना

लघु कहानी: आप ऐसा करने के लिए Request.add_header का उपयोग कर सकते हैं ।

डॉक्स नोट के रूप में , अनुरोध को बनाते समय आप हेडर को एक शब्दकोश के रूप में भी पारित कर सकते हैं :

हेडर एक शब्दकोश होना चाहिए, और माना जाएगा जैसे कि add_header()प्रत्येक कुंजी और मान के साथ तर्कों के रूप में बुलाया गया था। यह अक्सर User-Agentहेडर को "स्पूफ" करने के लिए उपयोग किया जाता है, जिसका उपयोग ब्राउज़र द्वारा स्वयं की पहचान करने के लिए किया जाता है - कुछ HTTP सर्वर केवल स्क्रिप्ट के विपरीत सामान्य ब्राउज़र से आने वाले अनुरोधों की अनुमति देते हैं। उदाहरण के लिए, मोज़िला फ़ायरफ़ॉक्स खुद की पहचान कर सकता है "Mozilla/5.0 (X11; U; Linux i686) Gecko/20071127 Firefox/2.0.0.11", जबकि urllib2डिफ़ॉल्ट उपयोगकर्ता एजेंट स्ट्रिंग है "Python-urllib/2.6"(पायथन 2.6 पर)।


117

मैं जवाब एक समान प्रश्न एक जोड़ी हफ्ते पहले।

उस प्रश्न में उदाहरण कोड है, लेकिन मूल रूप से आप ऐसा कुछ कर सकते हैं: ( आरएफसी 2616 , धारा 14.43 के User-Agentरूप में पूंजीकरण पर ध्यान दें )।

opener = urllib2.build_opener()
opener.addheaders = [('User-Agent', 'Mozilla/5.0')]
response = opener.open('http://www.stackoverflow.com')

8
यह विधि अन्य हेडर के लिए काम करती है, लेकिन उपयोगकर्ता-एजेंट नहीं - कम से कम मेरी 2.6.2 स्थापना में नहीं। उपयोगकर्ता-एजेंट को किसी कारण से अनदेखा किया जाता है।
नाथन

3
मेरा मानना ​​है कि User-agentवास्तव में ऐसा होना चाहिए User-Agent(ए को पूंजीकृत किया जाता है) ऐसा करने पर मेरे लिए काम करता है।
KriiV

1
हेडर नाम केस-असंवेदनशील हैं।
निकोलस

100
headers = { 'User-Agent' : 'Mozilla/5.0' }
req = urllib2.Request('www.example.com', None, headers)
html = urllib2.urlopen(req).read()

या, थोड़ा छोटा:

req = urllib2.Request('www.example.com', headers={ 'User-Agent': 'Mozilla/5.0' })
html = urllib2.urlopen(req).read()

4
नामित मापदंडों के साथ आप इसे दो लाइनों में कर सकते हैं। पहली पंक्ति निकालें और दूसरी को इसके साथ बदलें req = urllib2.Request('www.example.com', headers={'User-Agent': 'Mozilla/5.0'}):। मैं सिर्फ एक अनुरोध करने के लिए इस फॉर्म को पसंद करता हूं।
इयान सैमुअल मैकलीन एल्डर

या उससे भी छोटी, एक पंक्ति में:html = urlopen(Request('http://www.example.com', headers={'User-Agent': 'Mozilla/5.0'})).read()
उपयोगकर्ता

13

अजगर 3 के लिए, urllib 3 मॉड्यूल में विभाजित है ...

import urllib.request
req = urllib.request.Request(url="http://localhost/", headers={'User-Agent':' Mozilla/5.0 (Windows NT 6.1; WOW64; rv:12.0) Gecko/20100101 Firefox/12.0'})
handler = urllib.request.urlopen(req)

इससे आश्चर्यजनक रूप से मदद मिली। मुझे समझ नहीं आ रहा है कि मुझे अनुरोध की आवश्यकता क्यों है। सामान्य और फिर urllib.request.urlopen को दोहराएं जहां पुराना संस्करण सिर्फ urllib.urlopen (req) ठीक करेगा, लेकिन किसी भी तरह से, यह काम करता है और मुझे पता है कि इसे अजगर 3 में अब कैसे उपयोग करना है। ।
jamescampbell

मुझे अभी भी 404 त्रुटि हो रही है :(
मक्सिम नियाज़ेव

मैंने data=b'None'उत्तर देने वाले भ्रामक पैरामीटर को हटा दिया है । इसने अवैध डेटा के साथ POST के उदाहरण अनुरोध को बदल दिया। संभवतः आपके मामले में विफलता का कारण, @ माकिसिम
उपयोगकर्ता

9

इन सभी को सिद्धांत रूप में काम करना चाहिए, लेकिन कम से कम विंडोज पर पायथन 2.7.2 के साथ) किसी भी समय आप एक कस्टम उपयोगकर्ता-एजेंट हेडर भेजते हैं, urllib2 उस हेडर को नहीं भेजता है। यदि आप उपयोगकर्ता-एजेंट शीर्ष लेख भेजने की कोशिश नहीं करते हैं, तो यह डिफ़ॉल्ट पायथन / urllib2 भेजता है

इनमें से कोई भी तरीका उपयोगकर्ता-एजेंट को जोड़ने के लिए काम नहीं करता है, लेकिन वे अन्य हेडर के लिए काम करते हैं:

opener = urllib2.build_opener(proxy)
opener.addheaders = {'User-agent':'Custom user agent'}
urllib2.install_opener(opener)

request = urllib2.Request(url, headers={'User-agent':'Custom user agent'})

request.headers['User-agent'] = 'Custom user agent'

request.add_header('User-agent', 'Custom user agent')

2
opener.addheadersशायद होना चाहिए [('User-agent', 'Custom user agent')]। अन्यथा इन सभी तरीकों से काम करना चाहिए (मैंने पायथन 2.7.3 (लिनक्स) पर परीक्षण किया है)। आपके मामले में यह टूट सकता है क्योंकि आप प्रॉक्सी तर्क का गलत उपयोग करते हैं।
jfs

मेरे लिए build_opener कॉल डिफ़ॉल्ट उपयोगकर्ता-एजेंट के साथ पहले से ही हेडर में परिभाषित किया जा रहा है। तो अपडिंग सिर्फ एक और यूजर-एजेंट हेडर बनाएगी, जिसे 2 के रूप में नजरअंदाज कर दिया जाएगा। इसीलिए @ jcoon का सोल काम कर रहा है।
वाजेक हर्मेज़

6

urllibआप के लिए उपयोग कर सकते हैं:

from urllib import FancyURLopener

class MyOpener(FancyURLopener, object):
    version = 'Mozilla/5.0 (Windows; U; Windows NT 5.1; it; rv:1.8.1.11) Gecko/20071127 Firefox/2.0.0.11'

myopener = MyOpener()
myopener.retrieve('https://www.google.com/search?q=test', 'useragent.html')

5

urllib2और पायथन 2.7 में एक और समाधान :

req = urllib2.Request('http://www.example.com/')
req.add_unredirected_header('User-Agent', 'Custom User-Agent')
urllib2.urlopen(req)

2
मुझे उस पृष्ठ के लिए एक त्रुटि 404 है जो मौजूद है अगर url ने मेरे ब्राउज़र को गर्त में
डाला

2

इसे इस्तेमाल करे :

html_source_code = requests.get("http://www.example.com/",
                   headers={'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.107 Safari/537.36',
                            'Upgrade-Insecure-Requests': '1',
                            'x-runtime': '148ms'}, 
                   allow_redirects=True).content

1
प्रश्न स्पष्ट रूप से चर्चा करता है urllib2और अन्य मॉड्यूल नहीं।
रॉन क्लेन

2

दो गुण हैं urllib.URLopener()अर्थात्:
addheaders = [('User-Agent', 'Python-urllib/1.17'), ('Accept', '*/*')]और
version = 'Python-urllib/1.17'
वेबसाइट को बेवकूफ बनाने के लिए आपको इन दोनों मूल्यों को एक स्वीकृत उपयोगकर्ता-एजेंट में बदलना होगा। उदाहरण के लिए
क्रोम ब्राउज़र: 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.149 Safari/537.36'
Google bot: 'Googlebot/2.1'
इस तरह

import urllib
page_extractor=urllib.URLopener()  
page_extractor.addheaders = [('User-Agent', 'Googlebot/2.1'), ('Accept', '*/*')]  
page_extractor.version = 'Googlebot/2.1'
page_extractor.retrieve(<url>, <file_path>)

सिर्फ एक संपत्ति बदलने से काम नहीं चलता क्योंकि वेबसाइट इसे एक संदिग्ध अनुरोध के रूप में चिह्नित करती है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.