Cómo raspar artículos de Wikipedia con Python

En este artículo, voy a crear un raspador web en Python que raspará las páginas de Wikipedia.

El raspador irá a una página de Wikipedia, raspará el título y seguirá un enlace aleatorio a la siguiente página de Wikipedia.

¡Creo que será divertido ver qué páginas aleatorias de Wikipedia visitará este raspador!

Configurar el raspador

Para empezar, voy a crear un nuevo archivo de Python llamado scraper.py:

touch scraper.py

Para realizar la solicitud HTTP, usaré la requestsbiblioteca. Puedes instalarlo con el siguiente comando:

pip install requests

Usemos la página wiki de web scraping como nuestro punto de partida:

import requests response = requests.get( url="//en.wikipedia.org/wiki/Web_scraping", ) print(response.status_code) 

Al ejecutar el raspador, debe mostrar un código de estado 200:

python3 scraper.py 200

¡Muy bien, hasta ahora todo bien! ?

Extrayendo datos de la página

Extraigamos el título de la página HTML. Para hacer mi vida más fácil, usaré el paquete BeautifulSoup para esto.

pip install beautifulsoup4

Al inspeccionar la página de Wikipedia, veo que la etiqueta del título tiene el #firstHeadingID.

Beautiful soup te permite encontrar un elemento por la etiqueta de identificación.

title = soup.find(id="firstHeading")

Al reunirlo todo, el programa ahora se ve así:

import requests from bs4 import BeautifulSoup response = requests.get( url="//en.wikipedia.org/wiki/Web_scraping", ) soup = BeautifulSoup(response.content, 'html.parser') title = soup.find(id="firstHeading") print(title.string) 

Y al ejecutar esto, muestra el título del artículo de Wiki:?

python3 scraper.py Web scraping

Raspando otros enlaces

Ahora voy a profundizar en Wikipedia. Voy a agarrar una etiqueta aleatoria a otro artículo de Wikipedia y raspar esa página.

Para hacer esto, usaré beautiful soup para encontrar todas las etiquetas dentro del artículo de la wiki. Luego barajo la lista para hacerla aleatoria.

import requests from bs4 import BeautifulSoup import random response = requests.get( url="//en.wikipedia.org/wiki/Web_scraping", ) soup = BeautifulSoup(response.content, 'html.parser') title = soup.find(id="firstHeading") print(title.content) # Get all the links allLinks = soup.find(id="bodyContent").find_all("a") random.shuffle(allLinks) linkToScrape = 0 for link in allLinks: # We are only interested in other wiki articles if link['href'].find("/wiki/") == -1: continue # Use this link to scrape linkToScrape = link break print(linkToScrape)

Como puede ver, utilizo el soup.find(id="bodyContent").find_all("a")para encontrar todas las etiquetas dentro del artículo principal.

Como solo me interesan los enlaces a otros artículos de Wikipedia, me aseguro de que el enlace contenga el /wikiprefijo.

Al ejecutar el programa ahora, muestra un enlace a otro artículo de Wikipedia, ¡genial!

python3 scraper.py Link farm

Creando un raspador sin fin

Muy bien, hagamos que el raspador realmente raspe el nuevo enlace.

Para hacer esto, voy a mover todo a una scrapeWikiArticlefunción.

import requests from bs4 import BeautifulSoup import random def scrapeWikiArticle(url): response = requests.get( url=url, ) soup = BeautifulSoup(response.content, 'html.parser') title = soup.find(id="firstHeading") print(title.text) allLinks = soup.find(id="bodyContent").find_all("a") random.shuffle(allLinks) linkToScrape = 0 for link in allLinks: # We are only interested in other wiki articles if link['href'].find("/wiki/") == -1: continue # Use this link to scrape linkToScrape = link break scrapeWikiArticle("//en.wikipedia.org" + linkToScrape['href']) scrapeWikiArticle("//en.wikipedia.org/wiki/Web_scraping")

La scrapeWikiArticlefunción obtendrá el artículo de la wiki, extraerá el título y encontrará un enlace aleatorio.

Luego, volverá a llamar scrapeWikiArticlecon este nuevo enlace. Por lo tanto, crea un ciclo interminable de un Scraper que rebota en wikipedia.

Ejecutemos el programa y veamos qué obtenemos:

pythron3 scraper.py Web scraping Digital object identifier ISO 8178 STEP-NC ISO/IEC 2022 EBCDIC 277 Code page 867 Code page 1021 EBCDIC 423 Code page 950 G R Mole (unit) Gram Remmius Palaemon  Eleventh Edition Geography Gender studies Feminism in Brazil

Impresionante, en aproximadamente 10 pasos pasamos de "Web Scraping" a "Feminismo en Brasil". ¡Asombroso!

Conclusión

Hemos construido un raspador web en Python que raspa páginas aleatorias de Wikipedia. Rebota interminablemente en Wikipedia siguiendo enlaces aleatorios.

Este es un truco divertido y Wikipedia es bastante indulgente cuando se trata de web scraping.

También hay sitios web más difíciles de raspar como Amazon o Google. Si desea eliminar un sitio web de este tipo, debe configurar un sistema con navegadores Chrome sin cabeza y servidores proxy. O puede usar un servicio que maneje todo eso para usted como este.

Pero tenga cuidado de no abusar de los sitios web y solo recopile los datos que puede recopilar.

¡Feliz codificación!