Urllib, urllib2, urllib3 এবং অনুরোধ মডিউলের মধ্যে পার্থক্য কী?


750

পাইথন সালে মধ্যে পার্থক্য কি কি urllib, urllib2, urllib3এবং requestsমডিউল? তিনজন কেন? তারাও একই কাজ করছে বলে মনে হচ্ছে ...



2
হ্যাঁ, অনুরোধগুলি ব্যবহার করুন। stackoverflow.com/questions/22676/...
hughdbrown

75
অনুরোধ urllib3 ব্যবহার .. 3 একটি বড় সংখ্যা
ভাই

2
সংক্ষিপ্তসার: requestsবেশিরভাগ সময় ব্যবহার করুন । কখনও কখনও urllib2কাজ করে তবে আরও কোডের প্রয়োজন হয় এবং কম মার্জিত হয়। ব্যবহার করবেন না urllib
ট্রেভর বয়ড স্মিথ

10
এই প্রশ্নটি স্পষ্ট করে আপডেট করতে হবে যে urllibপাইথন 3 এ আরও একটি বিকল্প, বিভিন্ন উপায়ে পরিষ্কার করা উচিত। কিন্তু সৌভাগ্যক্রমে কর্মকর্তা ডকুমেন্টেশন এছাড়াও নোট যে " অনুরোধ প্যাকেজ একটি উচ্চ পর্যায়ের HTTP- র ক্লায়েন্ট ইন্টারফেসের জন্য সুপারিশ করা হয়। এ" 21.6। urllib.request - ইউআরএল খোলার জন্য এক্সটেনসিবল লাইব্রেরি - পাইথন ৩.6.৩ ডকুমেন্টেশন
nealmcb

উত্তর:


714

আমি জানি এটি ইতিমধ্যে বলা হয়েছে, তবে আমি requestsপাইথন প্যাকেজটির জন্য সুপারিশ করব ।

আপনি যদি অজগর ব্যতীত অন্য ভাষা ব্যবহার করেন তবে আপনি সম্ভবত ভাবছেন urllibএবং urllib2ব্যবহার করতে সহজ, খুব বেশি কোড নয় এবং অত্যন্ত সক্ষম, আমি এভাবেই ভাবতাম। তবে requestsপ্যাকেজটি অবিশ্বাস্যরূপে দরকারী এবং সংক্ষিপ্ত যে প্রত্যেকেরই এটি ব্যবহার করা উচিত।

প্রথমত, এটি একটি পুরোপুরি বিশ্রামপ্রাপ্ত এপিআই সমর্থন করে এবং এটি এতটা সহজ:

import requests

resp = requests.get('http://www.mywebsite.com/user')
resp = requests.post('http://www.mywebsite.com/user')
resp = requests.put('http://www.mywebsite.com/user/put')
resp = requests.delete('http://www.mywebsite.com/user/delete')

GET / POST কিনা তা বিবেচনা না করেই আপনাকে আর কখনও প্যারামিটারগুলি এনকোড করতে হবে না, এটি কেবল একটি যুক্তি হিসাবে একটি অভিধান নেয় এবং এটি ভাল:

userdata = {"firstname": "John", "lastname": "Doe", "password": "jdoe123"}
resp = requests.post('http://www.mywebsite.com/user', data=userdata)

এছাড়াও এটিতে জেএসওন ডিকোডারটিতে একটি বিল্টও রয়েছে (আবার, আমি জানি json.loads()অনেক বেশি লেখার দরকার নেই, তবে এটি নিশ্চিত সুবিধাজনক):

resp.json()

অথবা যদি আপনার প্রতিক্রিয়া ডেটা কেবল পাঠ্য হয় তবে ব্যবহার করুন:

resp.text

এটি হ'ল আইসবার্গের টিপ। এটি অনুরোধ সাইট থেকে বৈশিষ্ট্যগুলির তালিকা:

  • আন্তর্জাতিক ডোমেন এবং URL গুলি
  • অ্যালাইভ এবং সংযোগ পুলিং রাখুন
  • কুকি অধ্যবসায়ের সাথে সেশনস
  • ব্রাউজার-স্টাইলের SSL যাচাইকরণ
  • বেসিক / ডাইজেস্ট প্রমাণীকরণ
  • মার্জিত কী / মান কুকিজ
  • স্বয়ংক্রিয় ডিকম্প্রেশন
  • ইউনিকোড প্রতিক্রিয়া সংস্থা
  • মাল্টিপার্ট ফাইল আপলোড
  • সংযোগের সময়সীমা
  • .netrc সমর্থন
  • তালিকাবদ্ধ
  • পাইথন 2.6—3.4
  • শংকা মুক্ত.

32
আমি উত্তর হিসাবে এটি বেছে নিয়েছি কারণ আসল উত্তরটি বাসি হয়ে গেছে। সুতরাং আপনি যদি ভাবছেন যে এই উত্তরটি কেন 76 টি উর্ধ্বে উত্তর দিয়ে এগিয়ে আছে, কারণ কারণ অনুরোধগুলিই কাজগুলি করার নতুন ডিফ্যাক্টো উপায়।
পল বিগার

132
@ পোলবিগার আপনি বলেছেন যে এটিই সেরা উত্তর। তবে এটি আসলে প্রশ্নের উত্তর দেয় না। Urllib এবং urllib2 এর মধ্যে পার্থক্য সম্পর্কে আমি এখানে এসেছি। বিশেষত ইউআরএল এনকোডিং বৈশিষ্ট্যগুলি সম্পর্কে। উত্তর: ব্যবহার অনুরোধ! ;) কেবল আপনি বলতে চাইলে প্রশ্নটি স্পষ্ট করতে চান। যেমন দাঁড়িয়েছে, ক্রাস্টের উত্তর আসলে প্রশ্নের পুরোপুরি উত্তর দেয়।
exhuma

2
এটা খেয়াল পাইথন 3 ডকুমেন্টেশন এখনও অন্য স্বতন্ত্র গ্রন্থাগার আছে যা করতে সাহায্য করবে urllibযে, "এবং তার ডকুমেন্টেশন যে আনুষ্ঠানিকভাবে নোট অনুরোধ প্যাকেজ একটি উচ্চ পর্যায়ের HTTP- র ক্লায়েন্ট ইন্টারফেসের জন্য সুপারিশ করা হয়। এ" 21.6। urllib.request - ইউআরএল খোলার জন্য এক্সটেনসিবল লাইব্রেরি - পাইথন ৩.6.৩ ডকুমেন্টেশন এবং এটি urllib3ব্যবহৃত একটি দুর্দান্ত গ্রন্থাগার requests
nealmcb

ঠিক আছে আমি ছাপ তাদের ছাড়া অনুরোধে কোনো প্রতিস্থাপন হয়েছে জন্যurllib.parse()
বব স্টেইন

সম্মত হন। @ পালবিগগার সহ - অনুরোধগুলি ডি-ফ্যাক্টো উপায় হিসাবে উপস্থিত হবে না। প্রকৃতপক্ষে আমি এখানে এসে পৌঁছেছি যে অনুরোধের তুলনায় urllib (এবং অন্যান্য সংস্করণগুলি) কাজ করে না বা suboptimal হয়।
ডিএল

205

urllib2 কিছু অতিরিক্ত কার্যকারিতা সরবরাহ করে, যথা urlopen()ফাংশনটি আপনাকে শিরোনাম নির্দিষ্ট করার অনুমতি দিতে পারে (সাধারণত আপনাকে আগে httplib ব্যবহার করতে হত, যা আরও বেশি ভার্বোস)) আরও বেশি গুরুত্বপূর্ণ, যদিও urllib2 Requestক্লাস সরবরাহ করে যা আরও কিছু করার অনুমতি দেয় একটি অনুরোধ করার ঘোষণামূলক পদ্ধতির:

r = Request(url='http://www.mysite.com')
r.add_header('User-Agent', 'awesome fetcher')
r.add_data(urllib.urlencode({'foo': 'bar'})
response = urlopen(r)

নোট যেটি urlencode()শুধুমাত্র urllib এ রয়েছে, urlib2 নয়।

Urlib2 তে আরও উন্নত ইউআরএল সমর্থন বাস্তবায়নের জন্য হ্যান্ডলার রয়েছে। সংক্ষিপ্ত উত্তরটি হল, যদি না আপনি উত্তরাধিকারের কোডটি নিয়ে কাজ করছেন, আপনি সম্ভবত urllib2 থেকে ইউআরএল ওপেনারটি ব্যবহার করতে চান, তবে আপনাকে এখনও কিছু ইউটিলিটি ফাংশনের জন্য urllib এ আমদানি করতে হবে।

বোনাস উত্তর গুগল অ্যাপ ইঞ্জিনের সাহায্যে আপনি যে কোনও httplib, urllib বা urllib2 ব্যবহার করতে পারেন তবে এগুলি সবই গুগলের ইউআরএল ফ্যাচ এপিআইয়ের জন্য কেবল মোড়ক। এটি হ'ল আপনি এখনও পোর্টস, প্রোটোকল এবং অনুমোদিত প্রতিক্রিয়ার দৈর্ঘ্যের মতো একই সীমাবদ্ধতার অধীন। যদিও আপনি এইচটিটিপি ইউআরএলগুলি পুনরুদ্ধার করার জন্য প্রত্যাশা হিসাবে লাইব্রেরির মূলটি ব্যবহার করতে পারেন।


1
কীভাবে কেউ urllib2 ব্যবহার করে এনকোডযুক্ত ক্যোয়ারী স্ট্রিং সহ একটি ইউআরএল তৈরি করবেন? এটিই একমাত্র কারণ যে আমি urllib ব্যবহার করছি এবং আমি নিশ্চিত করতে চাই যে আমি সব কিছু সর্বশেষ / সর্বশ্রেষ্ঠ উপায়ে করছি।
গ্যাটারস্টার

2
আমার উপরের উদাহরণের মতো, আপনিও ব্যবহার করেন urlopen()এবং urlib2Request থেকে এবং আপনি urllib থেকে ব্যবহার করেন । উভয় গ্রন্থাগার ব্যবহারের ক্ষেত্রে কোনও সত্যিকারের ক্ষতি নেই যতক্ষণ না আপনি নিশ্চিত করেছেন যে আপনি সঠিক urlopen ব্যবহার করেছেন। [Urllib ডক্স] [1] এ সম্পর্কে পরিষ্কার যে এটি ব্যবহার করা স্বীকৃত ব্যবহার। [1]: docs.python.org/library/urllib2.html#urllib2.urlopenurlencode()
Crast

আমি এই টুকরোটি ব্যবহার করেছি urllib2.urlopen; অন্যান্য বৈচিত্রগুলিও রয়েছে।
আন্দ্রেই-নিকুলি পেট্রে

urllib2 করা সমর্থন করে না বা মুছতে যা ব্যথা
fkl

1
requestsকাস্টম শিরোলেখগুলিকেও মঞ্জুরি দিন: ডকস.প্যাথন-requests.org/en/master/user/quickstart/…
ওমর দাগান

46

urllib এবং urllib2 উভয় পাইথন মডিউল যা URL সম্পর্কিত অনুরোধ করে তবে বিভিন্ন কার্যকারিতা সরবরাহ করে।

1) urllib2 একটি ইউআরএল অনুরোধের জন্য শিরোনাম সেট করতে একটি অনুরোধ অবজেক্ট গ্রহণ করতে পারে, urllib কেবলমাত্র একটি URL গ্রহণ করে।

2) urllib উপলব্ধ urlencode পদ্ধতি যা তাহলে GET ক্যোয়ারী স্ট্রিং প্রজন্মের জন্য ব্যবহার করা হয়, urllib2 যেমন একটি ফাংশন নেই। এটি urlib 2 এর সাথে urllib প্রায়শই ব্যবহৃত হওয়ার একটি কারণ।

অনুরোধ - অনুরোধগুলি পাইথনে লিখিত একটি সাধারণ, সহজেই ব্যবহারযোগ্য এইচটিটিপি লাইব্রেরি।

1) পাইথন রিকোয়েস্টগুলি প্যারামিটারগুলি স্বয়ংক্রিয়ভাবে এনকোড করে থাকে তাই আপনি কেবলমাত্র যুক্তিগুলিতে এটি সরল আর্গুমেন্ট হিসাবে প্রেরণ করেন যেখানে প্যারামিটারগুলি পাস করার আগে এনকোড করার জন্য আপনাকে urlib.encode পদ্ধতিটি ব্যবহার করতে হবে ।

2) এটি স্বয়ংক্রিয়ভাবে প্রতিক্রিয়াটি ইউনিকোডে ডিকোড করে।

3) অনুরোধগুলিতে হ্যান্ডলিংয়ের চেয়েও আরও সুবিধাজনক ত্রুটি রয়েছে your যদি আপনার প্রমাণীকরণ ব্যর্থ হয় তবে urllib2 একটি urllib2 উত্থাপন করবে UR ইউরলিরর, যখন অনুরোধগুলি প্রত্যাশার মতো একটি স্বাভাবিক প্রতিক্রিয়া অবজেক্ট ফিরিয়ে দেবে। আপনারা সবাই দেখতে পাবেন যে অনুরোধটি বুলিয়ান সাড়া পেয়েছে কিনা। ড


10
urlib3 সম্পর্কে কি?
পাইরেটএপ

1
@PirateApp অনুরোধ উপরে নির্মিত হয় urllib3 । আমি মনে করি urllib3 ব্যবহার করে কোডটি আরও কার্যকর হতে পারে, কারণ এটি আপনাকে সেশনটি পুনরায় ব্যবহার করতে দেয়, যেখানে অনুরোধগুলি (কমপক্ষে 2 টি অনুরোধ, প্রত্যেকটি ব্যবহার করে এমন একটি) প্রতিটি অনুরোধের জন্য একটি তৈরি করে, তবে সে সম্পর্কে আমাকে উদ্ধৃতি দেবেন না। উভয়ই প্রমিত লাইব্রেরির অংশ নয় ( এখনও )
বরিস

12

পাইথন 2 তে পাইথন 3 তে বন্দরের বিষয়ে একটি উল্লেখযোগ্য পার্থক্য। urllib2 পাইথন 3 এর জন্য বিদ্যমান নেই এবং এর পদ্ধতিগুলি urllib এ পোর্ট করা হয়েছে। সুতরাং আপনি যে ভারী ব্যবহার করছেন এবং ভবিষ্যতে পাইথন 3 এ স্থানান্তরিত করতে চান, urllib ব্যবহার বিবেচনা করুন। তবে 2to3 সরঞ্জামটি আপনার জন্য স্বয়ংক্রিয়ভাবে বেশিরভাগ কাজ করবে।


12

কেবলমাত্র বিদ্যমান উত্তরগুলি যুক্ত করতে আমি পাই না যে পাইথন অনুরোধগুলি কোনও স্থানীয় লাইব্রেরি নয়। আপনি যদি নির্ভরতা যুক্ত করতে ঠিক থাকেন তবে অনুরোধগুলি ঠিক আছে। তবে, যদি আপনি নির্ভরতা যুক্ত করা এড়াতে চান তবে urllib একটি দেশীয় পাইথন লাইব্রেরি যা ইতিমধ্যে আপনার কাছে উপলভ্য।


11

আমি urllib.urlencodeফাংশনটি পছন্দ করি এবং এটি বিদ্যমান বলে মনে হয় না urllib2

>>> urllib.urlencode({'abc':'d f', 'def': '-!2'})
'abc=d+f&def=-%212'

4
কেবল একটি নোট, ইউলিনকোডের সাথে সাবধান থাকুন কারণ এটি <ইউনিকোড> অবজেক্টগুলি সরাসরি পরিচালনা করতে পারে না - আপনাকে ইউরেনকোডে পাঠানোর আগে আপনাকে তাদের এনকোড করতে হবে (u'blá'.encode ('utf-8'), বা যাই হোক না কেন)।

@ ব্যবহারকারী18015: আমি মনে করি না এটি পাইথন 3 এর সাথে প্রযোজ্য, আপনি কি স্পষ্ট করে বলতে পারেন?
জানুস ট্রয়লসন

আমি উপরে উল্লিখিত হিসাবে, এই প্রশ্নটি এবং বিভিন্ন উত্তরগুলি আপডেট করার জন্য এটি পরিষ্কার করতে হবে যে urllibপাইথন 3 এ আরও একটি বিকল্প, বিভিন্ন উপায়ে পরিষ্কার করা উচিত। কিন্তু সৌভাগ্যক্রমে, সরকারী ডকুমেন্টেশন এছাড়াও নোট যে " অনুরোধ প্যাকেজ একটি উচ্চ পর্যায়ের HTTP- র ক্লায়েন্ট ইন্টারফেস। জন্য সুপারিশ করা হয় এ" 21.6। urllib.request - ইউআরএল খোলার জন্য এক্সটেনসিবল লাইব্রেরি - পাইথন ৩.6.৩ ডকুমেন্টেশন
nealmcb

urllib2 এর অস্তিত্ব পাইথন 3
বোরিস

7

একটি ইউআরএল এর সামগ্রী পেতে:

try: # Try importing requests first.
    import requests
except ImportError: 
    try: # Try importing Python3 urllib
        import urllib.request
    except AttributeError: # Now importing Python2 urllib
        import urllib


def get_content(url):
    try:  # Using requests.
        return requests.get(url).content # Returns requests.models.Response.
    except NameError:  
        try: # Using Python3 urllib.
            with urllib.request.urlopen(index_url) as response:
                return response.read() # Returns http.client.HTTPResponse.
        except AttributeError: # Using Python3 urllib.
            return urllib.urlopen(url).read() # Returns an instance.

requestপ্রতিক্রিয়াগুলির জন্য পাইথন 2 এবং পাইথন 3 এবং নির্ভরতা কোডটি লেখা শক্ত কারণ তারা বিভিন্ন ধরণের ফাংশন urlopen()দেয় এবং requests.get()ফাংশন দেয়:

  • পাইথন 2 urllib.request.urlopen()রিটার্ন দেয় ahttp.client.HTTPResponse
  • পাইথন 3 urllib.urlopen(url)একটি প্রদান করেinstance
  • অনুরোধ request.get(url)ফেরত arequests.models.Response

5

আপনার সাধারণত urllib2 ব্যবহার করা উচিত, যেহেতু এটি অনুরোধের বিষয়গুলি গ্রহণ করে জিনিসগুলিকে কিছুটা সহজ করে তোলে এবং প্রোটোকল ত্রুটির উপর একটি URLExceptionও বাড়িয়ে তুলবে। গুগল অ্যাপ ইঞ্জিনের সাথে যদিও আপনি ব্যবহার করতে পারবেন না। গুগল তার স্যান্ডবক্সযুক্ত পাইথন পরিবেশে সরবরাহ করে এমন ইউআরএল আনার জন্য আপনাকে ব্যবহার করতে হবে ।


2
আপনি অ্যাপেনজিন সম্পর্কে যা বলেছেন তা সম্পূর্ণ সত্য নয়। আপনি এখন অ্যাপ্লিকেশন ইঞ্জিনে প্রকৃতপক্ষে httplib, urllib, এবং urllib2 ব্যবহার করতে পারেন (তারা ইউআরএল আনার জন্য মোড়ক, যাতে আরও কোড
অ্যাপেনজিনের

আহ, অবশ্যই নতুন হতে হবে। আমার কোডটি সর্বশেষে চেষ্টা করে ব্যর্থ হয়েছিল এবং আনতে নিয়ে কাজ করতে আবার লিখতে হয়েছিল ...
চিন্ময় কাঞ্চি


urllib2 পাইথন 3 এ সব অস্তিত্ব নেই
বরিস

@ বরিস এটি urllib.request এবং urllib.error এ স্থানান্তরিত হয়েছে ।
অ্যালান

1

মূল বিষয়টা আমি উপরের উত্তর অনুপস্থিত যে urllib আয় প্রকারের একটি বস্তু হয় <class http.client.HTTPResponse>যেহেতু requestsআয় <class 'requests.models.Response'>

এই কারণে, পড়ুন () পদ্ধতিটি ব্যবহার করা যেতে পারে urllibতবে সাথে নয় requests

পিএস: requestsইতিমধ্যে এতগুলি পদ্ধতিতে সমৃদ্ধ যে এটির জন্য খুব কমই আর প্রয়োজন read();>

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