¡El más completo de la historia! Biblioteca de solicitudes de rastreador de Python (con estuche)

1. Introducción a la biblioteca de solicitudes

Requests es una biblioteca HTTP simple y elegante diseñada para humanos. La biblioteca de solicitudes es una biblioteca HTTP nativa, que es más fácil de usar que la biblioteca urllib3. La biblioteca de solicitudes envía solicitudes HTTP 1.1 nativas sin agregar cadenas de consulta manualmente a las URL ni codificar formularios de datos POST. En comparación con la biblioteca urllib3, la biblioteca de solicitudes tiene funciones de grupo de conexiones HTTP y Keep-alive completamente automáticas. La biblioteca de solicitudes contiene las siguientes funciones.

❖ 1Keep-Alive y grupo de conexiones

❖ Nombres de dominio y URL internacionalizados

❖ Sesiones con cookies persistentes

❖ Autenticación SSL basada en navegador

❖ Decodificación automática de contenido

❖ Autenticación básica/digest

❖ Cookie elegante de clave/valor

❖ Descompresión automática

❖ Cuerpo de respuesta Unicode

❖ Compatibilidad con proxy HTTP(S)

❖ Subir archivos por partes

❖ Descarga de transmisión

❖ Se agotó el tiempo de conexión

❖ Solicitudes fragmentadas

❖ Soporte .netrc

1.1 Instalación de Solicitudes

pip install requests

1.2 Uso básico de Solicitudes

Listado de Código 1-1: Enviar una solicitud de obtención y ver el resultado devuelto

import requests
url = 'http://www.tipdm.com/tipdm/index.html' # 生成get请求
rqg = requests.get(url)
# 查看结果类型
print('查看结果类型:', type(rqg))
# 查看状态码
print('状态码:',rqg.status_code)
# 查看编码
print('编码 :',rqg.encoding)
# 查看响应头
print('响应头:',rqg.headers)
# 打印查看网页内容
print('查看网页内容:',rqg.text)
查看结果类型:<class ’requests.models.Response’>
状态码:200
编码 :ISO-8859-1
响应头:{’Date’: ’Mon, 18 Nov 2019 04:45:49 GMT’, ’Server’: ’Apache-Coyote/1.1’, ’
Accept-Ranges’: ’bytes’, ’ETag’: ’W/"15693-1562553126764"’, ’Last-Modified’: ’
Mon, 08 Jul 2019 02:32:06 GMT’, ’Content-Type’: ’text/html’, ’Content-Length’: ’
15693’, ’Keep-Alive’: ’timeout=5, max=100’, ’Connection’: ’Keep-Alive’}

1.3 Solicitar método de solicitud básico

Puede enviar todas las solicitudes http a través de la biblioteca de solicitudes:

requests.get("http://httpbin.org/get") #GET请求
requests.post("http://httpbin.org/post") #POST请求
requests.put("http://httpbin.org/put") #PUT请求
requests.delete("http://httpbin.org/delete") #DELETE请求
requests.head("http://httpbin.org/get") #HEAD请求
requests.options("http://httpbin.org/get") #OPTIONS请求

2. Use Request para enviar una solicitud GET

Una de las solicitudes más comunes en HTTP es la solicitud GET. Echemos un vistazo más de cerca a cómo usar las solicitudes para construir una solicitud GET.

Descripción del parámetro GET: get(url, params=Ninguno, **kwargs):

❖ URL: URL a solicitar

❖ params : (opcional) diccionario, lista de tuplas o bytes enviados para la cadena de consulta de la solicitud

❖ **kwargs: argumentos de palabra clave de longitud variable

Primero, cree la solicitud GET más simple, el enlace de la solicitud es http://httpbin.org/get, el sitio web juzgará que si el cliente inicia una solicitud GET, devolverá la información de la solicitud correspondiente, de la siguiente manera: solicitudes para construir una solicitud GET

import requests
r = requests.get(http://httpbin.org/get)
print(r.text)
{
"args": {},
"headers": {
"Accept": "*/*",
"Accept-Encoding": "gzip, deflate",
"Host": "httpbin.org",
"User-Agent": "python-requests/2.24.0",
"X-Amzn-Trace-Id": "Root=1-5fb5b166-571d31047bda880d1ec6c311"
},
"origin": "36.44.144.134",
"url": "http://httpbin.org/get"
}

Se puede encontrar que hemos iniciado con éxito una solicitud GET y el resultado devuelto contiene información como el encabezado de la solicitud, la URL y la IP. Entonces, para las solicitudes GET, si desea adjuntar información adicional, ¿cómo la agrega generalmente?

2.1 Enviar una solicitud con encabezados

Primero, tratamos de solicitar la información de la página de inicio de Zhihu

import requests
response = requests.get(’https://www.zhihu.com/explore’)
print(f"当前请求的响应状态码为:{response.status_code}")
print(response.text)

El código de estado de respuesta de la solicitud actual es: 400

400 Petición Incorrecta


descanso abierto

Aquí encontramos que el código de estado de la respuesta es 400, lo que indica que nuestra solicitud falló, porque Zhihu descubrió que somos un rastreador, por lo que debemos disfrazar el navegador y agregar la información de UA correspondiente.

import requests
headers = {"user-agent": ’Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit
/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36’}
response = requests.get(’https://www.zhihu.com/explore’, headers=headers)
print(f"当前请求的响应状态码为:{response.status_code}")
# print(response.text)

El código de estado de respuesta de la solicitud actual es: 200

<!doctipo html>

.......

Aquí hemos agregado la información de los encabezados, que contiene la información del campo User-Agent, que es la información de identificación del navegador. ¡Aparentemente nuestro disfraz tuvo éxito! Este método de hacerse pasar por un navegador es una de las medidas anti-rastreo más simples.

Descripción del parámetro GET: el método de envío de la solicitud con el encabezado de la solicitud

solicitudes.get(url, encabezados=encabezados)

El parámetro -headers recibe encabezados de solicitud en forma de diccionario

-El nombre del campo del encabezado de la solicitud se usa como clave, y el valor correspondiente al campo se usa como valor

práctica

¡Solicite la página de inicio de Baidu https://www.baidu.com, solicite llevar encabezados e imprima la información de encabezado solicitada!

desatar

import requests
url = 'https://www.baidu.com'
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit
/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36"}
# 在请求头中带上User-Agent,模拟浏览器发送请求
response = requests.get(url, headers=headers)
print(response.content)
# 打印请求头信息
print(response.request.headers)

2.2 Enviar una solicitud con parámetros

Cuando usamos la búsqueda de Baidu, a menudo encontramos que habrá un '?' en la dirección URL, luego el signo de interrogación es el parámetro de solicitud, ¡también llamado cadena de consulta!

Por lo general, no solo visitamos páginas web básicas, especialmente cuando rastreamos páginas web dinámicas, necesitamos pasar diferentes parámetros para obtener contenido diferente; GET tiene dos métodos para pasar parámetros, puede agregar parámetros directamente en el enlace o usar parámetros para agregar parámetros

2.2.1 Llevar parámetros en url

Iniciar una solicitud directamente a la url con parámetros

import requests
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit
/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36"}
url = ’https://www.baidu.com/s?wd=python’
response = requests.get(url, headers=headers)

2.2.2 Llevar el diccionario de parámetros a través de params

1. Cree un diccionario de parámetros de solicitud

2. Lleve el diccionario de parámetros al enviar una solicitud a la interfaz y establezca el diccionario de parámetros en params

import requests
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit
/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36"}
# 这是目标url
# url = ’https://www.baidu.com/s?wd=python’
# 最后有没有问号结果都一样
url = ’https://www.baidu.com/s?’
# 请求参数是一个字典 即wd=python
kw = {’wd’: ’python’}
# 带上请求参数发起请求,获取响应
response = requests.get(url, headers=headers, params=kw)
print(response.content)

A juzgar por los resultados de ejecución, el enlace solicitado se construye automáticamente como:

http://httpbin.org/get?key2=value2&key1=value1 。

Además, el tipo de retorno de la página web es en realidad el tipo str, pero es muy especial y está en formato JSON. Por lo tanto, si desea analizar directamente el resultado devuelto y obtener un formato de diccionario, puede llamar directamente al método json(). Los ejemplos son los siguientes:

import requests
r = requests.get("http://httpbin.org/get")
print( type(r.text))
print(r.json())
print( type(r. json()))

< clase 'cadena' >

{ 'args' : {}, 'headers' : { 'Accept' : '*/*' , 'Accept-Encoding' : 'gzip, deflate' , 'Host'

'httpbin.org' , 'Agente de usuario' : 'python-requests/2.24.0' , 'X-Amzn-Trace-Id' : '

Raíz=1-5fb5b3f9-13f7c2192936ec541bf97841' }, 'origen' : '36.44.144.134' , 'url' : '

http://httpbin.org/get' }

< clase 'dict' >

Se puede encontrar que llamando al método json(), la cadena devuelta en formato JSON se puede convertir en un diccionario. Sin embargo, debe tenerse en cuenta que si el resultado devuelto no está en formato JSON, se producirá un error de análisis y se generará una excepción json.decoder.JSONDecodeError.

Contenido complementario, la cadena de diccionario recibida se codificará automáticamente y se enviará a la URL, de la siguiente manera:

import requests
headers = {’User-Agent’: ’Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit
/537.36 (KHTML, like Gecko) Chrome/86.0.4240.193 Safari/537.36’}
wd = ’张三同学’
pn = 1
response = requests.get(’https://www.baidu.com/s’, params={’wd’: wd, ’pn’: pn},
headers=headers)
print(response.url)

# La salida es: https://www.baidu.com/s?wd=%E9%9B%A8%E9%9C%93%E5%90%8

C%E5%AD%A6&pn=1

# Se puede ver que la url ha sido codificada automáticamente

El código anterior es equivalente al código siguiente, la conversión de codificación de parámetros utiliza esencialmente urlencode

import requests
from urllib.parse import urlencode
headers = {’User-Agent’: ’Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit
/537.36 (KHTML, like Gecko)
wd = ’张三同学’
encode_res = urlencode({’k’: wd}, encoding=’utf-8’)
keyword = encode_res.split(’=’)[1]
print(keyword)
# 然后拼接成url
url = ’https://www.baidu.com/s?wd=%s&pn=1’ % keyword
response = requests.get(url, headers=headers)
print(response.url)

# La salida es: https://www.baidu.com/s?wd=%E9%9B%A8%E9%9C%93%E5

%90%8C%E5%AD%A6&pn=1

2.3 Rastrear páginas web mediante solicitudes GET

El enlace de solicitud anterior devuelve una cadena en formato JSON, por lo que si solicita una página web normal, ¡definitivamente obtendrá el contenido correspondiente!

import requests
import re
headers = {"user-agent": ’Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit
/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36’}
response = requests.get(’https://www.zhihu.com/explore’, headers=headers)
result = re.findall("(ExploreSpecialCard-contentTitle|ExploreRoundtableCard
questionTitle).*?>(.*?)</a>", response.text)
print([i[1] for i in result])

[ ' ¿Qué es delicioso en la calle Xi'an Huimin? ' , ' ¿Qué tesoros vale la pena visitar en Xi'an? ' , '¿Qué distritos comerciales en Xi'an llevan a tu juventud? ' , ' ¿Qué buenos hábitos de manejo tienes que puedas compartir? ' , ' ¿Hay algún consejo de conducción que solo conocen los conductores experimentados? ' , 'Atención los que tienen auto, todos deben dominar estos conocimientos de manejo, pueden salvar vidas en momentos críticos' , '¡Bienvenidos a Landing! Aviso de reclutamiento de miembros de Zhihu', 'Pregunta de aterrizaje en el planeta: Te doy diez yuanes para viajar al futuro, ¿cómo puedes ganarte la vida? ' , 'Pregunta de aterrizaje en el planeta: ¿Qué tipo de "súper energía" en el universo de Zhihu deseas tener más? Cómo lo usarías? ', 'Salmón noruego, el origen es importante', '¿Cuáles son los lugares más atractivos de Noruega? ' , '¿Cómo es vivir en Noruega? ' , ' ¿Cómo ve la producción en masa de la pantalla flexible AMOLED de BOE? ¿Cuáles son las perspectivas de futuro? ' , '¿Pueden las pantallas flexibles revolucionar la industria de la telefonía móvil? ' , '¿Qué es una batería flexible flexible ultradelgada? ¿Tendrá un impacto significativo en la duración de la batería del teléfono inteligente? ' , ' ¿Cómo puedes aprender arte bien y obtener altas calificaciones en la prueba de arte con cero fundamentos en arte? ', '¿La Academia de Bellas Artes de Tsinghua es despreciada?', '¿Son realmente malos los estudiantes de arte? ' , '¿Cómo debe una persona vivir esta vida? ', '¿Qué debe perseguir una persona en su vida? ', '¿Se volverán locos los seres humanos después de conocer la verdad última del mundo?', '¿La ansiedad se debe a la falta de capacidad? ', '¿Qué tipo de experiencia es la fobia social? ' , ' ¿Es razonable el dicho "Cuando estás ocupado no tienes tiempo para estar deprimido"? ']

Aquí hemos agregado la información de los encabezados, que contiene la información del campo User-Agent, que es la información de identificación del navegador. Si esto no se agrega, Zhihu prohibirá el rastreo.

Captura de datos binarios En el ejemplo anterior, estamos capturando una página de Zhihu, que en realidad devuelve un documento HTML.

¿Qué debo hacer si quiero capturar imágenes, audio, video y otros archivos? Los archivos como imágenes, audio y video se componen esencialmente de códigos binarios. Debido al formato de almacenamiento específico y al método de análisis correspondiente, podemos ver estos diversos archivos multimedia.

Entonces, si desea capturarlos, debe obtener su código binario. Tomemos el icono del sitio de GitHub como ejemplo:

import requests
response = requests.get("https://github.com/favicon.ico")
with
open(’github.ico’, ’wb’) as f:
f.write(response.content)

Las dos propiedades del objeto Respuesta, una es texto y la otra es contenido, la primera representa texto tipo cadena y la segunda representa datos tipo bytes, de igual manera también se pueden obtener archivos de audio y video de esta forma.

2.4 Llevar cookie en el parámetro Encabezados

Los sitios web a menudo usan el campo Cookie en el encabezado de la solicitud para mantener el estado de acceso del usuario, por lo que podemos agregar Cookie al parámetro de encabezado para simular la solicitud de los usuarios comunes.

2.4.1 Obtención de cookies

Para poder obtener la página de inicio de sesión a través de rastreadores, o para resolver el anti-rastreo a través de cookies, es necesario usar request para procesar solicitudes relacionadas con cookies:

import requests
url = ’https://www.baidu.com’
req = requests.get(url)
print(req.cookies)
# 响应的cookies
for key, value in req.cookies.items():
print(f"{key} = {value}") 

<RequestsCookieJar[<Cookie BDORZ=27315 para .baidu.com/>]>

BDORZ = 27315

Aquí podemos obtener cookies con éxito llamando primero al atributo de cookies, y podemos encontrar que es del tipo RequestCookieJar. Luego use el método items() para convertirlo en una lista de tuplas, recorra y genere el nombre y el valor de cada Cookie, y realice el recorrido y análisis de Cookie.

2.4.2 Iniciar sesión con cookies

La ventaja de traer cookies y sesiones: puede solicitar la página después de iniciar sesión.

Desventajas de traer cookies y sesiones: un conjunto de cookies y sesiones a menudo corresponden a la solicitud de un usuario demasiado rápido, y la cantidad de solicitudes es demasiado, lo que el servidor reconoce fácilmente como un rastreador.

Trate de no usar cookies cuando no las necesite, pero para obtener la página después de iniciar sesión, debemos enviar una solicitud con cookies. Podemos usar cookies directamente para mantener el estado de inicio de sesión. Tomemos Zhihu como ejemplo para ilustrar . Primero inicie sesión en Zhihu y copie el contenido de las cookies en los encabezados.

➢ Copie User-Agent y Cookie del navegador

➢ El campo del encabezado de solicitud y el valor en el navegador deben ser consistentes con el parámetro de encabezados

➢ El valor correspondiente a la clave Cookie en el diccionario de parámetros de solicitud de encabezados es una cadena

import requests
import re
# 构造请求头字典
headers = {
# 从浏览器中复制过来的User-Agent
"user-agent": ’Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (
KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36’,
# 从浏览器中复制过来的Cookie
"cookie": ’xxx这里是复制过来的cookie字符串’}
# 请求头参数字典中携带cookie字符串
response = requests.get(’https://www.zhihu.com/creator’, headers=headers)
data = re.findall(’CreatorHomeAnalyticsDataItem-title.*?>(.*?)</div>’,response.text)
print(response.status_code)
print(data)

Cuando hacemos una solicitud sin cookies:

import requests
import re
headers = {"user-agent": ’Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit
/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36’}
response = requests.get(’https://www.zhihu.com/creator’, headers=headers)
data = re.findall(’CreatorHomeAnalyticsDataItem-title.*?>(.*?)</div>’,response.text)
print(response.status_code)
print(data)

200

[]

Está vacío en la salida impresa y, en comparación con los dos, el parámetro de encabezado se usa con éxito para transportar la cookie para obtener la página a la que solo se puede acceder después de iniciar sesión.

2.4.3 Parámetros de uso de cookies

En la sección anterior, llevamos cookies en el parámetro de encabezados, o podemos usar parámetros de cookies especiales.

❖ 1. Parámetro formato de cookies: diccionario

cookies = "cookie 的 nombre": "cookie 的 valor"

➢ El diccionario corresponde a la cadena de Cookie en el encabezado de la solicitud, y cada par de pares clave-valor del diccionario está separado por un punto y coma y un espacio.

➢ El lado izquierdo del signo igual es el nombre de una cookie, que corresponde a la clave del diccionario de cookies

➢ El lado derecho del signo igual corresponde al valor del diccionario de cookies

❖ 2. Cómo usar los parámetros de las cookies

respuesta = solicitudes.get(url, cookies)

❖ 3. Convierta la cadena de cookies al diccionario necesario para el parámetro de cookies:

cookies_dict = { cookie . división ( '=' ) [ 0 ]: galleta . dividir ( '=' ) [- 1 ] para la cookie en

cookie_str. dividir ( '; ' ) }

❖ 4. Nota: Las cookies generalmente tienen un tiempo de caducidad y, una vez caducadas, es necesario volver a obtenerlas.

response = requests.get(url, cookies)
import requests
import re
url = ’https://www.zhihu.com/creator’
cookies_str = ’复制的cookies’
headers = {"user-agent": ’Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit
/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36’}
cookies_dict = {cookie.split(’=’, 1)[0]:cookie.split(’=’, 1)[-1] for cookie in
cookies_str.split(’; ’)}
# 请求头参数字典中携带cookie字符串
resp = requests.get(url, headers=headers, cookies=cookies_dict)
data = re.findall(’CreatorHomeAnalyticsDataItem-title.*?>(.*?)</div>’,resp.text)
print(resp.status_code)
print(data)

200

[ 'En python, ¿cómo escribir este método con diferentes ID pero la misma clase como integración? ' , 'Mis padres no tienen dinero para comprarme una computadora, ¿qué debo hacer? ' , ' Describa sus condiciones de vida actuales en una frase? ']

2.4.4 Construya el objeto RequestsCookieJar para establecer cookies

Aquí también podemos establecer cookies mediante la construcción del objeto RequestsCookieJar, el código de ejemplo es el siguiente:

import requests
import re
url = ’https://www.zhihu.com/creator’
cookies_str = ’复制的cookies’
headers = {"user-agent": ’Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit
/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36’}
jar = requests.cookies.RequestsCookieJar()
for cookie in cookies_str.split(’;’):
key,value = cookie.split(’=’,1)
jar. set(key,value)
# 请求头参数字典中携带cookie字符串
resp = requests.get(url, headers=headers, cookies=jar)
data = re.findall(’CreatorHomeAnalyticsDataItem-title.*?>(.*?)</div>’,resp.text)
print(resp.status_code)
print(data)

200

[ 'En python, ¿cómo escribir este método con diferentes ID pero la misma clase como integración? ' , 'Mis padres no tienen dinero para comprarme una computadora, ¿qué debo hacer? ' , ' Describa sus condiciones de vida actuales en una frase? ']

Aquí primero creamos un nuevo objeto RequestCookieJar, luego usamos el método split() para dividir las cookies copiadas, luego usamos el método set() para establecer la clave y el valor de cada cookie, y luego llamamos al método get() de solicitudes y pase Simplemente proporcione los parámetros de las cookies.

Por supuesto, debido a las propias limitaciones de Zhihu, el parámetro de encabezados también es indispensable, pero no es necesario configurar el campo de cookies en el parámetro de encabezados original. Después de la prueba, descubrí que también puedo iniciar sesión en Zhihu normalmente.

2.4.5 Método para convertir el objeto cookieJar en diccionario de cookies

El objeto de respuesta obtenido por las solicitudes tiene el atributo de cookies. El valor del atributo es un tipo cookieJar, que contiene la cookie local establecida por el otro servidor. ¿Cómo convertimos esto en un diccionario de cookies?

❖ 1. Método de conversión

cookies_dict = solicitudes.utils.dict_from_cookiejar(respuesta.cookies)

❖ 2. El objeto devuelto por response.cookies es del tipo cookieJar

❖ 3. La función request.utils.dict_from_cookiejar devuelve el diccionario de cookies

import requests
import re
url = 'https://www.zhihu.com/creator'
cookies_str = '复制的cookies'
headers = {"user-agent": 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit
/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36'}
cookie_dict = {cookie.split('=', 1)[0]:cookie.split('=', 1)[-1] for cookie in
cookies_str.split('; ')}
# 请求头参数字典中携带cookie字符串
resp = requests.get(url, headers=headers, cookies=cookies_dict)
data = re.findall('CreatorHomeAnalyticsDataItem-title.*?>(.*?)</div>',resp.text)
print(resp.status_code)
print(data)
# 可以把一个字典转化为一个requests.cookies.RequestsCookieJar对象
cookiejar = requests.utils.cookiejar_from_dict(cookie_dict, cookiejar=None,
overwrite=True)
type(cookiejar) # requests.cookies.RequestsCookieJar
type(resp.cookies) # requests.cookies.RequestsCookieJar
#构造RequestsCookieJar对象进行cookies设置其中jar的类型也是 requests.cookies.
RequestsCookieJar
#cookiejar转字典
requests.utils.dict_from_cookiejar(cookiejar)

2.5 Configuración del tiempo de espera

En el proceso de navegar por Internet, a menudo nos encontramos con fluctuaciones en la red, en este momento, una solicitud que ha estado esperando durante mucho tiempo aún puede no tener ningún resultado.

En el rastreador, si una solicitud no tiene resultados durante mucho tiempo, la eficiencia de todo el proyecto será muy baja. En este momento, debemos hacer cumplir la solicitud para que deba devolver el resultado dentro de un tiempo específico, de lo contrario, un se informará el error.

❖ 1. Cómo utilizar el parámetro timeout timeout

respuesta = solicitudes.get(url, tiempo de espera=3)

❖ 2. timeout=3 significa: después de enviar la solicitud, la respuesta se devolverá en 3 segundos; de lo contrario, se lanzará una excepción

url = 'http://www.tipdm.com/tipdm/index.html'

#Establecer el tiempo de espera en 2

imprimir ('el tiempo de espera es 2:', solicitudes. obtener (url, tiempo de espera = 2))

Si el tiempo de espera es demasiado corto, se informará un error

request.get(url,timeout = 0.1) #Nota: el tiempo es 0.001

El tiempo de espera es 2: <Respuesta [200]>

3. Use Request para enviar una solicitud POST

Pensando: ¿Dónde usamos las solicitudes POST?

1. Inicio de sesión y registro (desde el punto de vista de los ingenieros web, POST es más seguro que GET, y la contraseña de la cuenta del usuario y otra información no estarán expuestas en la dirección URL)

2. Cuando se necesita transmitir contenido de texto grande (las solicitudes POST no requieren longitud de datos)

Entonces, de la misma manera, nuestro rastreador también necesita volver para simular el navegador para enviar una solicitud de publicación en estos dos lugares. De hecho, enviar una solicitud POST es muy similar a un método GET, pero debemos definir los parámetros en los datos:

Descripción de los parámetros POST:

publicación (url, datos = Ninguno, json = Ninguno, **kwargs):

❖ URL: URL a solicitar

❖ datos: (opcional) diccionario, lista de tuplas, bytes u objeto similar a un archivo para enviar en el cuerpo de la Solicitud

❖ json: (opcional) datos JSON, enviados al cuerpo de la clase Request.

❖ **kwargs: argumentos de palabra clave de longitud variable

import requests
payload = {’key1’: ’value1’, ’key2’: ’value2’}
req = requests.post("http://httpbin.org/post", data=payload)
print(req.text)

3.1 POST envía datos JSON

Muchas veces, los datos que desea enviar no están codificados como un formulario, y se encuentra que este problema ocurre especialmente cuando se rastrean muchas URL de Java. Si pasa una cadena en lugar de un dictado, los datos se publicarán directamente. Podemos usar json.dumps() para convertir dict en formato str; aquí, además de codificar dict usted mismo, también puede usar parámetros json para pasar directamente, y luego se codificará automáticamente.

import json
import requests
url = ’http://httpbin.org/post’
payload = {’some’: ’data’}
req1 = requests.post(url, data=json.dumps(payload))
req2 = requests.post(url, json=payload)
print(req1.text)
print(req2.text)

Se puede encontrar que obtuvimos con éxito el resultado devuelto, en el que la parte del formulario son los datos enviados, lo que prueba que la solicitud POST se envió con éxito.

notas

El módulo de solicitudes envía solicitudes con datos, json y parámetros, tres métodos para transportar parámetros.

los parámetros se usan en las solicitudes de obtención, los datos y json se usan en las solicitudes de publicación.

Los parámetros que pueden recibir los datos son: diccionario, cadena, byte, objeto de archivo.

❖ Use parámetros json, sin importar si el mensaje es de tipo str o de tipo dict, si no especifica el tipo de contenido en los encabezados

Escriba, el valor predeterminado es: application/json.

❖ Use el parámetro de datos, el mensaje es un tipo de dictado, si no especifica el tipo de tipo de contenido en los encabezados, la aplicación predeterminada/x

www-form-urlencoded, que es equivalente al formulario enviado por el formulario ordinario, convertirá los datos del formulario en pares clave-valor. En este momento, los datos se pueden obtener de request.POST y el contenido de la solicitud. body es a=1&b= 2 en esta forma de par clave-valor.

❖ Use el parámetro de datos, el mensaje es de tipo str, si no especifica el tipo de tipo de contenido en los encabezados, el valor predeterminado es application/json.

Al enviar datos con el parámetro de datos, el contenido de request.body tiene la forma de a=1&b=2,

Al enviar datos con parámetros json, el contenido de request.body tiene la forma de '"a": 1, "b": 2'

3.2 Archivo de carga POST

Si queremos usar el rastreador para cargar archivos, podemos usar el parámetro fifile:

url = 'http://httpbin.org/post'
files = {'file': open('test.xlsx', 'rb')}
req = requests.post(url, files=files)
req.text

Si tiene un socio que está familiarizado con el desarrollo WEB, debe saber que si envía un archivo muy grande como una solicitud de datos de varias partes/formulario, es posible que desee convertir la solicitud en un flujo de datos. De forma predeterminada, las solicitudes no son compatibles, puede usar la biblioteca tripartita de solicitudes-cinturón de herramientas.

3.3 Rastrear páginas web mediante solicitudes POST

Principalmente para encontrar la página web a analizar.

import requests
# 准备翻译的数据
kw =
input("请输入要翻译的词语:")
ps = {"kw": kw}
# 准备伪造请求
headers = {
# User-Agent:首字母大写,表示请求的身份信息;一般直接使用浏览器的身份信息,伪造
爬虫请求
# 让浏览器认为这个请求是由浏览器发起的[隐藏爬虫的信息]
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (
KHTML, like Gecko) Chrome/85.0.4183.83 Safari/537.36 Edg/85.0.564.41"
}
# 发送POST请求,附带要翻译的表单数据--以字典的方式进行传递
response = requests.post("https://fanyi.baidu.com/sug", data=ps)
# 打印返回的数据
# print(response.content)
print(response.content.decode("unicode_escape"))

4.Solicitudes avanzadas (1)*Sesión mantenimiento de sesión

Esta parte presenta principalmente el mantenimiento de la sesión y el uso de IP proxy.

En las solicitudes, si usa directamente métodos como get() o post(), puede simular solicitudes de páginas web, pero en realidad es equivalente a una sesión diferente, es decir, usa dos navegadores para abrir páginas diferentes.

Imagine tal escenario, la primera solicitud usa el método post () para iniciar sesión en un sitio web determinado, y la segunda vez que desea obtener su información personal después de iniciar sesión correctamente, usa el método get () para solicitar la página de información personal de nuevo. De hecho, esto equivale a abrir dos navegadores. Son dos sesiones completamente independientes. ¿Se puede obtener información personal con éxito? Por supuesto que no.

 

Algunos amigos pueden haber dicho, ¿no debería ser suficiente para mí configurar las mismas cookies en dos solicitudes? Sí, pero es engorroso hacerlo y tenemos una solución más sencilla.

De hecho, la principal forma de solucionar este problema es mantener la misma sesión, lo que equivale a abrir una nueva pestaña del navegador en lugar de abrir un nuevo navegador. Pero no quiero configurar cookies cada vez, entonces, ¿qué debo hacer? En este momento, hay una nueva arma, el objeto Session.

Usándolo, podemos mantener fácilmente una sesión y no tenemos que preocuparnos por las cookies, lo manejará automáticamente por nosotros.

La clase Session en el módulo de solicitudes puede procesar automáticamente las cookies generadas durante el proceso de envío de solicitudes y obtención de respuestas, para lograr el propósito de conservación del estado. Luego venimos a aprenderlo.

4.1 El rol y los escenarios de aplicación de request.session

❖ El papel de las solicitudes.sesión

Manejar automáticamente las cookies, es decir, la próxima solicitud traerá la cookie anterior

❖ Escenarios de aplicación de solicitudes.sesión

Manejar automáticamente las cookies generadas durante múltiples solicitudes consecutivas

4.2 Cómo usar solicitudes.sesión

Después de que la instancia de sesión solicite un sitio web, la cookie local configurada por el otro servidor se guardará en la sesión, y la próxima vez que se use la sesión para solicitar el otro servidor, se traerá la cookie anterior.

sesión = solicitudes .sesión () # instanciar objeto de sesión

respuesta = sesión. obtener (url, encabezados, ...)

respuesta = sesión. publicación (url, datos, ...)

Los parámetros de la solicitud get o post enviada por el objeto de sesión son exactamente los mismos que los enviados por el módulo de solicitudes.

4.3 Usar sesión para mantener la información de inicio de sesión de github

❖ Capture todo el proceso de inicio de sesión de github y acceda a páginas a las que solo se puede acceder después de iniciar sesión

❖ Determine la dirección URL, el método de solicitud y los parámetros de solicitud requeridos de la solicitud de inicio de sesión

-Algunos parámetros de la solicitud están en el contenido de la respuesta correspondiente a otras URL, que se pueden obtener utilizando el módulo re

❖ Determine la dirección URL y el método de solicitud de la página a la que solo se puede acceder después de iniciar sesión

❖ Finalización de código mediante solicitudes.sesión

import requests
import re
# 构造请求头字典
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (
KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36',}
# 实例化session对象
session = requests.session()
# 访问登陆页获取登陆请求所需参数
response = session.get(https://github.com/login, headers=headers)
authenticity_token = re.search('name="authenticity_token" value="(.*?)" />',
response.text).group(1) # 使用正则获取登陆请求所需参数
# 构造登陆请求参数字典
data = {
'commit': 'Sign in', # 固定值
'utf8': ' ', # 固定值
'authenticity_token': authenticity_token, # 该参数在登陆页的响应内容中
'login':
input('输入github账号:'),
'password':
input('输入github账号:')}
# 发送登陆请求(无需关注本次请求的响应)
session.post(https://github.com/session, headers=headers, data=data)
# 打印需要登陆后才能访问的页面
response = session.get(https://github.com/settings/profile, headers=headers)
print(response.text)

¡Puede usar la herramienta de comparación de texto para corregir!

5.Solicitudes Avanzadas (2)*Uso de Proxy

Para algunos sitios web, el contenido se puede obtener normalmente después de solicitarlo varias veces durante la prueba. Pero una vez que comienza el rastreo a gran escala, para solicitudes frecuentes y a gran escala, el sitio web puede mostrar un código de verificación, o saltar a la página de autenticación de inicio de sesión, o incluso bloquear directamente la IP del cliente, lo que resulta en la inaccesibilidad durante un cierto período de tiempo. .

Bueno, para evitar que esto suceda, debemos configurar un proxy para resolver este problema, lo que requiere el uso del parámetro proxies. Se puede configurar de esta manera:

El parámetro proxy proxy especifica la IP del proxy, de modo que la IP del proxy correspondiente reenvía la solicitud que enviamos al servidor proxy, así que primero entendamos la IP del proxy y el servidor proxy.

5.1 El proceso de uso del agente

1. Proxy ip es una ip que apunta a un servidor proxy

2. El servidor proxy puede ayudarnos a reenviar la solicitud al servidor de destino

5.2 Proxy directo y proxy inverso

Como se mencionó anteriormente, la IP del proxy especificada por el parámetro proxy apunta al servidor proxy directo, por lo que hay un servidor inverso correspondiente; ahora comprendamos la diferencia entre el servidor proxy directo y el servidor proxy inverso.

❖ Distinguir entre proxy directo o inverso desde la perspectiva de la parte que envía la solicitud

❖ El reenvío de la solicitud para el navegador o el cliente (la parte que envía la solicitud) se denomina proxy de reenvío

- el navegador conoce la dirección IP real del servidor que finalmente maneja la solicitud, como una VPN

❖ No reenvía la solicitud para el navegador o el cliente (la parte que envía la solicitud), sino que reenvía la solicitud para el servidor que finalmente procesa la solicitud, lo que se denomina proxy inverso

- El navegador no conoce la dirección real del servidor, como nginx.

5.3 Clasificación de ip proxy (servidor proxy)

❖ Según el grado de anonimato de la IP del proxy, la IP del proxy se puede dividir en las siguientes tres categorías:

➢ Proxy transparente: aunque el proxy transparente puede "ocultar" directamente su dirección IP, aún puede averiguar quién es usted.

Los encabezados de solicitud recibidos por el servidor de destino son los siguientes:

REMOTE_ADDR = IP de proxy

HTTP_VIA = IP del proxy

HTTP_X_FORWARDED_FOR = Su IP

➢ Proxy anónimo (Anonymous Proxy): Con el proxy anónimo, los demás solo pueden saber que usas un proxy, pero no pueden saber quién eres.

Los encabezados de solicitud recibidos por el servidor de destino son los siguientes:

REMOTE_ADDR = IP del proxy

HTTP_VIA = IP del proxy

HTTP_X_FORWARDED_FOR = IP del proxy

➢ Proxy de alto anonimato (proxy de élite o proxy de alto anonimato): el proxy de alto anonimato hace que sea imposible que otros descubran que está utilizando un proxy, por lo que es la mejor opción. ** No hay duda de que usar un proxy de alto perfil funciona mejor**.

Los encabezados de solicitud recibidos por el servidor de destino son los siguientes:

REMOTE_ADDR = IP de proxy

HTTP_VIA = no determinado

HTTP_X_FORWARDED_FOR = no determinado

❖ Dependiendo del protocolo que utilice el sitio web, se requiere un servicio de proxy del protocolo correspondiente.

Los protocolos utilizados para atender solicitudes de proxies se pueden categorizar como:

➢ proxy http: la URL de destino es el protocolo http

➢ Proxy https: la URL de destino es el protocolo https

➢ proxy de túnel de calcetines (como proxy de socks5), etc.:

✾ 1. El proxy de calcetines simplemente transmite paquetes de datos, independientemente del protocolo de aplicación (FTP, HTTP, HTTPS, etc.).

✾ 2. El proxy de calcetines tarda menos tiempo que los proxies http y https.

✾ 3. El proxy de calcetines puede reenviar solicitudes http y https

5.4 Uso de parámetros proxy de proxy

Para que el servidor piense que no es el mismo cliente el que está solicitando; para evitar que se bloqueen las solicitudes frecuentes a un nombre de dominio, necesitamos usar proxy ip; luego aprenderemos el uso básico de cómo las solicitudes El módulo usa IP proxy.

response = requests . get ( url , proxies = proxies )
proxies 的形式:字典
proxies = {
" http ": " http :// 12.34.56.79: 9527 ",
" https ": " https :// 12.34.56.79: 9527 ",
}

Nota: si el diccionario de proxies contiene varios pares clave-valor, la IP del proxy correspondiente se seleccionará de acuerdo con el protocolo de la dirección URL al enviar la solicitud

import requests
proxies = {
"http": "http://124.236.111.11:80",
"https": "https:183.220.145.3:8080"}
req = requests.get(’http://www.baidu.com’,proxies =proxies)
req.status_code

6. Solicitudes avanzadas (3)*Verificación de certificado SSL

Además, las solicitudes también proporciona la función de verificación de certificados. Al enviar una solicitud HTTP, verificará el certificado SSL, podemos usar el parámetro de verificación para controlar si verificar este certificado. De hecho, si no se agrega el parámetro de verificación, el valor predeterminado es Verdadero y se verificará en la dinámica.

Ahora probemos con solicitudes:

import requests
url = 'https://cas.xijing.edu.cn/xjtyrz/login'
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit
/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36'}
req = requests.get(url,headers=headers)

SSLError: HTTPSConnectionPool(host= 'cas.xijing.edu.cn' , port=443): Max reintentos

excedido con url: /xjtyrz/login (Causado por SSLError(SSLCertVerificationError(1,

'[SSL: CERTIFICATE_VERIFY_FAILED] verificación de certificado fallida: no se pudo obtener

certificado de emisor local (_ssl.c:1123)' )))

Aquí se solicita un error de SSL, lo que indica que se trata de un error de verificación del certificado. Entonces, si se solicita un sitio HTTPS, pero el certificado verifica la página incorrecta, se informará dicho error, entonces, ¿cómo evitar este error? Muy simple, establezca el parámetro de verificación en False.

El código correspondiente es el siguiente:

import requests
url = 'https://www.jci.edu.cn/'
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit
/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36'}
req = requests.get(url,headers=headers,verify=False)
req.status_code

200

No puedo encontrar ninguna página web que requiera verificación SSL, ¡qué enfado!

Sin embargo, encontramos que se informó una advertencia y sugirió que le asignáramos un certificado. Podemos bloquear esta advertencia configurando ignorar advertencias:

import requests
from requests.packages import urllib3
urllib3.disable_warnings()
url = 'https://www.jci.edu.cn/'
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit
/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36'}
req = requests.get(url,headers=headers,verify=False)
req.status_code

200

O ignore las advertencias capturándolas en el registro:

import logging
import requests
logging.captureWarnings(True)
url = 'https://www.jci.edu.cn/'
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit
/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36'}
req = requests.get(url,headers=headers,verify=False)
req.status_code

200

Por supuesto, también podemos especificar un certificado local para usar como certificado de cliente, puede ser un solo archivo (que contiene la clave y el certificado) o una tupla que contiene dos rutas de archivo:

import requests
response = requests.get(https://www.12306.cn’,cert=(’./path/server.crt’,’/path/key
))
print(response.status_code)

200

Por supuesto, el código anterior es un ejemplo de demostración, necesitamos tener archivos crt y key, y especificar sus rutas. Tenga en cuenta que la clave del certificado privado local debe estar en estado descifrado y no se admite la clave en estado cifrado. ¡Hay muy pocas URL como esta ahora!

7. Otros contenidos de la biblioteca de Solicitudes

7.1 Ver el contenido de la respuesta

Después de enviar la solicitud, la respuesta se obtiene de forma natural. En el ejemplo anterior, usamos texto y contenido para obtener el contenido de la respuesta. Además, existen muchas propiedades y métodos que se pueden utilizar para obtener otra información, como códigos de estado, encabezados de respuesta, cookies, etc.

Los ejemplos son los siguientes:

import requests
url = 'https://www.baidu.com'
req = requests.get(url)
print(req.status_code)
# 响应状态码
print(req.text)
# 响应的文本内容
print(req.content)
# 响应的二进制内容
print(req.cookies)
# 响应的cookies
print(req.encoding)
# 响应的编码
print(req.headers)
# 响应的头部信息
print(req.url)
# 响应的网址
print(req.history)
# 响应的历史

7.2 Ver código de estado y codificación

Use la forma de rqg.status_code para ver el código de estado devuelto por el servidor y use la forma de rqg.encoding para codificar la página web a través de la información del encabezado HTTP devuelta por el servidor. Cabe señalar que cuando la biblioteca de solicitudes se equivoca, debe especificar manualmente el código de codificación para evitar caracteres ilegibles en el contenido de la página web devuelta.

7.3 Enviar una solicitud de obtención y especificar manualmente la codificación

Código 1-2: envíe una solicitud de obtención y especifique manualmente la codificación

url = 'http://www.tipdm.com/tipdm/index.html'
rqg = requests.get(url)
print('状态码 ',rqg.status_code)
print('编码 ',rqg.encoding)
rqg.encoding = 'utf-8' #手动指定编码
print('修改后的编码 ',rqg.encoding)
# print(rqg.text)

código de estado

200

codificación

ISO-8859-1

codificación modificada

utf-8

notas

El método de especificar manualmente no es flexible y no puede adaptarse a diferentes codificaciones de páginas web en el proceso de rastreo, pero el método de usar la biblioteca chardet es relativamente simple y flexible. La biblioteca chardet es un muy buen módulo de detección de codificación de cadenas/archivos

7.4 Uso de la biblioteca chardet

El método de detección de la biblioteca chartdet puede detectar la codificación de una cadena determinada y su sintaxis es la siguiente.

chartdet.detect(byte_str)

Parámetros comunes y descripciones del método de detección

byte_str: cadena de recepción. Una cadena que representa la codificación que se va a detectar. ningún valor predeterminado

7.5 Utilice el método de detección para detectar la codificación y especificar

Código 1-3: use el método de detección para detectar la codificación y especificar la codificación

import chardet
url = 'http://www.tipdm.com/tipdm/index.html'
rqg = requests.get(url)
print(rqg.encoding)
print(chardet.detect(rqg.content))
rqg.encoding = chardet.detect(rqg.content)['encoding']
# 访问字典元素
print(rqg.encoding)

ISO-8859-1

{ 'codificación': 'utf-8', 'confianza': 0.99, 'idioma': '' }

utf-8

7.6 Solicitudes de prueba completa de biblioteca

Envíe una solicitud GET completa al sitio web 'http://www.tipdm.com/tipdm/index.html', que incluye enlace, encabezado de solicitud, encabezado de respuesta, tiempo de espera y código de estado, y la codificación se establece correctamente.

Listado 1-6: Genera una solicitud HTTP completa.

# 导入相关的库
import requests
import chardet
# 设置url
url = 'http://www.tipdm.com/tipdm/index.html'
# 设置请求头
headers = {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit
/537.36 (KHTML, like Gecko) Chrome/78.0.3904.97 Safari/537.36"}
# 生成GET请求,并设置延时为2
rqg = requests.get(url,headers=headers,timeout = 2)
# 查看状态码
print("状态码 ",rqg.status_code)
# 检测编码(查看编码)
print('编码 ',rqg.encoding)
# 使用chardet库的detect方法修正编码
rqg.encoding = chardet.detect(rqg.content)['encoding']
# 检测修正后的编码
print('修正后的编码: ',rqg.encoding)
#查看响应头
print('响应头:',rqg.headers)
# 查看网页内容
#print(rqg.text)

código de estado

200

codificación

ISO-8859-1

Codificación corregida: utf-8

Encabezado de respuesta: { 'Fecha': 'Lunes, 18 de noviembre de 2019 06:28:56 GMT', 'Servidor': 'Apache-Coyote/1.1', '

Rangos de aceptación': 'bytes', 'ETag': 'W/"15693-1562553126764"', 'Última modificación': '

Lunes, 08 de julio de 2019 02:32:06 GMT' , 'Content-Type' : 'text/html' , 'Content-Length' : '

15693' , 'Keep-Alive' : 'timeout=5, max=100' , 'Connection' : 'Keep-Alive' }

Supongo que te gusta

Origin blog.csdn.net/y1282037271/article/details/129169619
Recomendado
Clasificación