سؤال

ما أحاول القيام به هنا هو الحصول على رؤوس عنوان URL معين حتى أتمكن من تحديد نوع MIME.أريد أن أكون قادرا على معرفة ما إذا كان http://somedomain/foo/ سيعود مستند HTML أو صورة JPEG على سبيل المثال.وبالتالي، أحتاج إلى معرفة كيفية إرسال طلب HEAD حتى أتمكن من قراءة نوع MIME دون الحاجة إلى تنزيل المحتوى.هل يعرف أحد طريقة سهلة للقيام بذلك؟

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

المحلول

يحرر:تعمل هذه الإجابة، ولكن في الوقت الحاضر يجب عليك فقط استخدام طلبات المكتبة كما هو مذكور في الإجابات الأخرى أدناه.


يستخدم 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) للحصول على رأس محدد.

نصائح أخرى

urllib2 يمكن استخدامها لتنفيذ طلب HEAD.يعد هذا أفضل قليلاً من استخدام httplib نظرًا لأن urllib2 يوزع عنوان URL لك بدلاً من مطالبتك بتقسيم عنوان URL إلى اسم المضيف والمسار.

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

الرؤوس متاحة عبر Response.info() كما كان من قبل.ومن المثير للاهتمام أنه يمكنك العثور على عنوان URL الذي تمت إعادة توجيهك إليه:

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

واجب Requests طريق:

import requests

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

أعتقد أن الطلبات وينبغي ذكر المكتبة كذلك.

فقط:

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'
...

نص الرابط

للاكتمال، يجب أن يكون لديك إجابة Python3 مكافئة للإجابة المقبولة باستخدام 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)
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

جانبًا، عند استخدام httplib (على الأقل في 2.5.2)، فإن محاولة قراءة استجابة طلب HEAD ستُحظر (في readline) وتفشل لاحقًا.إذا لم تقم بإصدار قراءة على الرد، فلن تتمكن من إرسال طلب آخر على الاتصال، فستحتاج إلى فتح طلب جديد.أو قبول تأخير طويل بين الطلبات.

لقد وجدت أن httplib أسرع قليلاً من urllib2.لقد حددت توقيت برنامجين - أحدهما يستخدم httplib والآخر يستخدم urllib2 - لإرسال طلبات HEAD إلى 10000 عنوان URL.كان httplib أسرع بعدة دقائق. httplibإجمالي إحصائيات كانت:user 6m21.334s user 0m2.124s sys 0m16.372s

و urllib2إجمالي إحصائيات كانت:مستخدم 9M1.380 الحقيقي 0M16.666S SYS 0M28.565S

هل لدى أي شخص آخر مساهمة في هذا؟

وهناك نهج آخر (على غرار إجابة باول):

import urllib2
import types

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

فقط لتجنب وجود طرق غير محدودة على مستوى المثيل.

ربما أسهل:استخدم urllib أو urllib2.

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

f.info() هو كائن يشبه القاموس، لذا يمكنك القيام بـ f.info()['content-type'] وما إلى ذلك.

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

تشير المستندات إلى أن httplib لا يُستخدم عادةً بشكل مباشر.

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