পাইথন 2 এ আপনি কীভাবে হেড এইচটিটিপি অনুরোধ প্রেরণ করবেন?


114

আমি এখানে যা করার চেষ্টা করছি তা হল একটি প্রদত্ত ইউআরএলটির শিরোনাম পাওয়া যাতে আমি মাইমে টাইপ নির্ধারণ করতে পারি। আমি http://somedomain/foo/উদাহরণস্বরূপ কোনও এইচটিএমএল নথি বা একটি জেপিইজি চিত্র ফিরিয়ে দেবে কিনা তা দেখতে আমি সক্ষম হতে চাই । সুতরাং, আমাকে কীভাবে হেড অনুরোধ প্রেরণ করতে হবে তা নির্ধারণ করা দরকার যাতে আমি সামগ্রীটি ডাউনলোড না করেই মাইমে টাইপটি পড়তে পারি। কেউ কি এটি করার সহজ উপায় সম্পর্কে জানেন?

উত্তর:


104

সম্পাদনা : এই উত্তরটি কার্যকর হয়, তবে আজকাল আপনার কেবল নীচের অন্যান্য উত্তর দ্বারা উল্লিখিত অনুরোধ পাঠাগার ব্যবহার করা উচিত ।


Httplib ব্যবহার করুন ।

>>> import httplib
>>> conn = httplib.HTTPConnection("www.google.com")
>>> conn.request("HEAD", "/index.html")
>>> res = conn.getresponse()
>>> print res.status, res.reason
200 OK
>>> print res.getheaders()
[('content-length', '0'), ('expires', '-1'), ('server', 'gws'), ('cache-control', 'private, max-age=0'), ('date', 'Sat, 20 Sep 2008 06:43:36 GMT'), ('content-type', 'text/html; charset=ISO-8859-1')]

এখানে একটা ব্যাপার getheader(name)হেডার একটি নির্দিষ্ট জন্য।


2
এই প্রতিক্রিয়াটিকে উত্তর হিসাবে চিহ্নিত করা হয়েছে তবে অনুরোধগুলির লাইবটি দেখতে হবে। ডালিউসের প্রতিক্রিয়াটি দেখুন যা কিছুটা নীচে।
বাহাদির ক্যামবেল

এটি সত্যিই দুর্দান্ত, তবে এটির জন্য আপনার অনুরোধের হোস্ট এবং পথের পৃথক মান থাকতে হবে। এটি urlparseহাতে থাকা দরকারী , যা কিছু নিম্ন-স্তরের রেপোনাস দেখিয়েছে।
টমাসজ গেন্ডার

7
পাইথন 3 এর জন্য নোট; httplibনামকরণ করা হয়েছে http.client
সন্তোষ কুমার

2
দুর্ভাগ্যক্রমে, requestsপাইথনকে ডিফল্টরূপে প্রেরণ করা হয় না।
রোক

@rook তন্ন তন্ন আপনার প্রোগ্রাম :)
Eevee

109

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

>>> import urllib2
>>> class HeadRequest(urllib2.Request):
...     def get_method(self):
...         return "HEAD"
... 
>>> response = urllib2.urlopen(HeadRequest("http://google.com/index.html"))

শিরোনাম পূর্বের মত প্রতিক্রিয়া.info () এর মাধ্যমে উপলব্ধ। মজার বিষয় হল, আপনি যে ইউআরএলটিতে পুনঃনির্দেশিত হয়েছিল তা আপনি খুঁজে পেতে পারেন:

>>> print response.geturl()
http://www.google.com.au/index.html

1
প্রতিক্রিয়া.info ()।
শেন

6
অজগর ২.7.১ (উবুন্টু ন্যাটি) দিয়ে এটি চেষ্টা করা ব্যতীত, যদি কোনও পুনর্নির্দেশ হয় তবে এটি গন্তব্যস্থলে একটি জিইটি করে, হেড নয় ...
আইচিন

1
এটি এর সুবিধা httplib.HTTPConnection, যা স্বয়ংক্রিয়ভাবে পুনঃনির্দেশগুলি পরিচালনা করে না।
এহতেশ চৌধুরী

তবে দোশিয়ার উত্তর দিয়েছি। সময়সীমা নির্ধারণ কিভাবে? কীভাবে খারাপ ইউআরএলগুলি পরিচালনা করতে হয়, যেমন, ইউআরএলগুলি যা বেঁচে নেই।
ফ্যানচ্যান্ন

65

বাধ্যতামূলক Requestsউপায়:

import requests

resp = requests.head("http://www.google.com")
print resp.status_code, resp.text, resp.headers

36

আমি বিশ্বাস করি অনুরোধ গ্রন্থাগারের পাশাপাশি উল্লেখ করা উচিত।


5
এই উত্তরটি আরও মনোযোগ দেওয়ার দাবি রাখে। দেখতে বেশ ভাল লাইব্রেরির মতো যা সমস্যাটিকে তুচ্ছ করে তোলে।
নিক retallack

3
আমি সম্মতি জানাই অনুরোধ করা খুব সহজ ছিল: {কোড} আমদানি করার অনুরোধগুলি r = অনুরোধগুলি ( হেড 'github.com' ) {কোড}
লুইস আর।

@ লুইসর: যদি কোনও পুনর্নির্দেশ হয় তবে এটি জিইটি / পোস্ট / পুট / ডিলেটও অনুসরণ করে।
jfs

@ নিক রেটাল্যাক: পুনঃনির্দেশগুলি অক্ষম করার কোনও সহজ উপায় নেই। allow_redirectsকেবলমাত্র পোষ্ট / পুট / ডিলিট পুনঃনির্দেশগুলি অক্ষম করতে পারে। উদাহরণ: প্রধান অনুরোধটি পুনর্নির্দেশ করা হবে না
jfs

@ জেফেসেবাস্টিয়ান আপনার উদাহরণের লিঙ্কটি নষ্ট হয়ে গেছে বলে মনে হচ্ছে। নিম্নলিখিত পুনর্নির্দেশগুলি দিয়ে আপনি কি এই বিষয়ে বিস্তারিত বলতে পারবেন?
পাইওটার ডব্রোগোস্ট

17

শুধু:

import urllib2
request = urllib2.Request('http://localhost:8080')
request.get_method = lambda : 'HEAD'

response = urllib2.urlopen(request)
response.info().gettype()

সম্পাদনা: আমি ঠিক বুঝতে পেরেছি যে এখানে httplib2: D রয়েছে

import httplib2
h = httplib2.Http()
resp = h.request("http://www.google.com", 'HEAD')
assert resp[0]['status'] == 200
assert resp[0]['content-type'] == 'text/html'
...

লিঙ্ক পাঠ্য


আপনি গেম_মোথডকে এটিকে আবদ্ধ করার পরিবর্তে আনবাউন্ড ফাংশন হিসাবে ছেড়ে চলে যাচ্ছেন তাতে কিছুটা খারাপ লাগবে না request। (যেমন, এটি কাজ করবে তবে এটি খারাপ স্টাইল এবং আপনি যদি selfএটি ব্যবহার করতে চান - শক্ত))
ক্রিস মরগান

4
আপনি কি এই সমাধানটির উপকারিতা এবং কনস সম্পর্কে আরও কিছুটা ব্যাখ্যা করতে পারেন? আপনি দেখতে পাচ্ছেন আমি পাইথন বিশেষজ্ঞ নই, সুতরাং কখন খারাপ হতে পারে তা জেনে আমি উপকৃত হতে পারি;) উদ্বেগটি যত দ্রুত বুঝতে পেরেছি তা হ্যাক যা বাস্তবায়ন পরিবর্তনের উপর নির্ভর করে কাজ করতে পারে বা নাও পারে?
পাওয়ে প্র্যাক

এই কোডটির এই দ্বিতীয় সংস্করণটি কেবলমাত্র 403 ফরবিডেশন সহ ইউআরএল জন্য আমার জন্য কাজ করেছে। অন্যরা ব্যতিক্রম ছুঁড়ে মারছিল।
দ্বৈততা_

10

সম্পূর্ণতার জন্য একটি পাইথন 3 উত্তর HTTPlib ব্যবহার করে গৃহীত উত্তরের সমতুল্য

এটি মূলত একই কোড যা লাইব্রেরিটিকে আর httplib বলা হয় না তবে http.client

from http.client import HTTPConnection

conn = HTTPConnection('www.google.com')
conn.request('HEAD', '/index.html')
res = conn.getresponse()

print(res.status, res.reason)

2
import httplib
import urlparse

def unshorten_url(url):
    parsed = urlparse.urlparse(url)
    h = httplib.HTTPConnection(parsed.netloc)
    h.request('HEAD', parsed.path)
    response = h.getresponse()
    if response.status/100 == 3 and response.getheader('Location'):
        return response.getheader('Location')
    else:
        return url

এর আগে ডলারের চিহ্নগুলি কী কী import? জন্য +1 urlparse- একসঙ্গে সঙ্গে httplibতারা সান্ত্বনা দিতে urllib2যখন ইনপুট পাশ URL গুলি সঙ্গে তার আচরণ।
টমাসজ গেন্ডার

1

একদিকে যেমন, httplib ব্যবহার করার সময় (কমপক্ষে ২.২.২ এ) একটি হেড অনুরোধের প্রতিক্রিয়া পড়ার চেষ্টা করা অবরুদ্ধ হয়ে যায় (রিডলাইনে) এবং পরবর্তীকালে ব্যর্থ হয়। যদি আপনি প্রতিক্রিয়াটি পড়তে ইস্যু না করেন তবে আপনি সংযোগে অন্য একটি অনুরোধ প্রেরণ করতে অক্ষম হন, আপনাকে একটি নতুন খোলার দরকার হবে। অথবা অনুরোধগুলির মধ্যে একটি দীর্ঘ বিলম্ব গ্রহণ করুন।


1

আমি খুঁজে পেয়েছি যে httplib urllib2 এর চেয়ে কিছুটা দ্রুত। আমি দুটি প্রোগ্রাম টাইম করেছিলাম - একটিতে httplib এবং অন্যটি urllib2 ব্যবহার করে - 10,000 ইউআরএল-এ HEAD অনুরোধ প্রেরণ করা। এই httplib এক কয়েক মিনিট দ্বারা দ্রুত ছিল। httplib এর মোট পরিসংখ্যানগুলি ছিল: বাস্তব 6m21.334s ব্যবহারকারী 0m2.124s ss 0m16.372s

এবং urllib2 এর মোট পরিসংখ্যানগুলি ছিল: আসল 9 এম 1.380 এর ব্যবহারকারী 0 এম 16.666 s সিস 0 এম 28.565 এস

অন্য কারও কি এতে ইনপুট রয়েছে?


ইনপুট? সমস্যাটি আইও-আবদ্ধ এবং আপনি ব্লকড্রের লাইব্রেরি ব্যবহার করছেন। আপনি আরও ভাল পারফরম্যান্স চাইলে ইভেন্টলেটে স্যুইচ করুন বা মোচড় দিন। আপনি যে urlib2 এর উল্লেখ করেছেন তার সীমাবদ্ধতাগুলি CPU- সীমাবদ্ধ।
ডেভিন জিনপিয়ের

3
urllib2 পুনঃনির্দেশগুলি অনুসরণ করে, সুতরাং আপনার কিছু ইউআরএল যদি পুনঃনির্দেশিত হয় তবে এটি সম্ভবত পার্থক্যের কারণ হবে। এবং, httplib আরও নিম্ন-স্তরের, উদাহরণস্বরূপ urlib2 url কে পার্স করে।
মারিয়ান

1
urlib2 হ'ল httplib এর উপরে বিমূর্ততার একটি পাতলা স্তর, আমি urlib খুব দ্রুত ল্যানটিতে না ফেলে যদি আপনি সিপিইউ আবদ্ধ হন তবে আমি খুব অবাক হব। কিছু ইউআরএল পুনর্নির্দেশ করা সম্ভব? urlib2 পুনঃনির্দেশগুলি অনুসরণ করবে যেখানে httplib তা করবে না। অন্য সম্ভাবনাটি হ'ল নেটওয়ার্কের শর্তগুলি (যে কোনও কিছুতে আপনি এই পরীক্ষায় স্পষ্ট নিয়ন্ত্রণ রাখতে পারেন না) 2 রানের মধ্যে ওঠানামা করে। এই সম্ভাবনা হ্রাস করতে আপনার প্রত্যেকের কমপক্ষে তিনটি আন্তঃবাহিত রান করা উচিত
জন লা রুই

0

এবং আরও একটি পদ্ধতির (পাওয়েল উত্তরের অনুরূপ):

import urllib2
import types

request = urllib2.Request('http://localhost:8080')
request.get_method = types.MethodType(lambda self: 'HEAD', request, request.__class__)

উদাহরণস্বরূপ পর্যায়ে সীমাহীন পদ্ধতিগুলি এড়াতে।


-4

সম্ভবত সহজ: urllib বা urllib2 ব্যবহার করুন।

>>> import urllib
>>> f = urllib.urlopen('http://google.com')
>>> f.info().gettype()
'text/html'

f.info () অভিধানের মতো একটি বস্তু, তাই আপনি f.info () ['বিষয়বস্তুর ধরণ'] ইত্যাদি করতে পারেন etc.

http://docs.python.org/library/urllib.html
http://docs.python.org/library/urllib2.html
http://docs.python.org/library/httplib.html

দস্তাবেজগুলি লক্ষ্য করে যে HTLib সাধারণত সরাসরি ব্যবহার করা হয় না।


14
তবে, urllib একটি জিইটি করবে এবং প্রশ্নটি একটি হেড সম্পাদন করার বিষয়ে। সম্ভবত পোস্টারটি কোনও ব্যয়বহুল দস্তাবেজ পুনরুদ্ধার করতে চায় না।
ফিলিপ এফ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.