आप Python 2 में एक HEAD HTTP रिक्वेस्ट कैसे भेजते हैं?


114

मैं यहां क्या करने की कोशिश कर रहा हूं, किसी दिए गए URL के शीर्षलेख प्राप्त करें ताकि मैं MIME प्रकार निर्धारित कर सकूं। मैं यह देखना चाहता हूं कि http://somedomain/foo/उदाहरण के लिए HTML डॉक्यूमेंट या JPEG इमेज वापस करेगा या नहीं। इस प्रकार, मुझे यह पता लगाने की आवश्यकता है कि एचआईएडी अनुरोध कैसे भेजा जाए ताकि मैं सामग्री को डाउनलोड किए बिना माइम प्रकार को पढ़ सकूं। क्या किसी को ऐसा करने का एक आसान तरीका पता है?

जवाबों:


104

संपादित करें : यह उत्तर काम करता है, लेकिन आजकल आपको केवल अनुरोध पुस्तकालय का उपयोग करना चाहिए जैसा कि नीचे दिए गए अन्य उत्तरों द्वारा बताया गया है।


कैंपलिब का प्रयोग करें ।

>>> 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 का उपयोग HEAD अनुरोध करने के लिए किया जा सकता है। यह URL से होस्ट नाम और पथ में विभाजित करने की आवश्यकता के बजाय urllib2 आपके लिए 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

1
response.info () .__ str __ () हेडर के स्ट्रिंग प्रारूप को लौटाएगा, यदि आप प्राप्त होने वाले परिणाम के साथ कुछ करना चाहते हैं।
शेन

6
सिवाय इसके कि अजगर 2.7.1 (ubuntu natty) के साथ ऐसा करने की कोशिश कर रहा है, अगर कोई रीडायरेक्ट है, तो वह गंतव्य पर एक GET करता है, एक HEAD नहीं ...
eichin

1
यह लाभ है httplib.HTTPConnection, जो स्वचालित रूप से पुनर्निर्देशित नहीं करता है।
एहतेश चौधरी

लेकिन दोशी के जवाब के साथ। टाइमआउट कैसे सेट करें? खराब URL, यानी URL को कैसे संभालना है जो अब जीवित नहीं हैं।
fanchyna

65

अप्रचलित Requestsतरीका:

import requests

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

36

मेरा मानना ​​है कि अनुरोध पुस्तकालय का भी उल्लेख किया जाना चाहिए।


5
यह उत्तर अधिक ध्यान देने योग्य है। एक बहुत अच्छी लाइब्रेरी लगती है जो समस्या को मामूली बनाती है।
Nick Retallack

3
मैं मानता हूं कि अनुरोध करना बहुत आसान था: {कोड} आयात अनुरोध r = request.head (' github.com' ) {कोड}
लुइस आर।

@LuisR .: अगर कोई रीडायरेक्ट है तो वह GET / POST / PUT / DELETE को भी फॉलो करता है।
jfs

@ रिकॉल रिटैक: रीडायरेक्ट को निष्क्रिय करने का कोई आसान तरीका नहीं है। allow_redirectsकेवल POST / PUT / DELETE रीडायरेक्ट को अक्षम कर सकते हैं। उदाहरण: हेड रिक्वेस्ट नो रीडायरेक्ट
जेएफ

@JFSebastian आपके उदाहरण का लिंक टूटा हुआ प्रतीत हो रहा है। आप पुनर्निर्देशन के साथ इस मुद्दे पर विस्तार से बता सकते हैं?
Piotr Dobrogost

17

बस:

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

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

संपादित करें: मुझे अभी पता चला है कि CANplib2 है: 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'
...

लिंक पाठ


इसमें थोड़ा बुरा यह है कि आप get_method को अनबाउंड फ़ंक्शन के रूप में छोड़ने के बजाय इसे छोड़ रहे हैं request। (विज़, यह काम करेगा, लेकिन यह खराब शैली है और यदि आप selfइसमें उपयोग करना चाहते हैं - कठिन।)
क्रिस मॉर्गन

4
क्या आप इस समाधान के पेशेवरों और विपक्षों के बारे में थोड़ा और विस्तार कर सकते हैं? मैं एक अजगर विशेषज्ञ नहीं हूँ जैसा कि आप देख सकते हैं, इसलिए मैं यह जानकर लाभान्वित हो सकता हूँ कि यह कब खराब हो सकता है?) जैसा कि मैं समझता हूँ कि चिंता का विषय यह है कि यह एक हैक है जो कार्यान्वयन परिवर्तन के आधार पर काम कर सकता है या नहीं?
पावेल प्रकोक

इस कोड में यह दूसरा संस्करण केवल एक ही है जिसने मेरे लिए 403 निषिद्ध URL के लिए काम किया है। अन्य एक अपवाद फेंक रहे थे।
द्वितीया_

10

पूर्णता स्वीकार किए जाते हैं जवाब का उपयोग कर के लिए एक python3 जवाब बराबर करने के लिए 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

एक तरफ के रूप में, जब कैंसिलिब (कम से कम 2.5.2) का उपयोग करते हुए, एक HEAD अनुरोध की प्रतिक्रिया को पढ़ने की कोशिश करना (रीडलाइन पर) ब्लॉक हो जाएगा और बाद में विफल हो जाएगा। यदि आप प्रतिक्रिया पर रीड इश्यू नहीं करते हैं, तो आप कनेक्शन पर दूसरा अनुरोध भेजने में असमर्थ हैं, आपको एक नया खोलने की आवश्यकता होगी। या अनुरोधों के बीच एक लंबी देरी स्वीकार करते हैं।


1

मैंने पाया है कि urplib2 की तुलना में कैंपलिब थोड़ा तेज़ है। मैंने दो कार्यक्रमों को समय पर पूरा कर लिया - एक में क्म्प्लिब का उपयोग और दूसरे का urllib2 का उपयोग करके - 10,000 URL के लिए HEAD अनुरोध भेज रहा है। एक मिनट में कई मिनट के लिए तेज़ हो गया था। Canplib के कुल आँकड़े थे: वास्तविक 6m21.334s उपयोगकर्ता 0m2.124s sys 0m16.372s

और urllib2 के कुल आँकड़े थे: वास्तविक 9m1.380s उपयोगकर्ता 0m16.666s sys 0m1.55s

क्या किसी और के पास इस पर इनपुट है?


इनपुट? समस्या आईओ-बाउंड है और आप अवरुद्ध पुस्तकालयों का उपयोग कर रहे हैं। यदि आप बेहतर प्रदर्शन चाहते हैं तो ईवेंटलेट या ट्विस्ट पर जाएं। आपके द्वारा उल्लिखित urllib2 की सीमाएँ CPU-बाध्य हैं।
डेविन जीनपीयर

3
urllib2 रीडायरेक्ट का अनुसरण करता है, इसलिए यदि आपके कुछ URL रीडायरेक्ट होते हैं, तो संभवतः अंतर का कारण होगा। और, कैनप्लिब अधिक निम्न-स्तर का है, urllib2 उदाहरण के लिए url को पार्स करता है।
मैरियन

1
urllib2, कैनप्लिब के शीर्ष पर अमूर्तता की एक पतली परत है, यदि आप cpu बाध्य थे जब तक कि url बहुत तेज़ LAN पर नहीं होते हैं, तो मुझे बहुत आश्चर्य होगा। क्या यह संभव है कि कुछ url पुनर्निर्देशित थे? urllib2 रिडायरेक्ट का पालन करेगा, जबकि रिशेप्लिब नहीं होगा। दूसरी संभावना यह है कि नेटवर्क की स्थिति (आपके पास इस प्रयोग में स्पष्ट नियंत्रण नहीं है) 2 रन के बीच में उतार-चढ़ाव होता है। इस संभावना को कम करने के लिए आपको प्रत्येक के कम से कम 3 इंटरलेव्ड रन करने चाहिए
जॉन ला रूय

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 () ['सामग्री-प्रकार'], आदि कर सकते हैं।

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

डॉक्स ध्यान दें कि सामान्य रूप से सीधे नोक-झोंक का उपयोग नहीं किया जाता है।


14
हालाँकि, urllib एक GET करेगा और सवाल HEAD करने के बारे में है। हो सकता है कि पोस्टर एक महंगे दस्तावेज़ को पुनः प्राप्त नहीं करना चाहता हो।
फिलिप एफ
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.