파이썬에서 HTTP GET에 가장 빠른 방법은 무엇입니까?


613

내용이 문자열이라는 것을 알고 있다면 파이썬에서 HTTP GET에 가장 빠른 방법은 무엇입니까? 다음과 같은 빠른 원 라이너에 대한 설명서를 검색하고 있습니다.

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

그러나 모든 나는 구글이 사용 찾을 수 httpliburllib나는 이러한 라이브러리에서 바로 가기를 찾을 수 없습니다입니다 -.

표준 Python 2.5에는 위와 같은 형식의 단축키가 url_get있습니까? 아니면 함수를 작성해야 합니까?

  1. 쉘 출력을 wget또는 로 캡처하지 않는 것이 curl좋습니다.

여기에서 필요한 것을 찾았습니다. stackoverflow.com/a/385411/1695680
ThorSummoner

답변:


870

파이썬 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. 그게 필요한가요?
Frank Krueger

4
닫는 것이 좋은 습관이지만, 빠른 원 라이너를 찾고 있다면 생략 할 수 있습니다. :-)
Nick Presta

28
urlopen에 의해 반환 된 객체는 범위를 벗어나면 삭제되고 종료됩니다. Cpython은 참조 횟수이기 때문에 read. 직후에 발생하는 것에 의존 할 수 있습니다 . 그러나 with블록은 자이 썬 (Jython) 등을 위해 더욱 명확하고 안전 할 것입니다.
sah

8
HTTPS 전용 웹 사이트에서는 작동하지 않습니다. requests잘 작동
OverCoder

6
Amazon Lambda를 사용 중이고 URL을 가져와야하는 경우 2.x 솔루션을 사용할 수 있고 내장되어 있습니다. https에서도 작동하는 것 같습니다. 그것은 더 이상 아무것도 없습니다 r = urllib2.urlopen("http://blah.com/blah")다음 text = r.read(). 동기화되며 "텍스트"로 결과를 기다립니다.
Fattie

412

requests 라는 라이브러리를 사용할 수 있습니다 .

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

이것은 매우 쉽습니다. 그런 다음 이렇게 할 수 있습니다 :

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

1
@JoeBlow 사용하려면 외부 라이브러리를 가져와야합니다.
MikeVelazco

1
거의 모든 Python 라이브러리를 AWS Lambda에서 사용할 수 있습니다. 순수 Python의 경우 해당 라이브러리를 "공급 업체"로 지정하면됩니다 (를 사용하는 대신 모듈의 폴더에 복사 pip install). 순수하지 않은 라이브러리의 경우 추가 단계가 있습니다 pip install. 라이브러리를 AWS Linux 인스턴스 (동일한 OS 변형 람다가 실행 됨)에 lib 대신 해당 파일을 복사하여 AWS Linux와 바이너리 호환성을 갖도록해야합니다. Lambda에서 항상 사용할 수없는 유일한 라이브러리는 바이너리 배포판 만있는 라이브러리입니다.
Chris Johnson

6
@lawphotog 이것은 python3과 작동하지만 반드시해야합니다 pip install requests.
akarilimano

urllib2 표준 라이브러리조차도 요청을 권장합니다
Asfand Qazi

Lambda와 관련하여 : AWS Lambda 함수에서 요청을 사용하려는 경우. 사전 설치된 boto3 요청 라이브러리도 있습니다. from botocore.vendored import requests 사용법 response = requests.get('...')
kmjb

29

httplib2가있는 솔루션을 oneliner로 만들고 싶다면 익명의 Http 객체 인스턴스화를 고려하십시오.

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")

내용이 문자열로 응답 본문이되고 resp에는 상태 및 응답 헤더가 포함됩니다.

표준 python 설치에는 포함되어 있지 않지만 표준 python 만 필요하지만 체크 아웃 할 가치가 있습니다.


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 동사를 쉽게 제공 할 수 있다는 점에서 훌륭합니다.
Tom

5

wget에 대한 theller의 솔루션은 실제로 유용하지만 다운로드 프로세스 전체에서 진행 상황을 인쇄하지는 않습니다. reporthook의 print 문 다음에 한 줄을 추가하면 완벽합니다.

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

다음은 Python의 wget 스크립트입니다.

# 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

추가로 필요한 가져 오기가 없으면이 솔루션이 작동합니다.

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()

헤더 정보에 "User-Agent"를 지정하지 않은 경우 종종 콘텐츠를 가져 오는 데 어려움이 있습니다. 그런 다음 일반적으로 요청은 다음과 같이 취소됩니다. 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 API를 사용하는 경우 Nap 와 같은 편리한 선택이 있습니다 .

예를 들어 2014 년 5 월 1 일 이후 Github에서 요점을 얻는 방법은 다음과 같습니다.

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

탁월한 솔루션 Xuan, Theller.

파이썬 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 : //"가 있어야합니다. 그렇지 않으면 알 수없는 URL 유형 오류가 반환됩니다.


1

의 경우 dloadpython >= 3.6 를 사용할 수 있습니다 .

import dload
t = dload.text(url)

의 경우 json:

j = dload.json(url)

설치:
pip install dload


0

실제로 파이썬에서는 파일과 같은 URL에서 읽을 수 있습니다. 여기 API에서 json을 읽는 예제가 있습니다.

import json

from urllib.request import urlopen

with urlopen(url) as f:

resp = json.load(f)

return resp['some_key']

답변 해 주셔서 감사하지만 다른 답변보다 추가 가치를 제공하는 것이 좋습니다. 이 경우 다른 사용자가 해당 솔루션을 이미 게시 했으므로 귀하의 답변은 추가 가치를 제공하지 않습니다. 이전 답변이 도움이 되었다면 동일한 정보를 반복하는 대신 투표해야합니다.
Toby Speight

0

더 낮은 수준의 API를 원하는 경우 :

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.