Pytrch crawler combat study notes_4 solicitud de red módulo urllib3: enviar instancia de solicitud GET/POST + cargar archivo + IP proxy + json + binario + tiempo de espera

1 Introducción al módulo urllib3

urllib3 es un módulo de solicitud de red de terceros (instale el módulo por separado), que es más poderoso que el urllib que viene con Python.

1.1 Entendiendo urllib3

La biblioteca urllib3 es una biblioteca de Python potente y bien organizada para clientes HTTP que proporciona muchas características importantes que no se encuentran en la biblioteca estándar de Python. P.ej:

  1. a salvo de amenazas.
  2. grupo de conexiones.
  3. Autenticación de cliente SSL/TIIS
  4. Subir archivos usando codificación multiparte
  5. Los ayudantes se utilizan para reintentar solicitudes y manejar redireccionamientos HTTP.
  6. Admite codificación gzip y deflate
  7. Admite proxies HTTP y SOCKS
  8. 100% de cobertura de prueba

1.1.1 comando de instalación urllib3

pip install urllib3

2 Enviar una solicitud de red

2.1 Enviar una solicitud de obtención

Al usar el módulo urllib3 para enviar solicitudes de red, primero debe crear un objeto PoolManager y llamar al método request() a través de este objeto para enviar solicitudes de red.

La sintaxis del método request() es la siguiente.

request(method,url,fields=None,headers=None,**urlopen_kw)
  • método: Parámetro obligatorio, utilizado para especificar el método de solicitud, como GET, POST, PUT, etc.
  • url: Parámetro obligatorio, utilizado para establecer la dirección URL que debe solicitarse.
  • campos: parámetro opcional utilizado para establecer los parámetros de la solicitud.
  • encabezados: parámetro opcional utilizado para establecer encabezados de solicitud.

2.1.1 Enviar una instancia de solicitud GET [y obtener la información de respuesta]

import urllib3
urllib3.disable_warnings() # 关闭SSL警告
url = "https://www.baidu.com/"
http = urllib3.PoolManager()
get = http.request('GET',url) # 返回一个HTTPResponse对象
print(get.status)
# 输出 200

response_header = get.info() # 获取HTTPResponse对象中的info()获取响应头信息,字典形状,需要用for循环
for key in response_header:
    print(key,":",response_header.get(key))
# Accept-Ranges : bytes
# Cache-Control : no-cache
# Connection : keep-alive
# Content-Length : 227
# Content-Type : text/html
# Date : Mon, 21 Mar 2022 12:12:23 GMT
# P3p : CP=" OTI DSP COR IVA OUR IND COM ", CP=" OTI DSP COR IVA OUR IND COM "
# Pragma : no-cache
# Server : BWS/1.1
# Set-Cookie : BD_NOT_HTTPS=1; path=/; Max-Age=300, BIDUPSID=E864BF1D7795F2742A7BC13B95F89493; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com, PSTM=1647864743; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com, BAIDUID=E864BF1D7795F27482D1B67B4F266616:FG=1; max-age=31536000; expires=Tue, 21-Mar-23 12:12:23 GMT; domain=.baidu.com; path=/; version=1; comment=bd
# Strict-Transport-Security : max-age=0
# Traceid : 1647864743283252404214760038623219429901
# X-Frame-Options : sameorigin
# X-Ua-Compatible : IE=Edge,chrome=1

2.1.2 Enviar solicitud POST

import urllib3
url ="www.httpbin.org/post"
params = {'name':'xiaoli','age':'1'}
http = urllib3.PoolManager()
post = http.request('POST',url,fields=params,retries=5) # retries重试次数:默认为3
print("返回结果:",post.data.decode('utf-8'))
print("返回结果(含中文的情况下):",post.data.decode('unicode_escape'))

2.2 Información de devolución del servidor de procesamiento

2.2.1 Procesando la información json devuelta por el servidor

Si el servidor devuelve una parte de la información JSON, y solo una determinada parte de los datos está disponible en esta parte de la información, primero puede convertir los datos JSON devueltos en datos del diccionario y mantener presionado para obtener el valor correspondiente a la clave especificada .

import urllib3
import json
url ="www.httpbin.org/post"
params = {'name':'xiaoli','age':'1'}
http = urllib3.PoolManager()
post = http.request('POST',url,fields=params,retries=5) # retries重试次数:默认为3
post_json_EN = json.loads(post.data.decode('utf-8'))
post_json_CH = json.loads(post.data.decode('unicode_escape')) # 将响应数据转换为字典类型
print("获取name对应的数据",post_json_EN.get('form').get('name'))
# 获取name对应的数据 xiaoli

2.2.2 Procesamiento de los datos binarios (imagen) devueltos por el servidor

import urllib3
urllib3.disable_warnings()
url = 'https://img-blog.csdnimg.cn/2020060123063865.png'
http = urllib3.PoolManager()
get = http.request('GET',url) # 创建open对象
print(get.data)
f = open('./p.png','wb+')
f.write(get.data) # 写入数据
f.close()

2.2.3 Establecer el encabezado de la solicitud

import urllib3
urllib3.disable_warnings()
url = 'https://www.baidu.com/'
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36'}
http = urllib3.PoolManager()
get = http.request('GET',url,headers=headers)
print(get.data.decode('utf-8'))

2.2.4 Establecer tiempo de espera

import urllib3    # 导入urllib3模块
urllib3.disable_warnings()               # 关闭ssl警告
baidu_url = 'https://www.baidu.com/'    # 百度超时请求测试地址
python_url = 'https://www.python.org/'  # Python超时请求测试地址
http = urllib3.PoolManager()                   # 创建连接池管理对象
try:
    r = http.request('GET',baidu_url,timeout=0.01)# 发送GET请求,并设置超时时间为0.01秒
except  Exception as error:
    print('百度超时:',error)
# 百度超时: HTTPSConnectionPool(host='www.baidu.com', port=443): Max retries exceeded with url: / (Caused by ConnectTimeoutError(<urllib3.connection.HTTPSConnection object at 0x000002690D2057F0>, 'Connection to www.baidu.com timed out. (connect timeout=0.01)'))

http2 = urllib3.PoolManager(timeout=0.1)  # 创建连接池管理对象,并设置超时时间为0.1秒
try:
    r = http2.request('GET', python_url)  # 发送GET请求
except  Exception as error:
    print('Python超时:',error)
# Python超时: HTTPSConnectionPool(host='www.python.org', port=443): Max retries exceeded with url: / (Caused by ConnectTimeoutError(<urllib3.connection.HTTPSConnection object at 0x000002690D21A910>, 'Connection to www.python.org timed out. (connect timeout=0.1)'))

2.2.5 Establecer proxy IP

import urllib3    # 导入urllib3模块
url = "http://httpbin.org/ip"            # 代理IP请求测试地址
# 定义火狐浏览器请求头信息
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:77.0) Gecko/20100101 Firefox/77.0'}
# 创建代理管理对象
proxy = urllib3.ProxyManager('http://120.27.110.143:80',headers = headers)
r = proxy.request('get',url,timeout=2.0)  # 发送请求
print(r.data.decode())                    # 打印返回结果

2.3 Subir

2.3.1 Subir texto

import urllib3
import json
with open('./test.txt') as f :# 打开文本文件
    data = f.read() # 读取文件
url = "http://httpbin.org/post"
http = urllib3.PoolManager()
post = http.request('POST',url,fields={'filedield':('upload.txt',data)})
files = json.loads(post.data.decode('utf-8'))['files']  # 获取上传文件内容
print(files)                                         # 打印上传文本信息
# {'filedield': '在学习中寻找快乐!'}

2.3.2 Subir archivos de imagen

import urllib3
with open('p.png','rb') as f :
    data = f.read()
url = "http://httpbin.org/post"
http = urllib3.PoolManager()
# 发送上传图片文件请求
post = http.request('POST',url,body = data,headers={'Content-Type':'image/jpeg'})
print(post.data.decode())

Supongo que te gusta

Origin blog.csdn.net/qq_39237205/article/details/123644218
Recomendado
Clasificación