سؤال

وكيف يمكنني تحميل صفحة ويب مع وكيل مستخدم آخر غير الافتراضي واحد على urllib2.urlopen؟

هل كانت مفيدة؟

المحلول

ضبط عامل المستخدم من الجميع المفضل <وأ href = "HTTP: / /diveintopython.net/ "يختلط =" noreferrer "> يغوص في بيثون .

والقصة القصيرة: يمكنك استخدام 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).

نصائح أخرى

أجاب على <لأ href = "https://stackoverflow.com/questions/761978/send-headers -along في والثعبان "> سؤال مماثل قبل بضعة أسابيع.

وهناك رمز المثال في هذا السؤال، ولكن أساسا يمكنك أن تفعل شيئا من هذا القبيل: (لاحظ رسملة User-Agent اعتبارا من <لأ href = "https://www.w3.org/Protocols/rfc2616/rfc2616-sec14 أتش تي أم أل "يختلط =" noreferrer "> RFC 2616 ، قسم 14،43).

opener = urllib2.build_opener()
opener.addheaders = [('User-Agent', 'Mozilla/5.0')]
response = opener.open('http://www.stackoverflow.com')
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()

لبيثون 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)

وكل هذه يجب أن تعمل من الناحية النظرية، ولكن (مع بايثون 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')

ل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')

وحل آخر في urllib2 وبيثون 2.7:

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

وجرب هذا:

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

وهناك نوعان من خصائص 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'
جوجل بوت: '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>)

وتغيير خاصية واحدة فقط لا يعمل لأن الموقع يصادف أنه طلب المشبوهة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top