Enlace Patrocinado
Esta publicación está destinada a personas que estén interesadas en conocer los patrones de diseño comunes, las trampas y las reglas relacionadas con el raspado web. Los ariticle presenta varios casos de uso y una colección de típicos problemas , como la forma de no ser detectados , dos y no hacer , y cómo aceleran (paralelización) el rascador.
Todo irá acompañado de fragmentos de pitón , para que pueda comenzar de inmediato. Este documento también pasará por varios paquetes útiles de Python.
Casos de uso
Hay muchas razones y casos de uso por los que desea raspar datos. Déjame enumerar algunos de ellos:
- raspe las páginas de un minorista electrónico para detectar si alguna de la ropa que desea comprar tiene descuento
- compare los precios de varias marcas de ropa raspando sus páginas
- El precio de los billetes de avión puede variar durante el día. Uno podría rastrear el sitio web de viajes y alarmarse una vez que bajó el precio
- analizar los sitios web de acción para responder a la pregunta si la oferta inicial debe ser baja o alta para atraer a más postores o si la subasta más larga se correlaciona con una oferta final más alta
Tutorial
Estructura del tutorial:
- Paquetes disponibles
- Codigo basico
- Trampas
- Normas
- Acelerar – paralelización
Antes que empecemos: Sé agradable con los servidores; NO desea bloquear un sitio web.
1. Paquetes y herramientas disponibles
No existe una solución universal para el raspado web porque la forma en que se almacenan los datos en cada sitio web suele ser específica de ese sitio. De hecho, si desea raspar los datos, debe comprender la estructura del sitio web y crear su propia solución o utilizar una solución altamente personalizable.
Sin embargo, no necesita reinventar la rueda: hay muchos paquetes que hacen el mayor trabajo por usted. Dependiendo de sus habilidades de programación y su caso de uso previsto, puede encontrar diferentes paquetes más o menos útiles.
1.1 Opción de inspección
La mayoría de las veces se encontrará inspeccionando el HTML del sitio web. Puede hacerlo fácilmente con una opción de “inspección” de su bowser.
Se llama a la sección del sitio web que contiene mi nombre, mi avatar y mi descripción
hero hero--profile u-flexTOP
(lo interesante que Medium llama a sus escritores ‘héroes’ :)). La clase <h1> que contiene mi nombre se llama ui-h2 hero-title
y la descripción está contenida dentro de la clase <p> ui-body hero-description
.1.2 Scrapy
Hay un marco de extracción de datos listo para usar llamado Scrapy . Además de extraer HTML, el paquete ofrece muchas funcionalidades como exportar datos en formatos, registros, etc. También es altamente personalizable: ejecuta diferentes arañas en diferentes procesos, deshabilita las cookies¹ y establece demoras de descarga². También se puede usar para extraer datos mediante API. Sin embargo, la curva de aprendizaje no es uniforme para los nuevos programadores: necesita leer tutoriales y ejemplos para comenzar.
¹ Algunos sitios usan cookies para identificar bots.
² El sitio web puede sobrecargarse debido a una gran cantidad de solicitudes de rastreo.
² El sitio web puede sobrecargarse debido a una gran cantidad de solicitudes de rastreo.
Para mi caso de uso, era demasiado ‘listo para usar’: solo quería extraer los enlaces de todas las páginas, acceder a cada enlace y extraer información de él.
1.3 BeautifulSoup con solicitudes
BeautifulSoup es una biblioteca que le permite analizar el código fuente HTML de una manera hermosa. Junto con él, necesita una biblioteca de Solicitud que recupere el contenido de la url. Sin embargo, debe ocuparse de todo lo demás, como el manejo de errores, cómo exportar datos, cómo paralelizar el raspador web, etc.
Elegí BeautifulSoup ya que me obligaría a descubrir muchas cosas que Scrapy maneja por sí solo, y con suerte me ayudará a aprender más rápido de mis errores.
2. Código básico
Es muy sencillo comenzar a raspar un sitio web. La mayoría de las veces se encontrará inspeccionando el HTML del sitio web para acceder a las clases e ID que necesita. Digamos que tenemos una siguiente estructura html y queremos extraer los
main_price
elementos. Nota: el discounted_price
elemento es opcional.<body>
<div id = "listing_prices">
<div class = "item">
<li class = "item_name"> Watch </li>
<div class = "main_price"> Precio: $ 66.68 </div>
<div class = "precio_descuento"> Precio con descuento: $ 46.68 </div>
</div>
<div class = "item">
<li class = "item_name"> Watch2 </li>
<div class = "main_price"> Precio: $ 56.68 < / div>
</div>
</div>
</body>
El código básico sería importar las bibliotecas, hacer la solicitud, analizar el html y luego encontrar el
class main_price
.
Puede suceder que
class main_price
esté presente en otra sección del sitio web. Para evitar la extracción innecesaria class main_price
de cualquier otra parte de la página web, podríamos haber abordado primero id listings_prices
y luego encontrar todos los elementos class main_price
.3. Errores
3.1 Comprobar robots.txt
Las reglas de raspado de los sitios web se pueden encontrar en el archivo robots.txt . Puede encontrarlo escribiendo robots.txt después del dominio principal, por ejemplo
www.website_to_scrape.com/robots.txt
. Estas reglas identifican qué partes de los sitios web no pueden extraerse automáticamente o con qué frecuencia un bot puede solicitar una página. A la mayoría de las personas no les importa, pero trata de ser respetuoso y al menos mira las reglas incluso si no planeas seguirlas.3.2 HTML puede ser malo
Las etiquetas HTML pueden contener id, clase o ambas. La identificación HTML especifica una identificación única y la clase HTML no es única. Los cambios en el nombre o elemento de la clase podrían romper su código o entregar resultados incorrectos.
Hay dos formas de evitarlo o al menos ser alertado al respecto:
- Uso específico en
id
lugar declass
dado que es menos probable que se cambie - Compruebe si el elemento vuelve
None
Sin embargo, debido a que algunos campos pueden ser opcionales (como
discounted_price
en nuestro ejemplo HTML), los elementos correspondientes no aparecerían en cada listado. En este caso, puede contar el porcentaje de cuántas veces este elemento específico devolvió Ninguno al número de listados. Si es 100%, es posible que desee verificar si se cambió el nombre del elemento.3.3 Spoofing de agente de usuario
Cada vez que visita un sitio web, obtiene la información de su navegador a través de un agente de usuario . Algunos sitios web no le mostrarán ningún contenido a menos que proporcione un agente de usuario. Además, algunos sitios ofrecen contenido diferente a diferentes navegadores. Los sitios web no quieren bloquear usuarios genuinos, pero parecería sospechoso si envía 200 solicitudes / segundo con el mismo agente de usuario. Una salida podría ser generar (casi) un agente de usuario aleatorio o establecer uno usted mismo.
3.4 Solicitud de tiempo de espera
Por defecto, Solicitud seguirá esperando una respuesta indefinidamente. Por lo tanto, se recomienda establecer el parámetro de tiempo de espera.
3.5 ¿Me bloquearon?
La aparición frecuente de los códigos de estado como 404 (No encontrado), 403 (Prohibido), 408 (Tiempo de espera de solicitud) puede indicar que se bloqueó. Es posible que desee verificar esos códigos de error y proceder en consecuencia.
Además, esté preparado para manejar excepciones de la solicitud.
Además, esté preparado para manejar excepciones de la solicitud.
3.6 Rotación de IP
Incluso si aleatoriza su agente de usuario, todas sus solicitudes serán de la misma dirección IP. Eso no suena anormal porque las bibliotecas, las universidades y también las empresas tienen solo unas pocas direcciones IP. Sin embargo, si hay muchas solicitudes que provienen de una sola dirección IP, un servidor puede detectarlo.
El uso de servidores proxy compartidos , VPN o TOR puede ayudarlo a convertirse en un fantasma;).
El uso de servidores proxy compartidos , VPN o TOR puede ayudarlo a convertirse en un fantasma;).
Al usar un proxy compartido, el sitio web verá la dirección IP del servidor proxy y no la suya. Una VPN lo conecta a otra red y la dirección IP del proveedor de VPN se enviará al sitio web.
3.7 Honeypots
Estos pueden ser enlaces ‘ocultos’ que no son visibles para los usuarios pero que pueden ser extraídos por los raspadores / arañas. Dichos enlaces tendrán un estilo CSS establecido
display:none
, pueden combinarse con el color del fondo o incluso moverse fuera del área visible de la página. Una vez que su rastreador visita dicho enlace, su dirección IP puede marcarse para una mayor investigación, o incluso bloquearse al instante.Otra forma de detectar rastreadores es agregar enlaces con árboles de directorios infinitamente profundos. Entonces uno necesitaría limitar el número de páginas recuperadas o limitar la profundidad transversal.
4. Qué hacer y qué no hacer
- Antes de raspar, verifique si hay una API pública disponible. Las API públicas proporcionan una recuperación de datos más fácil y rápida (y legal) que el raspado web. Consulte la API de Twitter que proporciona API para diferentes propósitos.
- En caso de que raspe una gran cantidad de datos, puede considerar usar una base de datos para poder analizarla o recuperarla rápidamente. Siga este tutorial sobre cómo crear una base de datos local con python.
- Ser cortés. Como sugiere esta respuesta , se recomienda que las personas sepan que está raspando su sitio web para que puedan responder mejor a los problemas que podría causar su bot.
Nuevamente, no sobrecargue el sitio web enviando cientos de solicitudes por segundo.
5. Acelerar – paralelización
Si decide paralelizar su programa, tenga cuidado con su implementación para no bloquear el servidor. Y asegúrese de leer la sección Qué hacer y qué no hacer . Consulte las definiciones de paralelización frente a concurrencia, procesadores e hilos aquí y aquí .
Si extrae una gran cantidad de información de la página y realiza un preprocesamiento de los datos durante el raspado, el número de solicitudes por segundo que envía a la página puede ser relativamente bajo.
Para mi otro proyecto en el que eliminé los precios de alquiler de apartamentos, realicé un preprocesamiento pesado de los datos mientras los eliminaba, lo que resultó en 1 solicitud / segundo. Para raspar anuncios 4K, mi programa se ejecutará durante aproximadamente una hora.
Para enviar solicitudes en paralelo, es posible que desee utilizar un paquete de multiprocesamiento .
Digamos que tenemos 100 páginas y queremos asignar a cada procesador la misma cantidad de páginas para trabajar. Si
n
es el número de CPU, puede dividir uniformemente todas las páginas en los n
contenedores y asignar cada bin a un procesador. Cada proceso tendrá su propio nombre, función de destino y argumentos para trabajar. El nombre del proceso se puede usar después para permitir la escritura de datos en un archivo específico.Asigné 1K páginas a cada una de mis 4 CPU que produjeron 4 solicitudes / segundo y redujeron el tiempo de raspado a alrededor de 17 minutos.