2, biblioteca urllib - una solicitud de red
módulo de procesamiento de URL
- urllib lista de proyectos es una colección de más módulos utilizados en la URL del paquete:
- Urllib.request lista de elementos para abrir y leer el URL
- Contiene una lista de elementos urllib.error excepciones lanzadas urllib.request
- Lista de artículos Urllib.parse URL utilizada para análisis sintáctico
- Urllib.robotparser lista de elementos utilizado para analizar el archivo robots.txt
Iniciar una solicitud
urllib.request.urlopen(url, data=None, [timeout, ]*, cafile=None, capath=None, cadefault=False, context=None)
#参数描述
第一个参数 String 类型的地址或者一个Request 对象
data 是 bytes 类型的内容,可通过 bytes()函数转为化字节流。它也是可选参数。使用 data 参数,请求方式变成以 POST 方式提交表单。使用标准格式是application/x-www-form-urlencoded
timeout 参数是用于设置请求超时时间。单位是秒。
cafile和capath代表 CA 证书和 CA 证书的路径。如果使用HTTPS则需要用到。
context参数必须是ssl.SSLContext类型,用来指定SSL设置
cadefault参数已经被弃用,可以不用管了。
该方法也可以单独传入urllib.request.Request对象
该函数返回结果是一个http.client.HTTPResponse对象
rastreo sencilla la web
import urllib.request
url = "http://tieba.baidu.com"
response = urllib.request.urlopen(url)
html = response.read() # 获取到页面的源代码
print(html.decode('utf-8')) # 转化为 utf-8 编码
Juego de solicitudes de tiempo de espera
Debido a razones de red no puede ser solicitada en respuesta, establece el tiempo de espera, descarta la solicitud o seleccionar otra solicitud de nuevo.
import urllib.request
url = "http://tieba.baidu.com"
response = urllib.request.urlopen(url, timeout=1)
print(response.read().decode('utf-8'))
tiempo de espera de rastreo
import socket
import urllib.request
import urllib.error
try:
response = urllib.request.urlopen('http://httpbin.org/get', timeout=0.1)
except urllib.error.URLError as e:
if isinstance(e.reason, socket.timeout):
print('TIME OUT')
El uso de parámetros de los datos presentados
Después de eso utilizar el método POST para enviar datos
import urllib.parse
import urllib.request
url = "http://127.0.0.1:8000/book"
params = {
'name':'浮生六记',
'author':'沈复'
}
data = bytes(urllib.parse.urlencode(params), encoding='utf8')
response = urllib.request.urlopen(url, data=data)
print(response.read().decode('utf-8'))
params necesidades para transcodificar en un flujo de bytes. Y params es un diccionario. Tenemos que utilizar urllib.parse.urlencode () el diccionario en una cadena. Reutilización bytes () en una corriente de bytes. Finalmente, utilizando la urlopen () inicia una solicitud, la solicitud se simula la presentación de los datos del formulario utilizando el método POST
de solicitud de uso
el método urlopen () proporciona un simple iniciador petición se puede añadir .Request solicitud de cabecera (cabeceras), especifique la solicitud
constructor de la solicitud:
urllib.request.Request(url, data=None, headers={}, origin_req_host=None, unverifiable=False, method=None)
#参数说明
url 参数是请求链接,这个是必传参数,其他的都是可选参数。
data 参数跟 urlopen() 中的 data 参数用法相同。
headers 参数是指定发起的 HTTP 请求的头部信息。headers 是一个字典。它除了在 Request 中添加,还可以通过调用 Reques t实例的 add_header() 方法来添加请求头。
origin_req_host 参数指的是请求方的 host 名称或者 IP 地址。
unverifiable 参数表示这个请求是否是无法验证的,默认值是False。意思就是说用户没有足够权限来选择接收这个请求的结果。例如我们请求一个HTML文档中的图片,但是我们没有自动抓取图像的权限,我们就要将 unverifiable 的值设置成 True。
method 参数指的是发起的 HTTP 请求的方式,有 GET、POST、DELETE、PUT等
Fácil de usar Solicitud
mascarada User_Agent
import urllib.request
url = "http://tieba.baidu.com/"
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36'
}
request = urllib.request.Request(url=url, headers=headers)
response = urllib.request.urlopen(request)
print(response.read().decode('utf-8'))
Solicitud Uso avanzado
Añadir proxy en la solicitud, las galletas de procesar una solicitud, tenemos que utilizar Handler y OpenerDirector
1) Handler
Manejador en chino significa manipuladores, procesadores. Manejador puede manejar varias cosas solicitud (HTTP, HTTPS, FTP, etc.). Es una realización concreta de esta urllib.request.BaseHandler clase. Es la clase base para todos Handler, que proporciona el método más básico Handler, por ejemplo default_open (), protocol_request () y similares.
Hay una serie de BaseHandler heredada, Voy a enumerar algunos de los tipos más comunes:
ProxyHandler: Conjunto de la solicitud de proxy
HTTPCookieProcessor: Galletas HTTP solicitud de procesamiento
HTTPDefaultErrorHandler: tratamiento de errores de respuesta HTTP.
HTTPRedirectHandler: manejo de redirecciones HTTP.
HTTPPasswordMgr: administrar las contraseñas, que mantiene una lista de nombre de usuario y contraseña.
HTTPBasicAuthHandler: para la autenticación de inicio de sesión, y se utilizan generalmente en combinación HTTPPasswordMgr
2) OpenerDirector
Para OpenerDirector, podemos llamar abridor. Hemos utilizado urlopen () Este método, de hecho, es para nosotros proporcionar un abridor urllib. Eso abridor Handler y cuál es la relación? El abridor, objeto es crear cabo método build_opener (handler) de. Necesitamos crear un abridor de costumbre, es necesario método (abridor) install_opener uso. Es de destacar que, de instancias install_opener conseguirá un objetivo mundial de OpenerDirector
Utilizar un proxy
import urllib.request
url = "http://tieba.baidu.com/"
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36'
}
proxy_handler = urllib.request.ProxyHandler({
'http': 'web-proxy.oa.com:8080',
'https': 'web-proxy.oa.com:8080'
})
opener = urllib.request.build_opener(proxy_handler)
urllib.request.install_opener(opener)
request = urllib.request.Request(url=url, headers=headers)
response = urllib.request.urlopen(request)
print(response.read().decode('utf-8'))
certificación de registro
import urllib.request
url = "http://tieba.baidu.com/"
user = 'user'
password = 'password'
pwdmgr = urllib.request.HTTPPasswordMgrWithDefaultRealm()
pwdmgr.add_password(None,url ,user ,password)
auth_handler = urllib.request.HTTPBasicAuthHandler(pwdmgr)
opener = urllib.request.build_opener(auth_handler)
response = opener.open(url)
print(response.read().decode('utf-8'))
cookies creadas
Si la página solicitada requiere autenticación cada vez, podemos utilizar cookies para iniciar sesión automáticamente en, eliminando la necesidad de la operación de autenticación de inicio de sesión repetida. Galletas necesita para obtener http.cookiejar.CookieJar () para crear una instancia de un Galletas objetos. Entonces urllib.request.HTTPCookieProcessor construido objeto manejador. Finalmente, usando el abridor de la función open () puede ser
import http.cookiejar
import urllib.request
url = "http://tieba.baidu.com/"
fileName = 'cookie.txt'
cookie = http.cookiejar.CookieJar()
handler = urllib.request.HTTPCookieProcessor(cookie)
opener = urllib.request.build_opener(handler)
response = opener.open(url)
f = open(fileName,'a')
for item in cookie:
f.write(item.name+" = "+item.value+'\n')
f.close()
HTTPResponse
Uso de la urllib.request.urlopen () o opener.open (url) El resultado es un objeto http.client.HTTPResponse. Tiene msg, la versión, el estado, la razón, debuglevel, atributos cerrados y leer (), readinto (), getHeader (nombre), getHeaders (), la función fileno () y similares
error al analizar
Procesamiento de excepciones se utiliza principalmente en dos clases, urllib.error.URLError y urllib.error.HTTPError
. 1, UrlError
clase de excepción UrlError es la urllib.error clase base puede capturar las excepciones generadas por urllib.request. La razón de que tiene una razón de atributos, es decir, devuelve un error
import urllib.request
import urllib.error
url = "http://www.google.com"
try:
response = request.urlopen(url)
except error.URLError as e:
print(e.reason)
2, la HTTPError
la HTTPError UEKRrror es una subclase de error especializado manejar peticiones HTTP y HTTPS. Tiene tres atributos.
1) Código: HTTP solicitud devuelve un código de estado.
2) Renson: De tal palo Clase de uso, que devuelve las razones equivocadas.
3) headers`: cabecera HTTP información de solicitud de respuesta devuelto
import urllib.request
import urllib.error
url = "http://www.google.com"
try:
response = request.urlopen(url)
except error.HTTPError as e:
print('code: ' + e.code + '\n')
print('reason: ' + e.reason + '\n')
print('headers: ' + e.headers + '\n')
respuesta
import urllib.request
response = urllib.request.urlopen('https://www.python.org')
print(type(response))
#结果为:<class 'http.client.httpresponse'="">
Por Response.Status, response.getheaders (). Response.getheader ( "servidor"), y la información de cabecera para obtener el response.read código de estado () se obtiene en respuesta al cuerpo del contenido