02 URLLIB 라이브러리의 파이썬 파충류 기준

파이썬 네트워크 요청 및 urllib3 자세한 URLLIB

urllibPython2가 URLLIB되었다 주로 URLLIB 및 urllib2가 파이썬 표준 라이브러리 공식 요청 URL 연결, 통합 Python3입니다.

공식 문서에 대한 링크 : https://docs.python.org/3/library/urllib.html

그리고 urllib3 연결 풀은 보완적인 부분을 모두 기능을 증가한다.

URLLIB

그것은 기본적으로 4 개 개의 모듈로 구성되어 네트워크 요청의 기본 기능을 포함, 우리가 사용하는 데 필요한 추가 설치가 필요하지 않습니다 의미 내장 된 HTTP 요청 파이썬 라이브러리입니다 :

  • 개방 urllib.request 및 URL을 읽는

  • urllib.error 앞 핸들 예외 요청을 발생

  • URL을 확인하는 데 사용 urllib.parse

  • urllib.robotparser은 robots.txt 파일을 구문 분석하는 데 사용

urllib.request

URLLIB에서, request이 모듈이 구성 및 네트워크 요청을 시작하고, 헤더를 추가하기위한 책임이있다, 프록시 좋아.

이 프로세스를 시작하는 브라우저 요청의 사용을 시뮬레이션 할 수 있습니다

GET 요청

주요 사용 urlopen()방법은 요청을 시작합니다 :

에서 URLLIB 수입 요청 RESP = 요청. urlopen ( 'http://www.baidu.com') 인쇄 ( RESP. ) (읽기. 디코딩 ())


에서 urlopen()들어오는 문자열 형식 방법 URL 주소,이 방법은 대상 URL에 액세스 및 액세스의 결과를 반환합니다.

방문의 결과가 될 것입니다 http.client.HTTPResponse,이 오브젝트의 사용, 대상 read()방법을 사용 가능한 데이터 페이지에 액세스 할 수 있습니다. 그러나이 될 것입니다 얻은 데이터 점에 유의 bytes바이너리 형식의, 당신은 할 필요가 decode()문자열 형식으로 변환, 봐.

POST 요청이 시작

urlopen()기본 액세스 방법은 경우, GET입니다 urlopen()들어오는 데이터 매개 변수 방법은, 그것은 POST 요청을 시작합니다.

주 : 데이터는 데이터 형식을 바이트를 전송해야합니다.

문자열 파라미터로 사전를 urlencode () 메소드 레인 urllib.parse 모듈. 두 번째 인수는 인코딩 형식 본원 UTF8로 지정된 지정.

설정 시간 초과 매개 변수는 요청 시간이 초과되면, 그것은 예외가 발생합니다, 시간 제한을 설정할 수 있습니다.

에서 URLLIB 수입 요청 RESP = 요청. urlopen ( 'http://httpbin.org/post' 데이터 = b'word = 안녕하세요 ') 인쇄 ( RESP. .) (판독 (디코드))


설정 시간 제한

요청 응답 시간이 초과되지 않은 경우,이 예외가 발생합니다 초 시간 제한을 설정 URLError

에서 URLLIB 수입 요청 응답 = URLLIB. 의뢰. urlopen ( 'http://httpbin.org/get' 제한 시간 = 0.1)

 

Request 객체

상기 한 바와 같이, urlopen()이 방법은 기본적인 요구를 구현 될 수 있지만, 몇 가지 간단한 매개 변수는 헤더 및 기타 정보를 추가 요청이 필요, 우리는 더 강력한 사용할 수있는 경우, 전체 요청을 구축하기에 충분하지 않습니다 Request개체의 확장을, Request객체는 다음과 도.

 

클래스 URLLIB. 의뢰. 요청 ( URL, 데이터 = 없음, 헤더 = {} origin_req_host = 없음, 확인 불가능한 = 거짓, METHOD = 없음)
 
 

 urlopen () 가장 기본을 달성 할 수있는 방법은 요청을 시작하지만, 요청 헤더 및 기타 정보, 우리가 요청 요청을 구성하기 위해 더 강력한 클래스를 사용할 수 있습니다 추가 할 필요가있는 경우 몇 가지 간단한 매개 변수, 완전한 요청을 구축하는 것만으로는 충분하지 않습니다 .

를 구축합니다 Request물체가 url 매개 변수에 전달해야합니다, 데이터 및 데이터 헤더는 선택 사항입니다.

最后,Request方法可以使用method参数来自由选择请求的方法,如PUT,DELETE等等,默认为GET。

添加Headers

通过urllib发起的请求会有默认的一个Headers:"User-Agent":"Python-urllib/3.6",指明请求是由urllib发送的。

所以遇到一些验证User-Agent的网站时,我们需要自定义Headers,而这需要借助于urllib.request中的Request对象。

from urllib import request

url = 'http://httpbin.org/get'
headers = {'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36'}

# 需要使用url和headers生成一个Request对象,然后将其传入urlopen方法中
req = request.Request(url, headers=headers)
resp = request.urlopen(req)
print(resp.read().decode())

 

添加Cookie

为了在请求时能带上Cookie信息,我们需要重新构造一个opener。

使用request.build_opener方法来进行构造opener,将我们想要传递的cookie配置到opener中,然后使用这个opener的open方法来发起请求。

from http import cookiejar
from urllib import request

url = 'http://httpbin.org/cookies'
# 创建一个cookiejar对象
cookie = cookiejar.CookieJar()
# 使用HTTPCookieProcessor创建cookie处理器
cookies = request.HTTPCookieProcessor(cookie)
# 并以它为参数创建Opener对象
opener = request.build_opener(cookies)
# 使用这个opener来发起请求
resp = opener.open(url)
print(resp.read().decode())

或者也可以把这个生成的opener使用install_opener方法来设置为全局的。

则之后使用urlopen方法发起请求时,都会带上这个cookie。

# 将这个opener设置为全局的opener
request.install_opener(opener)
resp = request.urlopen(url)

设置Proxy代理

使用爬虫来爬取数据的时候,常常需要使用代理来隐藏我们的真实IP。

from urllib import request

url = 'http://httpbin.org/ip'
proxy = {'http':'50.233.137.33:80','https':'50.233.137.33:80'}
# 创建代理处理器
proxies = request.ProxyHandler(proxy)
# 创建opener对象
opener = request.build_opener(proxies)

resp = opener.open(url)
print(resp.read().decode())

下载数据到本地

在我们进行网络请求时常常需要保存图片或音频等数据到本地,一种方法是使用python的文件操作,将read()获取的数据保存到文件中。

urllib提供了一个urlretrieve()方法,可以简单的直接将请求获取的数据保存成文件。

from urllib import request

url = 'http://python.org/'
request.urlretrieve(url, 'python.html')

urlretrieve()方法传入的第二个参数为文件保存的位置,以及文件名。

注:urlretrieve()方法是python2直接移植过来的方法,以后有可能在某个版本中弃用。

 

urllib.response

在使用urlopen()方法或者opener的open()方法发起请求后,获得的结果是一个response对象。

这个对象有一些方法和属性,可以让我们对请求返回的结果进行一些处理。

  • read()

    获取响应返回的数据,只能使用一次。

  • getcode()

    获取服务器返回的状态码。

  • getheaders()

    获取返回响应的响应报头。

  • geturl()

    获取访问的url。

 

urllib.parse

urllib.parse是urllib中用来解析各种数据格式的模块。

urllib.parse.quote

在url中,是只能使用ASCII中包含的字符的,也就是说,ASCII不包含的特殊字符,以及中文等字符都是不可以在url中使用的。而我们有时候又有将中文字符加入到url中的需求,例如百度的搜索地址:

https://www.baidu.com/s?wd=南北

?之后的wd参数,则是我们搜索的关键词。那么我们实现的方法就是将特殊字符进行url编码,转换成可以url可以传输的格式,urllib中可以使用quote()方法来实现这个功能。

>>> from urllib import parse
>>> keyword = '南北'
>>> parse.quote(keyword)
'%E5%8D%97%E5%8C%97'

如果需要将编码后的数据转换回来,可以使用unquote()方法。

>>> parse.unquote('%E5%8D%97%E5%8C%97')
'南北'

urllib.parse.urlencode

在访问url时,我们常常需要传递很多的url参数,而如果用字符串的方法去拼接url的话,会比较麻烦,所以urllib中提供了urlencode这个方法来拼接url参数。

>>> from urllib import parse
>>> params = {'wd': '南北', 'code': '1', 'height': '188'}
>>> parse.urlencode(params)
'wd=%E5%8D%97%E5%8C%97&code=1&height=188'

 

urllib.error

urllib中主要设置了两个异常,一个是URLError,一个是HTTPErrorHTTPErrorURLError的子类。

HTTPError还包含了三个属性:

  • code:请求的状态码

  • reason:错误的原因

  • headers:响应的报头

例子:

In [1]: from urllib.error import HTTPError

In [2]: try:
   ...:     request.urlopen('https://www.jianshu.com')
   ...: except HTTPError as e:
   ...:     print(e.code)
    
403

 

urllib3

Urllib3是一个功能强大,条理清晰,用于HTTP客户端的Python库。许多Python的原生系统已经开始使用urllib3。Urllib3提供了很多python标准库urllib里所没有的重要特性:

  1. 线程安全

  2. 连接池

  3. 客户端SSL/TLS验证

  4. 文件分部编码上传

  5. 协助处理重复请求和HTTP重定位

  6. 支持压缩编码

  7. 支持HTTP和SOCKS代理

 

安装

urllib3是一个第三方库,安装非常简单,pip安装即可:

pip install urllib3

 

使用

urllib3主要使用连接池进行网络请求的访问,所以访问之前我们需要创建一个连接池对象,如下所示:

>>> import urllib3
>>> http = urllib3.PoolManager()
>>> r = http.request('GET', 'http://httpbin.org/robots.txt')
>>> r.status
200
>>> r.data
'User-agent: *\nDisallow: /deny\n'

设置headers

headers={'X-Something': 'value'}
resp = http.request('GET', 'http://httpbin.org/headers', headers=headers)

设置url参数

对于GET等没有请求正文的请求方法,可以简单的通过设置fields参数来设置url参数。

fields = {'arg': 'value'}
resp = http.request('GET', 'http://httpbin.org/get', fields=fields)

如果使用的是POST等方法,则会将fields作为请求的请求正文发送。

所以,如果你的POST请求是需要url参数的话,那么需要自己对url进行拼接。

fields = {'arg': 'value'}
resp = http.request('POST', 'http://httpbin.org/get', fields=fields)

设置代理

>>> import urllib3
>>> proxy = urllib3.ProxyManager('http://50.233.137.33:80', headers={'connection': 'keep-alive'})
>>> resp = proxy.request('get', 'http://httpbin.org/ip')
>>> resp.status
200
>>> resp.data
b'{"origin":"50.233.136.254"}\n'

 

注:urllib3中没有直接设置cookies的方法和参数,只能将cookies设置到headers中

 

추천

출처www.cnblogs.com/winfun/p/10984085.html