पायथन में HTTP GET का सबसे तेज़ तरीका क्या है?


612

पायथन में HTTP GET का सबसे तेज़ तरीका क्या है अगर मुझे पता है कि सामग्री एक स्ट्रिंग होगी? मैं एक त्वरित वन-लाइनर के लिए दस्तावेज खोज रहा हूँ जैसे:

contents = url.get("http://example.com/foo/bar")

लेकिन सभी मैं Google का उपयोग कर पा रहा हूं httplibऔर urllib- और मैं उन पुस्तकालयों में शॉर्टकट खोजने में असमर्थ हूं।

क्या मानक पायथन 2.5 में ऊपर के रूप में कोई शॉर्टकट है, या मुझे एक फ़ंक्शन लिखना चाहिए url_get?

  1. मैं बाहर wgetया करने के लिए खोल के उत्पादन पर कब्जा करने के लिए नहीं पसंद करेंगे curl

मैंने पाया कि मुझे यहाँ क्या चाहिए: stackoverflow.com/a/385411/1695680
ThorSummoner

जवाबों:


869

अजगर 3:

import urllib.request
contents = urllib.request.urlopen("http://example.com/foo/bar").read()

अजगर 2:

import urllib2
contents = urllib2.urlopen("http://example.com/foo/bar").read()

के लिए प्रलेखन urllib.requestऔर read


44
क्या सब कुछ अच्छी तरह से साफ हो जाता है? ऐसा लगता है कि मुझे closeआपके बाद कॉल करना चाहिए read। क्या यह आवश्यक है?
फ्रैंक क्रुएगर

4
इसे बंद करना अच्छा है, लेकिन यदि आप एक त्वरित लाइनर की तलाश कर रहे हैं, तो आप इसे छोड़ सकते हैं। :-)
निक प्रेस्टा

28
Urlopen द्वारा लौटाए गए ऑब्जेक्ट को हटा दिया जाएगा (और अंतिम रूप दिया जाएगा, जो इसे बंद कर देता है) जब यह गुंजाइश से बाहर हो जाता है। चूँकि Cpython सन्दर्भ-गणना है, आप इसके तुरंत बाद होने वाले पर भरोसा कर सकते हैं read। लेकिन एक withब्लॉक Jython, आदि के लिए स्पष्ट और सुरक्षित होगा
sah

8
यह HTTPS- केवल वेबसाइटों के साथ काम नहीं करता है। requestsठीक काम करता है
OverCoder

6
यदि आप अमेज़ॅन लैम्बडा का उपयोग कर रहे हैं और आपको एक URL प्राप्त करने की आवश्यकता है, तो 2.x समाधान उपलब्ध है और अंतर्निहित है। यह https के साथ भी काम करने लगता है। यह r = urllib2.urlopen("http://blah.com/blah")तब से ज्यादा कुछ नहीं है text = r.read()। यह सिंक है, यह केवल "टेक्स्ट" में परिणाम की प्रतीक्षा करता है।
फेटी

412

आप अनुरोध नामक एक पुस्तकालय का उपयोग कर सकते हैं ।

import requests
r = requests.get("http://example.com/foo/bar")

यह काफी आसान है। तो आप इस तरह कर सकते हैं:

>>> print(r.status_code)
>>> print(r.headers)
>>> print(r.content)

1
@JoeBlow याद रखें कि आपको उनका उपयोग करने के लिए बाहरी पुस्तकालयों को आयात करना होगा
माइकेलकाज़ो

1
लगभग किसी भी पायथन लाइब्रेरी का उपयोग एडब्ल्यूएस लाम्बा में किया जा सकता है। शुद्ध अजगर के लिए, आपको बस उस विक्रेता को "विक्रेता" करना होगा (उपयोग करने के बजाय अपने मॉड्यूल के फ़ोल्डरों में कॉपी करें pip install)। गैर-शुद्ध पुस्तकालयों के लिए, एक अतिरिक्त कदम है - आपको pip installएडब्ल्यूएस लिनक्स (उसी ओएस वेरिएंट लैम्बडा के तहत चलने वाले) के उदाहरण पर काम करने की आवश्यकता है , फिर उन फाइलों को कॉपी करें, ताकि आपके पास एडब्ल्यूएस लिनक्स के साथ द्विआधारी संगतता हो। केवल वे पुस्तकालय जो आप लैंबडा में हमेशा उपयोग नहीं कर पाएंगे, वे केवल बाइनरी डिस्ट्रीब्यूशन के साथ हैं, जो शुक्र से बहुत दुर्लभ हैं।
क्रिस जॉनसन

6
@lawphotog यह python3 के साथ काम करता है, लेकिन आपको करना होगा pip install requests
एकरिलिमैनो

यहां तक ​​कि urllib2 मानक पुस्तकालय अनुरोधों की सिफारिश करता है
Asfand Qazi

लैंबडा के संबंध में: यदि आप AWS लाम्बा कार्यों में अनुरोधों का उपयोग करना चाहते हैं। वहाँ एक पूर्वस्थापित boto3 अनुरोध पुस्तकालय भी है। from botocore.vendored import requests उपयोग response = requests.get('...')
kmjb

29

यदि आप चाहते हैं कि नोकप्लिब 2 के साथ समाधान हो, तो ऑनरलाइनर अनाम Http ऑब्जेक्ट को तत्काल मान लें

import httplib2
resp, content = httplib2.Http().request("http://example.com/foo/bar")

19

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

import httplib2

resp, content = httplib2.Http().request("http://example.com/foo/bar")

जहां सामग्री प्रतिसाद बॉडी (स्ट्रिंग के रूप में) होगी, और सम्मान में स्थिति और प्रतिक्रिया हेडर शामिल होंगे।

यह एक मानक अजगर स्थापित के साथ शामिल नहीं है, हालांकि (लेकिन यह केवल मानक अजगर की आवश्यकता है), लेकिन यह निश्चित रूप से बाहर की जाँच के लायक है।


6

यह शक्तिशाली urllib3पुस्तकालय के साथ काफी सरल है ।

इसे इस तरह आयात करें:

import urllib3

http = urllib3.PoolManager()

और इस तरह अनुरोध करें:

response = http.request('GET', 'https://example.com')

print(response.data) # Raw data.
print(response.data.decode('utf-8')) # Text.
print(response.status) # Status code.
print(response.headers['Content-Type']) # Content type.

आप हेडर भी जोड़ सकते हैं:

response = http.request('GET', 'https://example.com', headers={
    'key1': 'value1',
    'key2': 'value2'
})

अधिक जानकारी urllib3 प्रलेखन पर पाई जा सकती है ।

urllib3बिलिन urllib.requestया httpमॉड्यूल की तुलना में बहुत सुरक्षित और उपयोग करने में आसान है और स्थिर है।


1
तथ्य यह है कि आप आसानी से एक HTTP क्रिया प्रदान कर सकते हैं के लिए
टॉम

5

वाइज़र के लिए टॉलर का समाधान वास्तव में उपयोगी है, हालांकि, मैंने पाया कि यह डाउनलोडिंग प्रक्रिया के दौरान प्रगति को प्रिंट नहीं करता है। यह सही है अगर आप पश्चाताप में प्रिंट स्टेटमेंट के बाद एक लाइन जोड़ते हैं।

import sys, urllib

def reporthook(a, b, c):
    print "% 3.1f%% of %d bytes\r" % (min(100, float(a * b) / c * 100), c),
    sys.stdout.flush()
for url in sys.argv[1:]:
    i = url.rfind("/")
    file = url[i+1:]
    print url, "->", file
    urllib.urlretrieve(url, file, reporthook)
print

4

यहाँ अजगर में एक स्क्रिप्ट है:

# From python cookbook, 2nd edition, page 487
import sys, urllib

def reporthook(a, b, c):
    print "% 3.1f%% of %d bytes\r" % (min(100, float(a * b) / c * 100), c),
for url in sys.argv[1:]:
    i = url.rfind("/")
    file = url[i+1:]
    print url, "->", file
    urllib.urlretrieve(url, file, reporthook)
print

4

आगे आवश्यक आयात के बिना यह समाधान काम करता है (मेरे लिए) - https के साथ भी:

try:
    import urllib2 as urlreq # Python 2.x
except:
    import urllib.request as urlreq # Python 3.x
req = urlreq.Request("http://example.com/foo/bar")
req.add_header('User-Agent', 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36')
urlreq.urlopen(req).read()

हेडर जानकारी में "उपयोगकर्ता-एजेंट" निर्दिष्ट नहीं करने पर मुझे अक्सर सामग्री को हथियाने में कठिनाई होती है। फिर आमतौर पर अनुरोध कुछ इस तरह से रद्द कर दिए जाते हैं: urllib2.HTTPError: HTTP Error 403: Forbiddenया urllib.error.HTTPError: HTTP Error 403: Forbidden


4

हेडर कैसे भेजें

अजगर 3:

import urllib.request
contents = urllib.request.urlopen(urllib.request.Request(
    "https://api.github.com/repos/cirosantilli/linux-kernel-module-cheat/releases/latest",
    headers={"Accept" : 'application/vnd.github.full+json"text/html'}
)).read()
print(contents)

अजगर 2:

import urllib2
contents = urllib2.urlopen(urllib2.Request(
    "https://api.github.com",
    headers={"Accept" : 'application/vnd.github.full+json"text/html'}
)).read()
print(contents)

2

यदि आप विशेष रूप से HTTP एपीआई के साथ काम कर रहे हैं, तो और भी सुविधाजनक विकल्प हैं जैसे कि नैप

उदाहरण के लिए, 1 मई 2014 से जीथब से जिस्ट प्राप्त करने का तरीका यहां दिया गया है :

from nap.url import Url
api = Url('https://api.github.com')

gists = api.join('gists')
response = gists.get(params={'since': '2014-05-01T00:00:00Z'})
print(response.json())

अधिक उदाहरण: https://github.com/kimmobrunfeldt/nap#examples


2

उत्कृष्ट समाधान ज़ुआन, थेलर।

इसके लिए अजगर 3 के साथ काम करने के लिए निम्नलिखित बदलाव करें

import sys, urllib.request

def reporthook(a, b, c):
    print ("% 3.1f%% of %d bytes\r" % (min(100, float(a * b) / c * 100), c))
    sys.stdout.flush()
for url in sys.argv[1:]:
    i = url.rfind("/")
    file = url[i+1:]
    print (url, "->", file)
    urllib.request.urlretrieve(url, file, reporthook)
print

इसके अलावा, आपके द्वारा दर्ज किया गया URL "http: //" से पहले होना चाहिए, अन्यथा यह एक अज्ञात यूआरएल प्रकार की त्रुटि देता है।


1

के लिए python >= 3.6, आप dload का उपयोग कर सकते हैं :

import dload
t = dload.text(url)

के लिए json:

j = dload.json(url)

इंस्टॉल:
pip install dload


0

वास्तव में अजगर में हम फ़ाइलों से यूआरएल की तरह पढ़ सकते हैं, यहाँ एपीआई से json पढ़ने के लिए एक उदाहरण है।

import json

from urllib.request import urlopen

with urlopen(url) as f:

resp = json.load(f)

return resp['some_key']

यद्यपि हम आपके उत्तर के लिए धन्यवाद देते हैं, लेकिन बेहतर होगा यदि वह अन्य उत्तरों के शीर्ष पर अतिरिक्त मूल्य प्रदान करे। इस मामले में, आपका उत्तर अतिरिक्त मूल्य प्रदान नहीं करता है, क्योंकि कोई अन्य उपयोगकर्ता पहले से ही उस समाधान को पोस्ट करता है। यदि पिछला उत्तर आपके लिए उपयोगी था, तो आपको उसी जानकारी को दोहराने के बजाय उसे वोट देना चाहिए।
टोबी स्पाइट

0

यदि आप एक निम्न स्तर की एपीआई चाहते हैं:

import http.client

conn = http.client.HTTPSConnection('example.com')
conn.request('GET', '/')

resp = conn.getresponse()
content = resp.read()

conn.close()

text = content.decode('utf-8')

print(text)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.