La diferencia entre las solicitudes y la biblioteca urllib

Enlace original: https://blog.csdn.net/sinat_37967865/article/details/85392207

Recolección, intrusión y eliminación de aprendizaje personal

-------------------------------------------------- -------------------------------------------------- ---

Cuando usamos el rastreador de Python, necesitamos simular el inicio de las solicitudes de red. Las principales bibliotecas utilizadas son la biblioteca de solicitudes y la biblioteca de urllib incorporada de Python. Generalmente se recomienda usar solicitudes, que es una reencapsulación de urllib. La principal diferencia entre su uso: las
solicitudes se pueden construir directamente e iniciar solicitudes comunes get y post. Urllib generalmente primero construye solicitudes get o post, y luego inicia la solicitud.

import requests
 
Response_get = requests.get(url, params=None, **kwargs)
Response_post = requests.post(url, data=None, json=None, **kwargs)


Lo que obtenemos después de la solicitud anterior es el objeto request.models.Response, que debe procesarse para obtener la información que necesitamos.
Response_get.text obtiene el tipo de str
Response_get.content obtiene el tipo de bytes, que debe decodificarse. es equivalente a Response_get.text
Response_get.json () para obtener el tipo de datos JSON

Por lo general, nuestra solicitud de obtención más simple es request.get (url), pero podemos personalizar la solicitud. Por ejemplo, en las cabeceras de request.get (url, headers = headers)
, el agente de usuario y la cookie se pueden personalizar
. La solicitud de publicación simple es request. post (url), también podemos request.post (url, data), donde los datos pueden ser una lista, diccionario, JSON, etc.

import urllib.request
 
req = urllib.request.Request(self, url, data=None, headers={},origin_req_host=None,unverifiable=False,method=None)
Response_request = urllib.request.urlopen(req)
Response = urllib.request.urlopen(url, data=None, timeout=1, cafile=None, capath=None, cadefault=False, context=None)


El módulo urllib.request proporciona el método más básico para construir solicitudes HTTP, que se puede utilizar para simular un proceso de inicio de solicitud del navegador.
# Al mismo tiempo, también viene con autenticación de procesamiento (verificación de autorización), redirecciones (redirección), cookies (cookies del navegador) y otros contenidos.
# parámetro de contexto, debe ser del tipo ssl.SSLContext, utilizado para especificar la configuración de SSL. Los dos parámetros cafile y capath son para especificar el certificado CA y su ruta, lo que será útil al solicitar enlaces HTTPS.
El parámetro # cadefault ahora está obsoleto y el predeterminado es False.
# Es un objeto de tipo HTTPResposne, y sus métodos principales incluyen read (), readinto (), getheader (name), getheaders (), fileno () y otras funciones
# y msg, version, status, reason, debuglevel, closed Y otros atributos. Después de obtener este objeto, asígnelo a la respuesta,
# Luego puede usar la respuesta para llamar a estos métodos y propiedades para obtener una serie de información sobre el resultado devuelto.
# Por ejemplo, response.read () puede obtener el contenido de la página web devuelta, y response.status puede obtener el código de estado del resultado devuelto. Por ejemplo, 200 significa que la solicitud se realizó correctamente, 404 significa que no se encontró la página web, etc.

Una solicitud de obtención simple es urllib.request.urlopen (url), donde url puede ser un enlace o una solicitud,
por lo que necesitamos personalizar el encabezado de la solicitud a través de urllib.request.Request (url, headers = headers), y luego Pasado como url para request.urlopen ()

La siguiente es una forma sencilla de utilizar las dos bibliotecas:

import requests
import urllib.request
 
 
url = 'http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule'
api ='http://open.iciba.com/dsapi/'
headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:23.0) Gecko/20100101 Firefox/23.0'
    }
form_data = {
    "i": "word",
    "from": "AUTO",
    "to": "AUTO",
    "smartresult": "dict",
    "doctype": "json",
    "version": "2.1",
    "keyfrom": "fanyi.web",
    "action": "FY_BY_REALTIME",
    "typoResult": "false"
}
 
 
req1 = requests.get(url,headers=headers)
req_api = requests.get(api,headers=headers)
print(type(req1),type(req1.text),req1.text)              # requests.get().text是str类型
print("字符串",type(req1.content),req1.content)           # requests.get().content是bytes类型
print("与直接req1.text一致",req1.content.decode())
print("接口返回json格式",req_api.json())                  # 接口返回格式需要用requests.get().json()
 
 
# POST发送的data必须为bytes或bytes类型的可迭代对象,不能是字符串
form_data = urllib.parse.urlencode(form_data).encode()
# urllib.request.Request()只是一个请求:
req2 = urllib.request.Request(url,data=form_data,headers=headers)
print(type(req2))
 
 
req3 = urllib.request.urlopen(url)      # 不可以伪装你的User Agent,可以通过urllib.request.Request()伪装
print(type(req3),req3.status)           # http.client.HTTPResponse
print(req3.getheaders())                # 响应的信息集合
print(req3.read().decode("utf-8"))      # urllib.request.urlopen().read().decode("utf-8")相当于requests.get().text
 
req4 = urllib.request.urlopen(req2)     # 参数可以直接是一个请求
print("直接一个请求:",req4.read().decode("utf-8"))

 

Supongo que te gusta

Origin blog.csdn.net/yocencyy/article/details/106021521
Recomendado
Clasificación