Scrape de sitios estáticos y dinámicos con Python y ProxyScrape API

Guías, Python, Las diferencias, Mayo-02-20245 minutos de lectura

En un mundo cada vez más dependiente de los datos, la capacidad de recopilar y analizar grandes cantidades de información puede dar a las empresas y a los profesionales una importante ventaja competitiva. El web scraping, el proceso de extracción de datos de sitios web, es una poderosa herramienta en el arsenal de los analistas de datos, desarrolladores web, vendedores digitales y programadores de Python. Esta guía le lleva a través de técnicas básicas y avanzadas de web scraping, destaca las mejores prácticas, y presenta ProxyScrape's Web Scraping API como una solución flexible para los sitios web estáticos y dinámicos.

Identificar si un sitio web es estático o dinámico

Para determinar si un sitio web es estático o dinámico:

  • Inspeccione la Fuente de la Página: Haga clic con el botón derecho y seleccione "Ver fuente de la página". Si todo el contenido es visible y coincide con lo que se muestra en la página, es probable que sea estática.
  • Utiliza las herramientas de desarrollo del navegador: Abre las herramientas de desarrollo haciendo clic con el botón derecho del ratón en la página y seleccionando "Inspeccionar". A continuación, observa la pestaña "Red" mientras interactúas con la página. Si se realizan nuevas solicitudes de red en respuesta a las interacciones, es probable que se trate de un sitio dinámico.
  • Desactive JavaScript: Prueba a desactivar JavaScript en la configuración del navegador y vuelve a cargar la página. Si la página deja de funcionar correctamente o muestra muy poco contenido, es probable que dependa de JavaScript para la obtención y representación de datos, lo que indica una naturaleza dinámica.

Estos métodos representan sólo algunas formas de determinar si un sitio web es estático o dinámico. Aunque existen otras estrategias, hemos analizado e identificado estas técnicas, que consideramos ampliamente utilizadas y eficaces.

Scraping de sitios web estáticos con Requests y BeautifulSoup

Para scrapear contenido estático, Python ofrece librerías robustas como `requests` para hacer peticiones HTTP y `BeautifulSoup` para analizar documentos HTML y XML. He aquí un ejemplo sencillo:

  • Hacer una petición: Utilice `requests` para recuperar el contenido HTML de la página.
  • Análisis con BeautifulSoup: Una vez que tenga el contenido de la página, `BeautifulSoup` puede analizar y extraer información específica.
importar peticiones
from bs4 import BeautifulSoup

response = requests.get('http://example.com')

soup = BeautifulSoup(response.text, 'html.parser')

# Extraer los datos deseados
datos = soup.find_all('p')

Este método es perfecto para quienes se inician en el raspado web. Es eficaz para sitios web con contenido estático, que requieren una configuración mínima.

Scraping Sitios web dinámicos

Los sitios web dinámicos presentan un reto diferente. Estos sitios web cargan su contenido de forma asíncrona con JavaScript, lo que significa que el raspado directo de HTML no funcionará porque los datos no están presentes en la carga inicial de la página.

Hay dos maneras de abordar el raspado dinámico de sitios web:

  • El primer enfoque es utilizar una biblioteca de automatización del navegador como Playwright/Selenium para obtener el contenido y luego analizarlo con Beautifulsoup.
  • El segundo enfoque es como jugar a los detectives con la pestaña de red para detectar el punto final que utiliza el sitio web para obtener sus datos. A continuación, sólo tienes que utilizar el módulo 'request' de Python para obtener esos datos.

Navegación por sitios web dinámicos con Playwright

Para escrapear contenido dinámico, herramientas como Playwright imitan la interacción de un usuario real con el navegador, lo que permite escrapear datos que se cargan dinámicamente. Aquí tienes una breve introducción al uso de Playwright con Python:

  • Instalación de Playwright: Instale el paquete Playwright y la herramienta de línea de comandos.
    - "pip install playwright"
    - "playwright install"
  • Uso de Playwright para simular interacciones: Escribir un script que navegue por el sitio web e interactúe con él según sea necesario para activar la carga de contenido dinámico.
from playwright.sync_api import sync_playwright


if __name__ == '__main__':

   with sync_playwright() as p:

       browser = p.chromium.launch(headless=True)

      página = navegador.nueva_página()

      page.goto('https://www.scrapethissite.com/pages/ajax-javascript/')

      # Simular las interacciones aquí

      page.click('//*[@id="2014"]')

      # Extraer el contenido dinámico

       content = page.inner_text('//*[@id="oscars"]/div/div[5]/div/table')

      print(contenido)

       browser.close()

Análisis del Panel de Red para obtener los puntos finales de la API:

  • Abrir las herramientas para desarrolladores
    a. Abra el sitio web de su interés en su navegador.
    b. Haga clic con el botón derecho del ratón en cualquier parte de la página y seleccione Inspeccionar o pulse Ctrl+Mayús+I (Cmd+Opción+I en Mac) para abrir las herramientas de desarrollador.
  • Inspeccione la pestaña Red
    a. Haga clic en la pestaña Red en las herramientas de desarrollo. En esta pestaña verás todas las solicitudes de red que realiza el sitio web.
    b. Actualiza la página para empezar a capturar el tráfico desde el principio.
  • Filtrar e identificar peticiones AJAX
    a. Puede filtrar las solicitudes por tipos como XHR (XMLHttpRequest), que se utilizan habitualmente para las solicitudes AJAX.
    b. Interactúe con la página -como hacer clic en botones, rellenar formularios o desplazarse- para activar la carga dinámica de contenido.
    c. Observe las solicitudes de red que aparecen al realizar estas acciones. Busque solicitudes que obtengan datos que le interesen.
  • Analice la Solicitud
    a. Haga clic en una solicitud en la pestaña Red que parezca que está recuperando los datos que necesita.
    b. Compruebe la sección Cabeceras para ver el método de solicitud (GET, POST, etc.), la URL y otras cabeceras.
  • Replicar la Petición Usando Python
    a. Utiliza la información de la pestaña Cabeceras para replicar la petición utilizando la librería de peticiones de Python. Aquí tienes un ejemplo básico de cómo podrías hacerlo:
import requests

# URL from the AJAX request
url = 'https://example.com/api/data'

# Any headers you observed that are necessary, like user-agent, authorization tokens, etc.
headers = {
    'User-Agent': 'Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Mobile Safari/537.36,gzip(gfe)',
    'Authorization': 'Bearer token_if_needed'
}

# If it's a POST request, you might also need to send data
data = {
    'example_key': 'example_value'
}

# Replace 'get' with 'post' if the request type is POST
response = requests.get(url, headers=headers, data=data if 'post' in locals() else None)

# To view the response
print(response.json()) 

Utilización de una API de Web Scraping para ambos escenarios

Aunque dominar las peticiones y Playwright o cualquier otra librería cliente Http puede ser gratificante, requieren tiempo y esfuerzo para manejarlas correctamente. Un enfoque alternativo es aprovechar una API de Web Scraping que abstrae la complejidad de las tareas de scraping. No sólo gestiona el envío de solicitudes HTTP por usted, sino que también le proporciona asistencia con técnicas antibaneo para evitar ser bloqueado por determinados sitios web.

Presentamos ProxyScrape's Web Scraping API

ProxyScrape ofrece una API de Web Scraping que simplifica la extracción de datos de sitios web tanto estáticos como dinámicos.

Entre las funciones de la API se incluyen:

  • Fácil integración con sitios dinámicos y estáticos.
  • Soporte completo para diferentes tipos de actividades de web scraping.
  • Amplio conjunto de direcciones IP
  • Ofrece hasta 100.000 solicitudes gratuitas, lo que permite a los usuarios explorar y aprovechar todo el potencial de la API sin inversión inmediata.
  • Sofisticada tecnología antiprohibición, adaptada a sitios web conocidos por sus dificultades para el scraping.
  • Las acciones permiten controlar con precisión el tiempo de recepción de la salida del sitio web. Esto incluye la espera de una determinada solicitud de URL, la anticipación de la aparición de un elemento en el sitio, las actividades posteriores al desplazamiento, etc. Utilización de

ProxyScrape API de Web Scraping con un sitio web estático:

Esta es una ilustración de cómo puede incorporar nuestra API de web scraping en sus scripts Python para sitios web estáticos, o para llamar a un punto final de API que haya extraído del panel de inspección de su navegador:

import requests
import base64
import json

data = {
    "url": "https://books.toscrape.com/",
    "httpResponseBody": True
}

headers = {
    'Content-Type': 'application/json',
    'X-Api-Key': 'YOUR_API_KEY'
}

response = requests.post('https://api.proxyscrape.com/v3/accounts/freebies/scraperapi/request', headers=headers, json=data)

if response.status_code == 200:
    json_response = response.json()
    if 'browserHtml' in json_response['data']:
        print(json_response['data']['browserHtml'])
    else:
        print(base64.b64decode(json_response['data']['httpResponseBody']).decode())
else:
    print("Error:", response.status_code)

ProxyScrape API de Web Scraping con un sitio web dinámico:

Aquí tenemos un ejemplo en el que esperamos a que el favicon empiece a cargarse. Esa suele ser la última petición en iniciarse en el sitio web de prueba que estamos utilizando.

import requests
import json

url = 'https://api.proxyscrape.com/v3/accounts/freebies/scraperapi/request'

headers = {
    'Content-Type': 'application/json',
    'X-Api-Key': '<your api key>'  # Make sure to replace <your api key> with your actual API key
}

payload = {
    "url": "https://books.toscrape.com/",
    "browserHtml": True,
    "actions": [
        {
            "action": "waitForRequest",
            "urlPattern": "https://books.toscrape.com/static/oscar/favicon.ico",
            "urlMatchingOptions": "exact"
        }
    ]
}

response = requests.post(url, headers=headers, json=payload)

# Print the response from the server
print(response.text)  # Prints the response body as text

Buenas prácticas en Web Scraping

Independientemente de las herramientas o API que elija, respetar las condiciones de uso de los sitios web, limitar el número de solicitudes para evitar bloqueos de IP y utilizar proxies para el scraping anónimo son buenas prácticas fundamentales. ProxyScrape no sólo proporciona proxies premium, residenciales, móviles y dedicados para tales necesidades, sino que fomenta el scraping web ético.

Conclusión

  • Tanto si te inicias en el web scraping como hobby como si lo integras en tu conjunto de herramientas profesionales, es esencial comprender la distinción entre sitios web estáticos y dinámicos y saber cómo hacer un scraping eficaz de ambos. Combinando bibliotecas de Python como Requests y Playwright/Selenium con Beautifulsoup, estarás equipado para hacer frente a tus retos de web scraping.
  • Si sus scripts de web scraping son detectados como bots y posteriormente bloqueados, o si desea optimizar y simplificar su proceso de envío de solicitudes, considere explorar nuestra API de Web Scraping. Está diseñada para gestionar eficazmente estos problemas en su nombre.
  • Recuerde que el futuro del web scraping es brillante y que, si se atiene a las mejores prácticas y aprovecha las herramientas más avanzadas, podrá desbloquear un mundo de datos que esperan ser descubiertos.

¿Listo para comenzar su aventura de web scraping? Regístrese en ProxyScrape hoy mismo y explore las infinitas posibilidades de la web con nuestros proxies dedicados, proxies residenciales y nuestra completa API de Web Scraping.