2009-03-14 43 views
397

Cách nhanh nhất để HTTP GET bằng Python là gì nếu tôi biết nội dung sẽ là một chuỗi? Tôi đang tìm kiếm các tài liệu cho một cách nhanh chóng một liner như:Cách nhanh nhất để nhận HTTP bằng Python là gì?

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

Nhưng tất cả tôi có thể tìm cách sử dụng Google là httpliburllib - và tôi không thể tìm thấy một shortcut trong những thư viện.

Chuẩn Python 2.5 có phím tắt ở một số dạng như trên hay tôi có nên viết hàm url_get?

  1. Tôi không muốn ghi lại đầu ra của pháo kích ra wget hoặc curl.
+20

Một lớp lót không nhất thiết phải nhanh hơn. Đừng tôn sùng mã golf. Bạn phải đo tốc độ; không phải là dòng mã. –

+69

uhm, không, tôi googled ở đây bởi vì tôi cần phải thêm một dòng vào một thử nghiệm tôi đang viết; không phải là thành phẩm. Thời gian CPU là nhiều, rẻ hơn nhiều so với thời gian lập trình! – Phlip

+0

Tôi tìm thấy những gì tôi cần ở đây: http://stackoverflow.com/a/385411/1695680 – ThorSummoner

Trả lời

594

Python 2.x:

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

Python 3.x:

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

Tài liệu cho urllib.requestread.

Bằng cách nào?

+25

Mọi thứ có được làm sạch độc đáo không? Có vẻ như tôi nên gọi 'close' sau 'read' của bạn. Điều đó có cần thiết không? –

+4

Thực hành tốt để đóng nó, nhưng nếu bạn đang tìm kiếm một lớp lót nhanh, bạn có thể bỏ qua nó. :-) –

+0

Đối với những gì nó có giá trị, cùng một điều làm việc với urllib thay cho urllib2 (ít nhất là cho hầu hết các URL). –

17

Hãy xem httplib2, trong đó - bên cạnh rất nhiều tính năng rất hữu ích - cung cấp chính xác những gì bạn muốn.

import httplib2 

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

Nội dung sẽ là nội dung phản hồi (dưới dạng chuỗi) và resp sẽ chứa tiêu đề trạng thái và phản hồi.

Nó không đi kèm với một cài đặt python chuẩn mặc dù (nhưng nó chỉ yêu cầu python chuẩn), nhưng nó chắc chắn giá trị kiểm tra ra.

27

Nếu bạn muốn giải pháp với httplib2 là oneliner xem xét instatntinating đối tượng Http nặc danh

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

Dưới đây là một kịch bản wget bằng Python: giải pháp

# 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 
6

theller cho wget là thực sự hữu ích, tuy nhiên, tôi thấy nó không in ra tiến trình trong suốt quá trình tải xuống. Nó hoàn hảo nếu bạn thêm một dòng sau khi in báo cáo trong reporthook.

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 
267

Bạn có thể sử dụng thư viện có tên requests.

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

Điều này khá dễ dàng. Sau đó, bạn có thể làm như sau:

>>> print r.status_code 
>>> print r.headers 
>>> print r.content 
+2

Tôi nhận thấy điều này không có sẵn trong Amazon Lambda ... – Fattie

+0

@JoeBlow nhớ rằng bạn phải nhập các thư viện bên ngoài để sử dụng chúng – MikeVelazco

+0

Hầu như bất kỳ thư viện Python nào cũng có thể được sử dụng trong AWS Lambda. Đối với Python thuần túy, bạn chỉ cần "cung cấp" thư viện đó (sao chép vào các thư mục của mô-đun của bạn thay vì sử dụng 'pip install'). Đối với các thư viện không thuần túy, có một bước bổ sung - bạn cần 'pip install' lib vào một cá thể của AWS Linux (cùng một biến thể hệ điều hành lambdas chạy dưới), sau đó sao chép các tệp đó để bạn có khả năng tương thích nhị phân với AWS Linux. Các thư viện duy nhất mà bạn không phải lúc nào cũng có thể sử dụng trong Lambda là những thư viện chỉ phân phối nhị phân, rất may mắn là hiếm. –

2

Nếu bạn đang làm việc với API HTTP cụ thể, cũng có nhiều lựa chọn thuận tiện hơn như Nap.

Ví dụ, dưới đây là cách để có được các GIST từ Github từ 01 tháng năm 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()) 

Thêm ví dụ: https://github.com/kimmobrunfeldt/nap#examples

3

giải pháp xuất sắc Xuân, Theller.

Đối với nó để làm việc với python 3 làm những điều sau đây thay đổi

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 

Ngoài ra, các URL bạn nhập phải được đi trước bởi một "http: //", nếu không nó sẽ trả về một lỗi gõ url rõ.

1

Nếu không có thêm hàng nhập khẩu cần thiết làm giải pháp này (cho tôi) - cũng với 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() 

tôi thường gặp khó khăn lấy nội dung khi không xác định một "User-Agent" trong thông tin tiêu đề. Sau đó, thông thường các yêu cầu sẽ bị hủy với nội dung như sau: urllib2.HTTPError: HTTP Error 403: Forbidden hoặc urllib.error.HTTPError: HTTP Error 403: Forbidden.

Các vấn đề liên quan