পাইথনের HTTP GET- র দ্রুততম উপায় কী?


612

পাইথনের HTTP GET- র দ্রুততম উপায়টি কী কী যদি আমি জানি যে বিষয়বস্তুটি স্ট্রিং হয়ে যাবে? আমি দ্রুত ওয়ানলাইনারের মতো ডকুমেন্টেশনগুলি অনুসন্ধান করছি:

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

তবে গুগল ব্যবহার করে আমি যেগুলি খুঁজে পেতে পারি তা হ'ল 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 দ্বারা ফিরে আসা বস্তুটি সুযোগ থেকে বেরিয়ে গেলে মুছে ফেলা হবে (এবং চূড়ান্ত করা হয়েছে, যা এটি বন্ধ করে দেয়)। যেহেতু সিপিথন রেফারেন্স-গণনা করা হয়, আপনি এর পরে অবিলম্বে ঘটে যাওয়া ঘটনার উপর নির্ভর করতে পারেন read। তবে একটি withব্লক জাইথন ​​ইত্যাদির জন্য আরও পরিষ্কার এবং নিরাপদ হবে
sa

8
এটি কেবল এইচটিটিপিএস-এর ওয়েবসাইটে কাজ করে না। requestsদুর্দান্ত কাজ করে
ওভারকোডার

6
আপনি যদি অ্যামাজন ল্যাম্বদা ব্যবহার করেন এবং কোনও ইউআরএল পাওয়ার প্রয়োজন হয়, তবে 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
@ জো ব্লো মনে রাখবেন যে এগুলি ব্যবহারের জন্য আপনাকে অবশ্যই বাহ্যিক গ্রন্থাগারগুলি আমদানি করতে হবে
মাইকভেলাজকো

1
প্রায় কোনও পাইথন লাইব্রেরি এডাব্লুএস ল্যাম্বডায় ব্যবহার করা যেতে পারে। খাঁটি পাইথনের জন্য আপনাকে সেই লাইব্রেরিটি কেবল "বিক্রেতা" করতে হবে (ব্যবহারের পরিবর্তে আপনার মডিউলটির ফোল্ডারে অনুলিপি করুন)pip install )। খাঁটি অ-লাইব্রেরিগুলির জন্য একটি অতিরিক্ত পদক্ষেপ রয়েছে - আপনাকে pip installএডাব্লুএস লিনাক্সের একটি উদাহরণে (একই ওএস ভেরিয়েন্ট ল্যাম্বডাসের অধীনে চালিত) লিবিং করতে হবে, তারপরে সেই ফাইলগুলি অনুলিপি করুন যাতে আপনার ডাব্লুএস লিনাক্সের সাথে বাইনারি সামঞ্জস্য থাকবে। ল্যাম্বডায় আপনি সর্বদা যে লাইব্রেরিগুলি সর্বদা ব্যবহার করতে পারবেন না সেগুলি হ'ল কেবলমাত্র বাইনারি বিতরণগুলি, যা কৃতজ্ঞতার সাথে খুব বিরল।
ক্রিস জনসন

6
@ ল্যাফটোগ এই অজগর 3 এর সাথে কাজ করে তবে আপনার তা করতে হবে pip install requests
আকারিলিমানো

এমনকি urllib2 স্ট্যান্ডার্ড লাইব্রেরি অনুরোধগুলির প্রস্তাব দেয়
আসফান্দ কাজী

লাম্বদা সম্পর্কিত: আপনি যদি ডাব্লুএস ল্যাম্বদা ফাংশনে অনুরোধগুলি ব্যবহার করতে চান তবে। একটি প্রাক-প্রতিষ্ঠিত বোটো 3 অনুরোধের গ্রন্থাগারও রয়েছে। from botocore.vendored import requests ব্যবহার response = requests.get('...')
kmjb

29

আপনি যদি httplib2 এর সাথে সমাধানটি অননলাইন হতে চান তবে বেনামে এইচটিটিপি অবজেক্টটি তাত্ক্ষণিক বিবেচনা করুন

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

19

Httplib2 এ দেখুন , যা - প্রচুর দরকারী বৈশিষ্ট্যের পাশে - আপনি যা চান ঠিক তা সরবরাহ করে।

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
আপনি খুব সহজেই এইচটিটিপি ক্রিয়া
টম

5

উইজেটের জন্য theller এর সমাধানটি সত্যিই দরকারী, তবে আমি খুঁজে পেয়েছি যে এটি ডাউনলোডিং প্রক্রিয়া জুড়ে অগ্রগতি মুদ্রণ করে না। আপনি পুনঃসূত্রে মুদ্রণ বিবরণের পরে যদি একটি লাইন যুক্ত করেন তবে এটি সঠিক perfect

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

আপনি যদি বিশেষত এইচটিটিপি এপিআইয়ের সাথে কাজ করে থাকেন তবে আরও কিছু সুবিধাজনক পছন্দ রয়েছে যেমন ন্যাপ

উদাহরণস্বরূপ, 1 মে ২০১৪ সাল থেকে গিথুব থেকে গিস্টগুলি কীভাবে পাবেন তা এখানে :

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# উদাহরণ


2

দুর্দান্ত সমাধান জুয়ান, থেলার l

অজগর 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

এছাড়াও, আপনি যে ইউআরএলটি প্রবেশ করেছেন সেটি একটি "http: //" এর আগে হওয়া উচিত, অন্যথায় এটি কোনও অজানা url ধরণের ত্রুটি দেয়।


1

এর জন্য python >= 3.6, আপনি লোড ব্যবহার করতে পারেন :

import dload
t = dload.text(url)

এর জন্য json:

j = dload.json(url)

ইনস্টল করুন:
pip install dload


0

আসলে পাইথনে আমরা ফাইলগুলি থেকে ইউআরএলগুলি থেকে পড়তে পারি, এখানে এপিআই থেকে জেএসন পড়ার উদাহরণ।

import json

from urllib.request import urlopen

with urlopen(url) as f:

resp = json.load(f)

return resp['some_key']

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

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