Web Scraping for News Articles using Python- La mejor manera en 2024

Python, Mar-06-20245 minutos de lectura

Las noticias son la mejor manera de enterarse de lo que ocurre en todo el mundo. Para los ingenieros de datos, los artículos periodísticos son una de las mejores formas de recopilar cantidades surrealistas de datos. Más datos significa más conocimientos, y eso es lo único que puede innovar nuestra tecnología y llevar a nuestra humanidad a cotas más altas que nunca. Pero hay

Las noticias son la mejor manera de enterarse de lo que ocurre en todo el mundo. Para los ingenieros de datos, los artículos periodísticos son una de las mejores formas de recopilar cantidades surrealistas de datos. Más datos significa más conocimientos, y eso es lo único que puede innovar nuestra tecnología y llevar a nuestra humanidad a cotas más altas que nunca. Pero hay muchas noticias, y es humanamente imposible obtener todos los datos manualmente. ¿Cuál es la mejor manera de obtener los datos automáticamente? La respuesta es el web scraping para artículos de noticias usando python.

En este artículo, vamos a crear un raspador web para raspar los últimos artículos de noticias de diferentes periódicos y almacenarlos como texto. Vamos a pasar por los dos pasos siguientes para tener un análisis en profundidad de cómo se realiza todo el proceso.

Introducción superficial a las páginas web y HTML.Web scraping utilizando Python y la famosa biblioteca llamada BeautifulSoup.

Siéntase libre de saltar a cualquier sección para aprender más sobre cómo realizar web scraping para artículos de noticias utilizando python

Índice

Introducción superficial a las páginas web y HTML

Si queremos extraer información importante de cualquier sitio o página web, es importante saber cómo funciona esa página web. Cuando vamos a la URL específica utilizando cualquier navegador web (Chrome, Firefox, Mozilla, etc.), esa página web es una combinación de tres tecnologías,

HTML (Lenguaje de marcado de hipertexto): HTML define el contenido de la página web. Es el lenguaje de marcado estándar para añadir contenido a la página web. Por ejemplo, si quieres añadir texto, imágenes o cualquier otra cosa a tu página web, HTML te ayuda a hacerlo.

CSS (hojas de estilo en cascada): Se utiliza para dar estilo a las páginas web. CSS se encarga de todos los diseños visuales que se ven en un sitio web concreto.

JavaScript: JavaScript es el cerebro de una página web. JavaScript maneja toda la lógica y funcionalidad de la página web. Por lo tanto, permite que el contenido y el estilo sean interactivos.

Estos tres lenguajes de programación nos permiten crear y manipular los aspectos de una página web.

Supongo que conoces los conceptos básicos de una página web y HTML para este artículo. Algunos conceptos de HTML como divs, etiquetas, encabezados, etc., podrían ser muy útiles al crear este raspador web. No necesitas saberlo todo, sino sólo lo básico del diseño de la página web y cómo se contiene la información en ella, y estamos listos para ir.

Web Scraping artículos de noticias usando BeautifulSoup en Python

Python dispone de varios paquetes que nos permiten scrapear información de una página web. Seguiremos con BeautifulSoup porque es una de las librerías de Python más famosas y fáciles de usar para el web scraping.

BeautifulSoup es lo mejor para analizar el contenido HTML de una URL y acceder a él con etiquetas y tags. Por lo tanto, será conveniente extraer determinados fragmentos de texto de la página web.

Con sólo 3-5 líneas de código, podemos hacer la magia y extraer cualquier tipo de texto de nuestro sitio web de elección de la Internet, que elabora es un fácil de usar pero potente paquete.

Empezaremos por lo más básico. Para instalar el paquete de la biblioteca, escriba el siguiente comando en su distribución de Python,

! pip install beautifulsoup4

También utilizaremos el módulo 'requests' ya que proporciona a BeautifulSoup el código HTML de cualquier página. Para instalarlo, escribe el siguiente comando en tu distribución de Python,

! pip install peticiones

Este módulo de peticiones nos permitirá obtener el código HTML de la página web y navegar por ella utilizando el paquete BeautfulSoup. Los dos comandos que nos facilitarán mucho el trabajo son

find_all(elemento etiqueta, atributo): Esta función toma como parámetros tag y attributes y nos permite localizar cualquier elemento HTML de una página web. Identificará todos los elementos del mismo tipo. Podemos utilizar find() en su lugar para obtener sólo el primero.

get_text(): Una vez localizado un elemento dado, este comando nos permite extraer el texto interior.

Para navegar por el código HTML de nuestra página web y localizar los elementos que queremos scrapear, podemos utilizar la opción 'inspeccionar elemento' haciendo clic con el botón derecho del ratón sobre la página o simplemente pulsando Ctrl+F. Nos permitirá ver el código fuente de la página web.

Una vez localizados los elementos de interés, obtendremos el código HTML con el módulo requests, y para extraer esos elementos, utilizaremos el BeautifulSoup.

Para este artículo, trabajaremos con el periódico inglés EL Paris. Vamos a raspar los títulos de los artículos de noticias de la primera página y luego el texto.

Si inspeccionamos el código HTML de los artículos de noticias, veremos que el artículo de la portada tiene una estructura como ésta,

The title has <h2> element with itemprop=”headline” and class=”articulo-titulo” attributes. It has an href attribute containing the text. So we will now extract the text using the following commands:

importar peticiones
from bs4 import BeautifulSoup

Una vez que obtenemos el contenido HTML utilizando el módulo requests, podemos guardarlo en la variable coverpage:

# Solicitud
r1 = requests.get(url)
r1.status_code
 
# Guardaremos en coverpage el contenido de la portada
portada = r1.contenido

A continuación, definiremos la variable sopa,

# Creación de la sopa
soup1 = BeautifulSoup(portada, 'html5lib')

En la siguiente línea de código, localizaremos los elementos que estamos buscando,

# Identificación de noticias
portada_noticias = soup1.find_all('h2', class_='articulo-titulo')

Usando final_all, estamos obteniendo todas las ocurrencias. Por lo tanto, debe devolver una lista en la que cada elemento sea un artículo de noticias,

Para poder extraer el texto, utilizaremos el siguiente comando:

portada_noticias[4].get_text()

Si queremos acceder al valor de un atributo (en nuestro caso, el enlace), podemos utilizar el siguiente comando,

portada_noticias[4]['href']

Esto nos permitirá obtener el enlace en texto plano.

Si has comprendido todos los conceptos hasta este punto, puedes hacer web scrape de cualquier contenido de tu elección.

El siguiente paso consiste en acceder a cada uno de los contenidos del artículo de noticias con el atributo href, obtener el código fuente para encontrar los párrafos en el código HTML, y finalmente obtenerlos con BeautifulSoup. Es el mismo proceso que hemos descrito anteriormente, pero tenemos que definir las etiquetas y atributos que identifican el contenido del artículo de noticias.

El código para la funcionalidad completa se da a continuación. No voy a explicar cada línea por separado ya que el código está comentado; uno puede entenderlo claramente leyendo esos comentarios.

número_de_artículos = 5
# Listas vacías para contenido, enlaces y títulos
noticias_contenido = []
list_links = []
list_titles = []
 
for n in np.arange(0, número_de_artículos):
    
   # sólo artículos de noticias (también hay álbumes y otras cosas)
   if "inenglish" not in portada_noticias[n].find('a')['href']:  
       continue
    
   # Obtener el enlace del artículo
   link = portada_noticias[n].find('a')['href']
    list_links.append(enlace)
    
   # Obtener el título
    title = portada_noticias[n].find('a').get_text()
    lista_títulos.append(título)
    
   # Leer el contenido (está dividido en párrafos)
    artículo = peticiones.get(enlace)
    contenido_artículo = contenido_artículo
    soup_article = BeautifulSoup(contenido_artículo, 'html5lib')
    body = soup_article.find_all('div', class_='articulo-cuerpo')
    x = body[0].find_all('p')
    
   # Unificar los párrafos
    lista_párrafos = []
   for p in np.arange(0, len(x)):
        párrafo = x[p].get_text()
        list_paragraphs.append(párrafo)
        artículo_final = " ".join(lista_párrafos)
        
    news_contents.append(articulo_final)

Pongamos los artículos extraídos en lo siguiente:

  • Un conjunto de datos que introducirá los modelos (df_features).
  • Un conjunto de datos con el título y el enlace (df_show_info).
# df_features
df_features = pd.DataFrame(
     {'Article Content': news_contents 
    })
 
# df_show_info
df_show_info = pd.DataFrame(
    {'Article Title': list_titles,
     'Article Link': list_links})
df_features
df_show_info

Para definir una mejor experiencia de usuario, también mediremos el tiempo que tarda un script en obtener las noticias. Definiremos una función para esto y luego llamaremos. De nuevo, no explicaré cada línea de código ya que el código está comentado. Para obtener una comprensión clara, puede leer los comentarios.

def get_news_elpais():
    
    # url definition
    url = "https://elpais.com/elpais/inenglish.html"
    
    # Request
    r1 = requests.get(url)
    r1.status_code
 
    # We'll save in coverpage the cover page content
    coverpage = r1.content
 
    # Soup creation
    soup1 = BeautifulSoup(coverpage, 'html5lib')
 
    # News identification
    coverpage_news = soup1.find_all('h2', class_='articulo-titulo')
    len(coverpage_news)
    
    number_of_articles = 5
 
    # Empty lists for content, links and titles
    news_contents = []
    list_links = []
    list_titles = []
 
    for n in np.arange(0, number_of_articles):
 
        # only news articles (there are also albums and other things)
        if "inenglish" not in coverpage_news[n].find('a')['href']:  
            continue
 
        # Getting the link of the article
        link = coverpage_news[n].find('a')['href']
        list_links.append(link)
 
        # Getting the title
        title = coverpage_news[n].find('a').get_text()
        list_titles.append(title)
 
        # Reading the content (it is divided in paragraphs)
        article = requests.get(link)
        article_content = article.content
        soup_article = BeautifulSoup(article_content, 'html5lib')
        body = soup_article.find_all('div', class_='articulo-cuerpo')
        x = body[0].find_all('p')
 
        # Unifying the paragraphs
        list_paragraphs = []
        for p in np.arange(0, len(x)):
            paragraph = x[p].get_text()
            list_paragraphs.append(paragraph)
            final_article = " ".join(list_paragraphs)
 
        news_contents.append(final_article)
 
    # df_features
    df_features = pd.DataFrame(
         {'Content': news_contents 
        })
 
    # df_show_info
    df_show_info = pd.DataFrame(
        {'Article Title': list_titles,
         'Article Link': list_links,
         'Newspaper': 'El Pais English'})
    
    return (df_features, df_show_info)

¿Cuál es el mejor proxy para Web Scraping para artículos de noticias usando Python?

ProxyScrape es uno de los proveedores de proxy en línea más populares y fiables. Tres servicios de proxy incluyen servidores proxy de centros de datos dedicados, servidores proxy residenciales y servidores proxy premium. Entonces, ¿cuál es la mejor solución posible para el mejor proxy HTTP para web scraping para artículos de noticias usando python? Antes de responder a esa pregunta, lo mejor es ver las características de cada servidor proxy.

Un proxy dedicado de centro de datos es el más adecuado para tareas en línea de alta velocidad, como la transmisión de grandes cantidades de datos (en términos de tamaño) desde varios servidores con fines de análisis. Es una de las principales razones por las que las organizaciones eligen proxies dedicados para transmitir grandes cantidades de datos en poco tiempo.

Un proxy dedicado de centro de datos tiene varias características, como ancho de banda ilimitado y conexiones concurrentes, proxies HTTP dedicados para facilitar la comunicación y autenticación IP para mayor seguridad. Con un tiempo de actividad del 99,9%, puede estar seguro de que el centro de datos dedicado siempre funcionará durante cualquier sesión. Por último, pero no por ello menos importante, ProxyScrape ofrece un excelente servicio de atención al cliente y le ayudará a resolver su problema en un plazo de 24-48 horas laborables. 

El siguiente es un proxy residencial. Residencial es un proxy para todos los consumidores en general. La razón principal es que la dirección IP de un proxy residencial se parece a la dirección IP proporcionada por el ISP. Esto significa que obtener el permiso del servidor de destino para acceder a sus datos será más fácil de lo habitual. 

La otra característica del proxy residencial de ProxyScrapees la rotación. Un proxy rotativo te ayuda a evitar un bloqueo permanente de tu cuenta porque tu proxy residencial cambia dinámicamente tu dirección IP, dificultando que el servidor de destino compruebe si estás usando un proxy o no. 

Aparte de eso, las otras características de un proxy residencial son: ancho de banda ilimitado, junto con la conexión concurrente, dedicado HTTP / s proxies, proxies en cualquier sesión de tiempo debido a los más de 7 millones de proxies en la piscina de proxy, nombre de usuario y contraseña de autenticación para mayor seguridad, y por último pero no menos importante, la capacidad de cambiar el servidor de país. Puede seleccionar el servidor que desee añadiendo el código del país a la autenticación del nombre de usuario. 

El último es el proxy premium. Los proxies premium son iguales que los proxies de centro de datos dedicados. La funcionalidad sigue siendo la misma. La principal diferencia es la accesibilidad. En los proxies premium, la lista de proxies (la lista que contiene los proxies) se pone a disposición de todos los usuarios de la red ProxyScrape. Por eso los proxies premium cuestan menos que los proxies de centro de datos dedicados.

Entonces, ¿cuál es la mejor solución posible para el mejor proxy HTTP para web scraping para artículos de noticias utilizando python? La respuesta sería "proxy residencial". La razón es simple. Como se dijo anteriormente, el proxy residencial es un proxy rotativo, lo que significa que su dirección IP se cambiaría dinámicamente durante un período de tiempo que puede ser útil para engañar al servidor mediante el envío de una gran cantidad de solicitudes dentro de un marco de tiempo pequeño sin obtener un bloqueo de IP. 

A continuación, lo mejor sería cambiar el servidor proxy en función del país. Sólo tienes que añadir el país ISO_CODE al final de la autenticación IP o autenticación de nombre de usuario y contraseña. 

Lecturas recomendadas:

Scrapear comentarios de YouTube - 5 sencillos pasosLas 8 mejores herramientas de raspado web con Python en 2023

Preguntas frecuentes:

1. ¿Cuál es la mejor manera de scrapear artículos de noticias usando python?
La biblioteca python se llama "BeautifulSoup" y puede extraer automáticamente datos de cualquier artículo de noticias. El único requisito sería un conocimiento básico de HTML para localizar la etiqueta HTML del código fuente de la página que contiene los datos que hay que raspar.
2. ¿Está bien copiar artículos de noticias del sitio web?
La respuesta es que depende de los términos y condiciones del sitio web. Pero la mayoría de los artículos de noticias se pueden raspar, ya que toda la información se pone intencionadamente a disposición del público. Todos los datos públicos pueden ser "scrapeados" siempre que el método de "scraping" no perjudique a los datos o al propietario del sitio web.
3. ¿Cómo puedo scrapear Google News con Python?
Puedes scrapear Google News o cualquier artículo de noticias usando python con la ayuda de la librería python llamada "BeautifulSoup". Instale la biblioteca y un proxy residencial fiable para evitar el bloqueo de IP desde el servidor de destino.

Conclusión

En este artículo, hemos visto los fundamentos de web scraping mediante la comprensión de los conceptos básicos de diseño de flujo de página web y la estructura. También hemos hecho experiencia práctica mediante la extracción de datos de artículos de noticias. El web scraping puede hacer maravillas si se hace correctamente. Por ejemplo, se puede crear un modelo totalmente optimizado basado en los datos extraídos que pueda predecir categorías y mostrar resúmenes al usuario. Lo más importante es averiguar los requisitos y entender la estructura de la página. Python dispone de bibliotecas muy potentes y fáciles de usar para extraer los datos que desee. Esto ha hecho que el web scraping sea muy fácil y divertido.  

Es importante tener en cuenta que este código sirve para extraer datos de esta página web en concreto. Si queremos hacerlo de cualquier otra página, necesitamos optimizar nuestro código de acuerdo a la estructura de esa página. Pero una vez que sabemos identificarlos, el proceso es exactamente el mismo.

Este artículo pretende explicar en profundidad el enfoque práctico de web scraping para artículos de noticias utilizando python. Una cosa a recordar es que el proxy es una necesidad absoluta para el web scraping. Ayuda a evitar cualquier bloqueo de IP desde el servidor de destino. ProxyScrape proporciona un gran y fiable proxy residencial para su web scraping para artículos de noticias utilizando python proyectos.