Urllib2.urlopen- এ ব্যবহারকারী এজেন্ট পরিবর্তন করা হচ্ছে


101

Urllib2.urlopen- এ ডিফল্ট ছাড়া অন্য কোনও ব্যবহারকারী এজেন্টের সাথে কীভাবে আমি একটি ওয়েবপৃষ্ঠা ডাউনলোড করতে পারি?

উত্তর:


61

প্রত্যেকের পছন্দের ডাইভ ইন পাইথনে ইউজার-এজেন্ট সেট করা

ছোট গল্প: এটি করতে আপনি অনুরোধ.এডিডি_হেডার ব্যবহার করতে পারেন ।

অনুরোধটি তৈরি করার সময় আপনি শিরোনামকে অভিধান হিসাবেও পাস করতে পারেন, ডক্স নোট হিসাবে :

শিরোনাম একটি অভিধান হওয়া উচিত, এবং add_header()প্রতিটি কী এবং মান দিয়ে আর্গুমেন্ট হিসাবে ডাকা হত এমনটি বিবেচিত হবে । এটি প্রায়শই শিরোনামটির "স্পুফ" করতে User-Agentব্যবহৃত হয়, যা ব্রাউজার নিজের পরিচয় দেওয়ার জন্য ব্যবহার করে - কিছু এইচটিটিপি সার্ভার কেবল স্ক্রিপ্টগুলির বিপরীতে সাধারণ ব্রাউজারগুলির থেকে অনুরোধগুলি আসতে দেয়। উদাহরণ হিসেবে বলা যায়, মোজিলা ফায়ারফক্স হিসাবে নিজেকে শনাক্ত করতে পারে "Mozilla/5.0 (X11; U; Linux i686) Gecko/20071127 Firefox/2.0.0.11", যখন urllib2এর ডিফল্ট ইউজার এজেন্ট স্ট্রিং "Python-urllib/2.6"(পাইথন 2.6 তে) খুলুন।


118

আমি এর উত্তরে একটি অনুরূপ প্রশ্ন কয়েক সপ্তাহ আগে।

এই প্রশ্নে উদাহরণ কোড রয়েছে, তবে মূলত আপনি এর মতো কিছু করতে পারেন: ( আরএফসি 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 ইনস্টলেশনটিতে অন্তত নয়। ব্যবহারকারী-এজেন্ট কোনও কারণে উপেক্ষা করা হয়।
নাথান

4
আমি বিশ্বাস করি যে User-agentবাস্তবে হওয়া উচিত User-Agent(এটিকে মূলধনী করা হয়) যখন এটি করা হয় তখন আমার পক্ষে কাজ করে।
KriiV

4
শিরোনামের নামগুলি কেস-সংবেদনশীল।
নিকোলের

101
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 পুনরাবৃত্তি করুন যেখানে পুরানো সংস্করণটি urlib.urlopen (req) জরিমানা করবে কিন্তু উভয় উপায়ে, এটি কাজ করে এবং আমি জানি কীভাবে পাইথন 3 এ এটি ব্যবহার করতে হয় ।
জামেস্ক্যামবেল 31'15

আমি এখনও ত্রুটি পেয়েছি 404 :(
মাকসিম নিয়াজেভ

আমি data=b'None'উত্তর থেকে বিভ্রান্তিকর প্যারামিটারটি সরিয়েছি । এটি উদাহরণ অনুরোধটিকে অবৈধ ডেটা সহ পোষ্টের কাছে রূপান্তরিত করে। সম্ভবত আপনার ক্ষেত্রে ব্যর্থতার কারণ, @ ম্যাক্সিম
ব্যবহারকারী ২

9

এই সমস্ত তত্ত্বে কাজ করা উচিত, তবে (উইন্ডোজে পাইথন ২. 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')

4
opener.addheadersসম্ভবত হওয়া উচিত [('User-agent', 'Custom user agent')]। অন্যথায় এই সমস্ত পদ্ধতিতে কাজ করা উচিত (আমি পাইথন ২.7.৩ (লিনাক্স) এ পরীক্ষা করেছি)। আপনার ক্ষেত্রে এটি ভঙ্গ হতে পারে কারণ আপনি প্রক্সি যুক্তিটি ভুল ব্যবহার করেন।
jfs

আমার জন্য বিল্ড_পেনার কলটি ডিফল্ট ব্যবহারকারী-এজেন্টের সাথে ইতিমধ্যে শিরোনামগুলিতে সংজ্ঞায়িত হয়ে ফিরেছে। সুতরাং সংযোজন কেবল অন্য ব্যবহারকারী-এজেন্ট শিরোনাম তৈরি করবে, যা ২ য় হিসাবে উপেক্ষা করা হবে। এই কারণেই @ জ্যাকুনের সল কাজ করছে।
ভজক হার্মেকজ

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)

4
ইউআরএলটি আমার ব্রাউজারটি
প্রান্তে

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

4
প্রশ্নটি স্পষ্টভাবে আলোচনা করে 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'
গুগল বট: এর 'Googlebot/2.1'
মতো this

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

কেবল একটি সম্পত্তি পরিবর্তন করা কার্যকর হয় না কারণ ওয়েবসাইট এটি সন্দেহজনক অনুরোধ হিসাবে চিহ্নিত করে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.