Crawler desde la entrada hasta la cárcel (5): rastreador de subprocesos múltiples y algoritmos de búsqueda comunes

El contenido del artículo es de "desarrollo del rastreador de Python"

5.1 Rastreador de subprocesos múltiples

5.1.1 Ventajas de los subprocesos múltiples

Después de dominar las solicitudes y las expresiones regulares, puede comenzar a rastrear algunas URL simples en la práctica.
Sin embargo, el rastreador en este momento solo tiene un proceso y un subproceso, por lo que se denomina rastreador de un solo subproceso . Un rastreador de un solo subproceso solo visita una página a la vez y no puede utilizar completamente el ancho de banda de la red de la computadora. Una página tiene solo unos pocos cientos de KB como máximo, por lo que cuando un rastreador rastrea una página, se desperdicia la velocidad adicional de la red y el tiempo entre el inicio de la solicitud y la obtención del código fuente. Si el rastreador puede acceder a 10 páginas al mismo tiempo, es equivalente a 10 veces la velocidad de rastreo. Para lograr este propósito, es necesario utilizar tecnología de subprocesos múltiples.

El lenguaje Python tiene un bloqueo de intérprete global (GIL). Esto lleva al hecho de que los subprocesos múltiples de Python son pseudo-subprocesos múltiples, es decir, es esencialmente un subproceso, pero este subproceso solo hace cada cosa durante unos pocos milisegundos, guarda la escena después de unos pocos milisegundos y hace otras cosas. después de unos pocos milisegundos, y luego hace otras cosas después de unos pocos milisegundos. Después de una ronda, vuelve a lo primero, restaura la escena y haz unos pocos milisegundos más, y continúa cambiando... Un solo hilo en el nivel micro es como hacer varias cosas al mismo tiempo a nivel macro. Este mecanismo tiene poco efecto en las operaciones intensivas de E/S (Entrada/Salida, entrada/salida), pero en las operaciones intensivas de la CPU, dado que solo se puede usar un núcleo de la CPU, tendrá un impacto muy negativo en el rendimiento. gran impacto. Por lo tanto, cuando se trata de programas computacionalmente intensivos, es necesario utilizar múltiples procesos.Los múltiples procesos de Python no se ven afectados por la GIL. Los rastreadores son programas intensivos en E/S, por lo que el uso de subprocesos múltiples puede mejorar en gran medida la eficiencia del rastreo.

5.1.2 Biblioteca de multiprocesamiento: multiprocesamiento

el multiprocesamiento en sí mismo es la biblioteca de multiprocesamiento de Python para manejar operaciones relacionadas con el multiprocesamiento. Sin embargo, dado que los procesos y los procesos no pueden compartir directamente la memoria y los recursos de pila, y la sobrecarga de iniciar un nuevo proceso es mucho mayor que la de los subprocesos, el uso de subprocesos múltiples para rastrear tiene más ventajas que el uso de procesos múltiples.

Hay un módulo ficticio bajo multiprocesamiento, que permite que los subprocesos de Python utilicen varios métodos de multiprocesamiento.
Hay una clase Pool debajo de dummy, que se usa para implementar el grupo de subprocesos.
Este grupo de subprocesos tiene un método map() que permite que todos los subprocesos del grupo de subprocesos ejecuten una función "simultáneamente".

Por ejemplo:
después de aprender sobre el ciclo for

for i in range(10):
	print(i*i)

Por supuesto, esta forma de escribir puede obtener el resultado, pero el código se calcula uno por uno y la eficiencia no es alta. Y si usa tecnología de subprocesos múltiples, deje que el código calcule el cuadrado de muchos números al mismo tiempo, necesita usar multiprocessing.dummy para lograr:

Ejemplo de uso de subprocesos múltiples:

from multiprocessing.dummy import Pool
def cal_pow(num):
    return num*num
pool=Pool(3)
num=[x for x in range(10)]
result=pool.map(cal_pow,num)
print('{}'.format(result))

En el código anterior, primero se define una función para calcular el cuadrado y luego se inicializa un grupo de subprocesos con 3 subprocesos. Estos tres hilos son los encargados de calcular el cuadrado de los números 10. El que primero termine de calcular el número que tiene en la mano tomará el siguiente número y continuará el cálculo hasta calcular todos los números.

En este ejemplo, el método map() del grupo de subprocesos toma dos parámetros, el primer parámetro es el nombre de la función y el segundo parámetro es una lista. Nota: El primer parámetro es solo el nombre de la función y no puede estar entre paréntesis . El segundo parámetro es un objeto iterable, y cada elemento del objeto iterable será recibido como parámetro por la función clac_power2(). Además de las listas, se pueden usar tuplas, conjuntos o diccionarios como segundo argumento para map().

5.1.3 Desarrollo de rastreadores de subprocesos múltiples

Dado que el rastreador es una operación intensiva de E/S, especialmente cuando se solicita el código fuente de una página web, si se utiliza un solo subproceso para el desarrollo, se perderá mucho tiempo esperando que vuelva la página web, por lo que aplicar subprocesos múltiples La tecnología para el rastreador puede mejorar en gran medida la eficiencia del rastreador. Como ejemplo. Se necesitan 50 minutos para que la lavadora lave la ropa, 15 minutos para que la tetera hierva el agua y 1 hora para memorizar palabras. Si espera a que la lavadora lave la ropa primero, luego hierve el agua después de lavar la ropa y luego recita las palabras después de hervir el agua, tomará un total de 125 minutos.

Pero si lo miras de otra manera, desde una perspectiva holística, 3 cosas pueden funcionar al mismo tiempo. Supongamos que de repente te divides en otras dos personas, una de ellas es responsable de poner la ropa en la lavadora y esperar a que la lavadora para terminar, y el otro es responsable de quemar el agua y esperar a que el agua hierva, y solo necesitas memorizar las palabras tú mismo. Cuando el agua hierve, el clon responsable de hervir el agua desaparece primero. Cuando la lavadora termina de lavar la ropa, el clon responsable de la colada desaparece. Finalmente, has memorizado las palabras por ti mismo. Solo toma 60 minutos completar 3 cosas al mismo tiempo.

Por supuesto, seguramente encontrará que el ejemplo anterior no es la situación real en la vida. En realidad, nadie será separado. La situación en la vida real es que cuando las personas recitan palabras, se concentran en memorizar palabras, cuando se hierve el agua, la tetera emitirá un pitido para recordar; Por lo tanto, es bueno realizar la acción correspondiente cuando se le recuerda, no es necesario verificar cada minuto. Las dos diferencias anteriores son en realidad las diferencias entre los modelos asincrónicos basados ​​en eventos y subprocesos múltiples. Esta sección trata sobre las operaciones de subprocesos múltiples, y más adelante hablaremos sobre los marcos de trabajo del rastreador que usan operaciones asincrónicas. Ahora solo recuerde que cuando la cantidad de acciones a operar no es grande, no hay diferencia en el rendimiento entre los dos métodos, pero una vez que la cantidad de acciones aumenta considerablemente, la mejora de la eficiencia de subprocesos múltiples disminuirá, incluso peor que solo -enhebrado. Y en ese momento, solo la operación asíncrona es la solución al problema.

Los siguientes dos fragmentos de código se utilizan para comparar las diferencias de rendimiento entre el rastreador de subproceso único y el rastreador de subprocesos múltiples para rastrear la página de inicio de bd: Por favor agregue la descripción de la imagen
A partir de los resultados de la ejecución, podemos ver que un subproceso tarda aproximadamente 16,2 s, cinco subprocesos tardan aproximadamente 3,5 s, y el tiempo es cinco veces el de un solo subproceso, aproximadamente un tercio. Desde ese momento, también puede ver el efecto de 5 subprocesos "ejecutándose al mismo tiempo". Pero eso no significa que cuanto mayor sea la configuración del grupo de subprocesos, mejor. También se puede ver a partir de los resultados anteriores que el tiempo de ejecución de 5 subprocesos es en realidad un poco más de una quinta parte del tiempo de ejecución de un subproceso. Este punto extra es en realidad el momento de cambiar de hilo. Esto también refleja desde el lado que el subprocesamiento múltiple de Python sigue siendo microscópicamente en serie. Por lo tanto, si el grupo de subprocesos se establece demasiado grande, la sobrecarga causada por el cambio de subprocesos puede cancelar las ganancias de rendimiento de los subprocesos múltiples. El tamaño del grupo de subprocesos debe determinarse de acuerdo con la situación real y no hay datos exactos. Los lectores pueden establecer diferentes tamaños para probar y comparar en escenarios de aplicaciones específicas para encontrar los datos más adecuados.

5.2 Algoritmos de búsqueda comunes para rastreadores

5.2.1 Búsqueda en profundidad

La clasificación de cursos de un sitio web de educación en línea debe rastrear la información del curso anterior. A partir de la página de inicio, el curso tiene varias categorías principales, como Python, Node.js y Golang según el idioma. Hay muchos cursos en cada categoría principal, como rastreador, Django y aprendizaje automático en Python. Cada curso se divide en muchas horas.

En el caso de la búsqueda en profundidad, la ruta de rastreo se muestra en la figura (número de serie de menor a mayor)
Por favor agregue la descripción de la imagen

5.2.2 Búsqueda en amplitud

La secuencia es la siguiente
Por favor agregue la descripción de la imagen

5.2.3 Selección de algoritmo

Por ejemplo, para rastrear toda la información del restaurante y la información de pedido de cada restaurante en un sitio web. Suponiendo que se utiliza el algoritmo de profundidad primero, primero se rastrea al restaurante A desde un enlace determinado y luego se rastrea inmediatamente la información del pedido del restaurante A. Dado que hay cientos de miles de restaurantes en todo el país, puede llevar 12 horas subirlos a todos. El problema que esto genera es que el volumen de pedidos del restaurante A puede aumentar a las 8 am, mientras que el volumen de pedidos del restaurante B aumenta a las 8 pm. Su volumen de pedidos tiene un retraso de 12 horas. Y para los restaurantes populares, 12 horas tienen el potencial de marcar una diferencia de millones. De esta forma, al hacer el análisis de datos, la diferencia horaria de 12 horas dificultará la comparación del desempeño de ventas de los dos restaurantes A y B. El número de restaurantes ha cambiado mucho menos en relación con el tamaño del pedido. Por lo tanto, si usa la búsqueda primero en amplitud, primero rastree todos los restaurantes desde las 0:00 de la noche hasta las 12:00 del día siguiente y luego concéntrese en rastrear el volumen de pedidos de cada restaurante desde las 14:00 hasta las 20:00 del día siguiente. día. De esta manera, la tarea de rastreo de pedidos se completó en solo 6 horas y se redujo la diferencia en el volumen de pedidos causada por la diferencia horaria. Al mismo tiempo, dado que la tienda lo obtiene cada pocos días, tiene poco impacto, por lo que la cantidad de solicitudes también se reduce, lo que dificulta que el sitio web descubra a los rastreadores.

Para otro ejemplo, para analizar la opinión pública en tiempo real, debe rastrear Baidu Tieba. Un Tieba popular puede tener decenas de miles de páginas de publicaciones, suponiendo que las primeras publicaciones se remontan a 2010. Si se adopta la búsqueda primero en amplitud, primero se obtienen los títulos y las URL de todas las publicaciones en esta barra de publicaciones, y luego se ingresa cada publicación de acuerdo con estas URL para obtener la información de cada piso. Sin embargo, dado que se trata de una opinión pública en tiempo real, la publicación de hace 7 años tiene poca importancia para el análisis actual, y lo más importante debería ser la nueva publicación, por lo que el nuevo contenido debe captarse primero. En comparación con el contenido anterior, el contenido en tiempo real es el más importante. Por lo tanto, para el rastreo del contenido de la barra de publicaciones, se debe utilizar la búsqueda en profundidad. Cuando vea una publicación, ingrese rápidamente, rastree su información en cada piso y suba a la siguiente publicación después de que se haya escalado una publicación. Por supuesto, estos dos algoritmos de búsqueda no son uno u otro, y deben seleccionarse de manera flexible de acuerdo con la situación real, y pueden usarse al mismo tiempo en muchos casos.

Supongo que te gusta

Origin blog.csdn.net/weixin_55159605/article/details/124147908
Recomendado
Clasificación