Marco de trabajo del rastreador web de Python: tecnologías comunes para los rastreadores web


I. Introducción

  • Página personal : ζ Xiaocaiji
  • Hola a todos, soy un novato, aprendamos el marco de trabajo de rastreo web de Python, una tecnología común de los rastreadores web.
  • Si el artículo es útil para usted, bienvenido a seguir, dar me gusta y marcar (un clic en tres enlaces)

2. Solicitud de red de Python

   Dirección URL y descarga de páginas web, estas dos son funciones necesarias y críticas de los rastreadores web Cuando se trata de estas dos funciones, deben ser inseparables de tratar con HTTP. Este artículo presentará tres formas comunes de implementar solicitudes de red HTTP en Python: urllib, urllib3 y solicitudes.

1. módulo urllib

   urllib es un módulo incorporado de python, que proporciona un método urlopen(), a través del cual se especifica una URL para enviar una solicitud de red para obtener datos. urllib proporciona múltiples submódulos, y los nombres y significados de los módulos específicos se muestran en la siguiente tabla:

Nombre del módulo describir
urllib.request Este módulo define métodos y clases para abrir URLs (principalmente HTTP), por ejemplo, autenticación, redirección, cookies, etc.
urllib.error Este módulo incluye principalmente clases de excepción, la clase de excepción básica URLError.
urllib.parse La funcionalidad definida por este módulo se divide en dos amplias categorías: análisis de URL y referencia de URL.
urllib.robotparser Este módulo se utiliza para analizar archivos robots.txt.

   Un ejemplo simple de enviar una solicitud y leer el contenido de la página web a través del módulo urlli b.request es el siguiente:

import urllib.request  # 导入该模块

# 打开指定需要爬取的网页
response = urllib.request.urlopen("http://www.baidu.com")
html = response.read()  # 读取网页代码
print(html)  # 打印读取内容

   En el ejemplo anterior, el contenido de la página web de Baidu se obtiene a través de una solicitud de obtención. A continuación se utiliza la solicitud post del módulo urlli b.request para obtener el contenido de la información de la página web, el ejemplo es el siguiente:

import urllib.request
import urllib.parse

# 将数据使用urlencode编码处理后,再使用encoding设置为utf-8编码
data = bytes(urllib.parse.urlencode({
    
    "word": "holle"}), encoding="utf8")

# 打开指定需要爬取的网页
response = urllib.request.urlopen("http://httpbin.org/post", data=data)

html = response.read()  # 读取网页代码
print(html)  # 打印读取内容

Descripción: aquí hay una demostración a través del sitio web http://httpbin.org/post , que se puede usar como un sitio para practicar el uso del módulo urllib y puede simular varias operaciones de solicitud.


2. módulo urllib3

   urllib3 es una biblioteca de Python potente y bien organizada para clientes HTTP Muchos sistemas nativos de Python han comenzado a usar urllib3. urllib3 proporciona muchas características importantes que no se encuentran en la biblioteca estándar de Python:

  • seguridad del hilo
  • grupo de conexiones
  • Verificación SSL/TLS del cliente
  • Subir archivos usando codificación multiparte
  • Asistentes para reintentar solicitudes y manejar redireccionamientos HTTP
  • Admite la codificación gzip y deflate
  • Admite proxy HTTP y SOCKS
  • 100% de cobertura de prueba

   El código de muestra para enviar solicitudes de red a través del módulo urllib3 es el siguiente:

import urllib3

# 创建PoolManager对象,用于处理与线程池的连接以及线程安全的所有细节
http = urllib3.PoolManager()

# 对需要爬取的网页发送请求
response = http.request("GET", "https://www.baidu.com/")
print(response.data)  # 打印读取内容

   La solicitud de correo realiza la obtención de la información del contenido de la página web, el código clave es el siguiente:

 对需要爬取的网页发送请求
response = http.request("POST",
                        "http://httpbin.org/post"
                        , fields={
    
    "word": "hello"})

Nota: Antes de usar el módulo urllib3, debe instalar el módulo a través del código "pip install urllib3" en python.


3.módulo de solicitudes

   Requests es una forma de implementar solicitudes HTTP en Python. Requests es un módulo de terceros. Este módulo es mucho más simple que el módulo urllib al implementar solicitudes HTTP, y la operación es más fácil de usar. Al usar el módulo de solicitudes, debe ejecutar el código de solicitudes de instalación de pip para instalar el módulo. Las características de las solicitudes son las siguientes:

  • Grupo de conexiones y mantenimiento de vida
  • URL y nombres de dominio internacionalizados
  • Sesiones con cookies persistentes
  • Autenticación SSL estilo 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)
  • Carga de archivos en fragmentos
  • descarga de corriente
  • Tiempo de conexión agotado
  • solicitud fragmentada
  • soporte.netrc

   Tomando el método de solicitud GET como ejemplo, el código de muestra para imprimir información de varias solicitudes es el siguiente:

mport requests

response = requests.get("http://www.baidu.com")

print(response.status_code)  # 打印状态码
print(response.url)  # 打印请求url
print(response.headers)  # 打印头部信息
print(response.cookies)  # 打印cookies信息
print(response.text)  # 以文本形似打印网页源码
print(response.content)  # 以字节流的形式打印网页源码

   El código de muestra para enviar una solicitud de red HTTP en forma de solicitud POST es el siguiente:

import requests

data = {"word": "holle"}  # 表单参数

# 对需求爬取的网页发送请求
response = requests.post("http://httpbin.org/post", data=data)

print(response.content)  # 以字节流的形式打印网页源码

   Si se encuentra que el parámetro en la dirección URL de la solicitud va seguido de ? (signo de interrogación), por ejemplo, httpbin.org/get?key=val. El módulo Solicitudes proporciona métodos para pasar parámetros, lo que permite el uso del argumento de palabra clave params para proporcionar estos parámetros como un diccionario. Por ejemplo, si desea pasar "clave1=valor1" y "clave2=valor2" a "httpbin.org/get", puede usar el siguiente código:

import requests

payload = {"key1": "value1", "key2": "value2"}  # 传递的参数

# 对需要爬取的网页发情请求
response = requests.get("http://httpbin.org/get", params=payload)

print(response.content)  # 以字节流的形似打印网页源码


3. Procesamiento de encabezados de solicitudes

   A veces, al solicitar el contenido de una página web, se encuentra que no importa a través de GET o POST u otros métodos de solicitud, se producirá un error 403. Este fenómeno se debe principalmente a que el servidor rechaza su acceso, lo que se debe a la configuración anti-rastreador utilizada por estas páginas web para evitar la recopilación maliciosa de información. En este momento, puede acceder simulando la información del encabezado del navegador, lo que puede resolver el problema anterior de la configuración anti-rastreo. A continuación, se utiliza el módulo de solicitudes como ejemplo para presentar el procesamiento de encabezados de solicitud. Los pasos específicos son los siguientes:

   (1) Para ver la información del encabezado a través del monitor de red del navegador, primero abra la dirección de la página web correspondiente a través de Google Chrome, luego abra el monitor de red con la tecla de acceso directo <Ctrl+Shift+I>, actualice la página actual y el monitor de red mostrará los cambios de datos como se muestra en la figura a continuación.

inserte la descripción de la imagen aquí


   (2) Seleccione el primer mensaje, la información del encabezado de la solicitud se mostrará en el panel de encabezado de información a la derecha y luego copie la información, como se muestra en la siguiente figura:

inserte la descripción de la imagen aquí


   (3) Para implementar el código, primero cree una dirección URL que deba rastrearse, luego cree la información del encabezado, luego envíe la solicitud y espere la respuesta, y finalmente imprima la información del código de la página web. El código de implementación es el siguiente:

import requests

url = "https://www.baidu.com/"  # 创建需要爬取的网页地址

# 创建头部信息,根据当前浏览器版本进行复制即可

headers = {"User-Agent":"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36"}

response = requests.get(url, headers=headers) # 发起网络请求

print(response.content) # 以字节流形式打印网页源码

4. Tiempo de espera de red

  Al acceder a una página web, si la página web no responde durante mucho tiempo, el sistema considerará que se ha agotado el tiempo de espera de la página web, por lo que no se puede abrir. El siguiente código se utiliza para simular un fenómeno de tiempo de espera de red, el código es el siguiente:

mport requests

# 循环发送请求50次

for a in range(1, 50):
    try:
        # 设置超时为0.5秒
        response = requests.get("https://www.baidu.com/", timeout=0.5)
        print(response.status_code)  # 打印状态码

    except Exception as e:
        print("异常" + str(e))  # 打印异常信息

  El resultado de la impresión se muestra en la siguiente figura:

inserte la descripción de la imagen aquí

Explicación: en el código anterior, se simulan 50 solicitudes cíclicas y el tiempo de espera se establece en 0,5 segundos, por lo que si el servidor no responde en 0,5 segundos, se considerará un tiempo de espera y la información de tiempo de espera se imprimirá en la consola. De acuerdo con los resultados de la prueba de simulación anterior, se puede confirmar que se establecen diferentes valores de tiempo de espera en diferentes situaciones.

  Hablando de información de excepción, el módulo de solicitudes también proporciona tres clases de excepción comunes, el código de muestra es el siguiente:

import requests

# 导入requests.exceptions中的三个异常类

from requests.exceptions import ReadTimeout, HTTPError, RequestException

for a in range(1, 50):
    try:
        # 设置超时为0.5秒
        response = requests.get("https://www.baidu.com/", timeout=0.5)
        print(response.status_code)  # 打印状态码
    except ReadTimeout:  # 超时异常
        print("timeout")
    except HTTPError:  # HTTP异常
        print("httperror")
    except RequestException:  # 请求异常
        print("reqerror")

5. Servicio de agencia

  En el proceso de rastreo de páginas web, a menudo sucede que las páginas web que podrían rastrearse no hace mucho tiempo no pueden rastrearse ahora, porque su IP está bloqueada por el servidor del sitio web anti-rastreo. En este momento, el servicio de proxy puede resolver este problema por usted. Al configurar el proxy, primero debe encontrar la dirección del proxy, por ejemplo, "122.114.43.113", el número de puerto correspondiente es "808", y el formato completo es "122.114.43.113:808". El código de ejemplo es el siguiente:

import requests

proxy = {"http": "122.114.43.113:808", "https": "122.114.43.113:808"}  # 设置代理IP和对于端口号

# 对需要爬取的网页进行请求
response = requests.get("https://www.baidu.com/", proxies=proxy)

print(response.content)  # 以字节流形式打印网页源码

Nota: Dado que la IP del proxy en el ejemplo es gratuita, el tiempo de uso no es fijo y la dirección no será válida si se excede el tiempo de uso. Cuando la dirección no es válida o la dirección es incorrecta, el panel de control mostrará el mensaje de error como se muestra en la siguiente figura:

inserte la descripción de la imagen aquí


6. BeautifulSoup para análisis HTML

  BeautifulSoup es una biblioteca de Python para extraer datos de archivos HTML y XML. BeautifulSoup proporciona algunas funciones simples para manejar la navegación, la búsqueda, la modificación del árbol de análisis y más. La extracción de búsqueda en el módulo BeautifulSoup es muy poderosa y muy conveniente, ahorrando horas o días a los programadores.

1. Instalación de BeautifulSoup

  Descargue el código fuente de BeatifulSoup en https://www.crummy.com/software/BeautifulSoup/bs4/download/, ingrese cmd, ingrese la ruta de almacenamiento de BeatifulSoup4-4.8.0 e ingrese el comando de instalación Python steup.py.

inserte la descripción de la imagen aquí

inserte la descripción de la imagen aquí


2. El uso de BeatifulSoup

  Después de instalar BeatifulSoup, a continuación se presentará cómo analizar HTML a través de BeatifulSoup. Los pasos específicos son los siguientes:

  (1) Importe la biblioteca bs4 y luego cree una cadena que simule el código HTML, el código es el siguiente:

from bs4 import BeautifulSoup      #导入BeatifulSoup 库


#创建模拟HTML代码的字符串

html_doc = """
<html><head><title>The Dotmouse's story</title></head>
<body>
<p class="title"><b>The Dotmouse's story</b></p>
<p class="story">Once upon a time there were three little sisiter ;and therinames were
<a href ="http ://example.com/elsie" class ="sister" id ="link1">Elsie</a>,
<a href ="http ://example.com/lacie" class ="sister" id ="link2">Lasie</a> and
<a href ="http ://example.com/tillie" class ="sister" id ="link3">Tillie</a>;
and they lived at the bottom of a well. </p>

<p class ="story">...</p>

"""


  (2) Cree un objeto beautifulSoup, especifique el analizador como lxml y finalmente muestre el código HTML del analizador en la consola imprimiéndolo, el código es el siguiente:

import lxml

#创建一个BeatifulSoup对象,获取页面正文
soup = BeautifulSoup(html_doc,features="lxml")
print(soup)         #打印解析的HTML代码

  El resultado de la ejecución se muestra en la siguiente figura:

inserte la descripción de la imagen aquí


Nota: si el código en la cadena html_doc se guarda en el archivo index.html, el código se puede analizar abriendo el archivo HTML y el código se puede formatear con el método prettify() El código es el siguiente:

# 创建一个BeatifulSoup对象打开需要解析的html文件
soup = BeautifulSoup(open("index.html"), "lxml")

print(soup.prettify())  # 打印格式化后的代码

  Este es el final del marco de rastreo web de Python: la introducción de tecnologías comunes de rastreadores web. Gracias por leer. Si el artículo es útil para usted, preste atención, haga clic en Me gusta y marque como favorito (enlace triple con un clic )


Supongo que te gusta

Origin blog.csdn.net/weixin_45191386/article/details/131484413
Recomendado
Clasificación