2009-04-29 23 views
86

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

उत्तर

54

Setting the User-Agent हर किसी के पसंदीदा Dive Into Python से।

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

तुम भी एक शब्दकोश के रूप में हेडर जब अनुरोध ही है, as the docs note बनाने पारित कर सकते हैं:

हेडर एक शब्दकोश होना चाहिए, और माना जाएगा के रूप में अगर 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 पर) है।

106

Ianswered कुछ हफ्ते पहले similar question

है कि प्रश्न में उदाहरण कोड नहीं है, लेकिन मूल रूप से आप कुछ इस तरह कर सकते हैं: (। नोट RFC 2616 के रूप में User-Agent का पूंजीकरण, खंड 14,43)

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

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

+1

मेरा मानना ​​है कि 'उपयोगकर्ता-एजेंट' वास्तव में 'उपयोगकर्ता-एजेंट' होना चाहिए (ए पूंजीकृत है) ऐसा करने पर मेरे लिए काम करना प्रतीत होता है। – KriiV

+0

शीर्षलेख नाम केस-असंवेदनशील हैं। –

92
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', हेडर = {'उपयोगकर्ता-एजेंट': 'मोज़िला/5.0'})'। मैं सिर्फ एक ही अनुरोध करने के लिए इस फॉर्म को पसंद करता हूं। –

9

इन सभी सिद्धांत में काम करना चाहिए, लेकिन (अजगर 2.7.2 के साथ Windows पर कम से कम) किसी भी समय आप एक कस्टम उपयोगकर्ता-एजेंट हेडर भेजने के लिए, urllib2 कि hea नहीं भेजता है डेर। यदि आप एक उपयोगकर्ता-एजेंट हेडर भेजने का प्रयास नहीं करते हैं, यह डिफ़ॉल्ट अजगर/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') 
+0

@ जेकॉन के समाधान ने पाइथन 2.7.2 (लिनक्स) – bparker

+2

'opener.addheaders' पर शायद मेरे लिए काम किया ['' 'उपयोगकर्ता-एजेंट', 'कस्टम उपयोगकर्ता एजेंट')]'। अन्यथा इन सभी विधियों को काम करना चाहिए (मैंने पायथन 2.7.3 (लिनक्स) पर परीक्षण किया है)। आपके मामले में यह तोड़ सकता है क्योंकि आप प्रॉक्सी तर्क गलत का उपयोग करते हैं। – jfs

+0

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

11

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

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

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

5

urllib2 में एक अन्य समाधान और अजगर 2.7:

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

मुझे एक पृष्ठ के लिए त्रुटि 404 मिलती है जो मौजूद है यदि यूआरएल मेरे ब्राउजर में प्रवेश करता है – Yebach

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') 
+1

ने मुझे बहुत मदद की, धन्यवाद! – Meysam

3

इस प्रयास करें:
addheaders = [('User-Agent', 'Python-urllib/1.17'), ('Accept', '*/*')] और
version = 'Python-urllib/1.17':

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

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

1

वहाँ urllib.URLopener() अर्थात् के दो गुण हैं।
वेबसाइट को बेवकूफ बनाने के लिए आपको इन दोनों मानों को एक स्वीकृत उपयोगकर्ता-एजेंट में बदलने की आवश्यकता है। उदाहरण के लिए
क्रोम ब्राउज़र: 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.149 Safari/537.36'
Google बॉट: '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>) 

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

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