Reddit es una mina de oro de datos valiosos para empresas, investigadores y desarrolladores que buscan recopilar información y entrenar modelos de IA. Pero en 2023, Reddit arruinó los planes de muchas personas al introducir tarifas significativas por el acceso a la API. Afortunadamente, el web scraping ofrece una alternativa eficaz, más rentable y flexible. En esta guía detallada, le explicaremos exactamente cómo extraer datos de Reddit usando Python y Selenium.
¿Por qué eliminar Reddit en 2024?
En abril de 2023, Reddit anunció que comenzarían a cobrar tarifas elevadas por el acceso a la API: 0,24 dólares por cada 1000 llamadas. Este cambio inmediatamente hizo que el costo de la API fuera prohibitivo para la mayoría de los casos de uso. Muchas aplicaciones como Apollo que dependían de la API se vieron obligadas a cerrar.
Pero las grandes cantidades de datos útiles en Reddit no desaparecieron repentinamente ni perdieron valor. La gente todavía necesita acceder a él para inteligencia empresarial, investigación científica, formación de grandes modelos lingüísticos y más. El web scraping es ahora el método más viable y atractivo para obtener estos datos a escala.
Estos son algunos de los beneficios clave de raspar Reddit en comparación con el uso de la API oficial:
Ahorro de costos: el scraping le permite recopilar datos de Reddit sin pagar las exorbitantes tarifas de API. Los únicos costos son para sus propios recursos informáticos.
Mayor flexibilidad: con el scraping, puede apuntar con precisión a los datos exactos que necesita, en lugar de estar limitado por las restricciones de la API. Personaliza tu raspador para extraer los campos que desees.
Acceda a más datos: las API a menudo restringen el alcance de los datos disponibles. Al realizar el scraping, puedes acceder a cualquier dato público del sitio, incluida la información que no se proporciona a través de los canales oficiales.
Entonces, en el mundo post-API de 2024, el web scraping es la opción inteligente para recopilar datos de Reddit. ¡Profundicemos en los detalles técnicos de cómo hacerlo con Python!
Herramientas que necesitarás para eliminar Reddit
Para seguir este tutorial, asegúrese de tener lo siguiente:
- Python 3.7+ instalado
- Un IDE de Python (PyCharm, VS Code, etc.)
- Navegador web Chrome
- ChromeDriver para selenio
Usaremos la biblioteca Python Selenium para automatizar el navegador Chrome y extraer datos de Reddit. Selenium es ideal porque puede representar el contenido dinámico de JavaScript que es común en las páginas de Reddit.
También querrás configurar un entorno virtual para administrar las dependencias de tu proyecto de scraping de Reddit. Haga esto ejecutando:
python -m venv env
source env/bin/activateLuego instale los paquetes de Python necesarios:
pip install selenium webdriver-manager¡Genial, ya estás listo! Comencemos a construir el raspador de Reddit.
Tutorial paso a paso de raspado de Reddit
Tomaremos datos del subreddit r/technology como ejemplo. Pero puedes adaptar fácilmente este código para extraer publicaciones e información de cualquier subreddit público.
Paso 1: configurar el selenio
Primero, importe los módulos Selenium necesarios y configure Chrome para que se ejecute en modo sin cabeza. Esto oculta la interfaz de usuario del navegador, lo que conserva los recursos.
from selenium import webdriver
from selenium.webdriver.chrome.service import Service as ChromeService
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.chrome.options import Options
options = Options()
options.headless = True
driver = webdriver.Chrome(service=ChromeService(ChromeDriverManager().install()),
options=options)Especifica la URL del subreddit que deseas extraer. En este caso, tomaremos las publicaciones principales de la semana pasada sobre r/tecnología.
url = "https://www.reddit.com/r/technology/top/?t=week"
driver.get(url)Paso 3: elimine los metadatos del subreddit
La parte superior de la página del subreddit contiene metadatos útiles. Extraigamos el nombre, la descripción, la fecha de creación y el número de miembros.
subreddit = {}
subreddit[‘name‘] = driver.find_element(By.TAG_NAME, ‘h1‘).text
subreddit[‘description‘] = driver.find_element(By.XPATH,
"//div[@data-testid=‘DescriptionComment‘]").text
subreddit[‘created‘] = driver.find_element(By.XPATH,
"//span[contains(text(), ‘Created‘)]/following-sibling::span").text
subreddit[‘members‘] = driver.find_element(By.XPATH,
"//div[@id=‘MembershipButton‘]//span[@class=‘_vaFo96phV6L5Hltvwcox‘]").text Paso 4: elimine los datos de la publicación
A continuación, recopilemos datos sobre cada una de las publicaciones individuales en el subreddit. Obtendremos el título, el autor, el recuento de votos positivos, la cantidad de comentarios y la URL de destino de las publicaciones principales.
Inspeccione el HTML para encontrar los elementos que contienen estos datos. Reddit lo complica al usar clases CSS generadas aleatoriamente. Pero podemos seleccionar elementos de forma fiable utilizando atributos semánticos comodata-testid.
posts = []
post_elems = driver.find_elements(By.CSS_SELECTOR,
‘[data-testid="post-container"]‘)
for post in post_elems:
post_data = {}
post_data[‘title‘] = post.find_element(By.TAG_NAME, ‘h3‘).text
post_data[‘author‘] = post.find_element(By.CSS_SELECTOR,
‘[data-testid="post_author_link"]‘).text
post_data[‘upvotes‘] = post.find_element(By.XPATH,
"//div[@data-click-id=‘upvote‘]/following-sibling::div").text
post_data[‘comments‘] = post.find_element(By.XPATH,
"//a[@data-click-id=‘comments‘]/span").text
post_data[‘url‘] = post.find_element(By.CSS_SELECTOR,
‘[data-testid="outbound-link"]‘).get_attribute(‘href‘)
posts.append(post_data)Agregue los datos de esta publicación al diccionario subreddit:
subreddit[‘posts‘] = postsPaso 5: generar los datos extraídos
Finalmente, guarde los datos del subreddit extraídos en un archivo JSON para usarlos fácilmente en otras aplicaciones. Imprima bastante el JSON para hacerlo más legible para los humanos.
import json
with open(‘subreddit_data.json‘, ‘w‘) as f:
json.dump(subreddit, f, indent=4)Poniéndolo todo junto
Aquí está el script Python completo para extraer datos de un subreddit de Reddit:
from selenium import webdriver
from selenium.webdriver.chrome.service import Service as ChromeService
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
import json
options = Options()
options.headless = True
driver = webdriver.Chrome(service=ChromeService(ChromeDriverManager().install()),
options=options)
url = "https://www.reddit.com/r/technology/top/?t=week"
driver.get(url)
subreddit = {}
subreddit[‘name‘] = driver.find_element(By.TAG_NAME, ‘h1‘).text
subreddit[‘description‘] = driver.find_element(By.XPATH, "//div[@data-testid=‘DescriptionComment‘]").text
subreddit[‘created‘] = driver.find_element(By.XPATH, "//span[contains(text(), ‘Created‘)]/following-sibling::span").text
subreddit[‘members‘] = driver.find_element(By.XPATH, "//div[@id=‘MembershipButton‘]//span[@class=‘_vaFo96phV6L5Hltvwcox‘]").text
posts = []
post_elems = driver.find_elements(By.CSS_SELECTOR, ‘[data-testid="post-container"]‘)
for post in post_elems:
post_data = {}
post_data[‘title‘] = post.find_element(By.TAG_NAME, ‘h3‘).text
post_data[‘author‘] = post.find_element(By.CSS_SELECTOR, ‘[data-testid="post_author_link"]‘).text
post_data[‘upvotes‘] = post.find_element(By.XPATH, "//div[@data-click-id=‘upvote‘]/following-sibling::div").text
post_data[‘comments‘] = post.find_element(By.XPATH, "//a[@data-click-id=‘comments‘]/span").text
post_data[‘url‘] = post.find_element(By.CSS_SELECTOR, ‘[data-testid="outbound-link"]‘).get_attribute(‘href‘)
posts.append(post_data)
subreddit[‘posts‘] = posts
with open(‘subreddit_data.json‘, ‘w‘) as f:
json.dump(subreddit, f, indent=4)
driver.quit()Ejecute este script y obtendrá un formato agradablesubreddit_data.jsonarchivo que contiene todos los datos extraídos de Reddit. ¡Ahora está listo para analizar los datos como desee!
Técnicas avanzadas para raspar Reddit a escala
El script básico anterior funciona bien para eliminar un solo subreddit. Pero si necesita recopilar datos de Reddit a mayor escala, puede encontrar algunos desafíos:
Limitación de velocidad y prohibiciones de IP: Reddit acelerará o bloqueará su IP si realiza demasiadas solicitudes y demasiado rápido. Esto puede detener el raspado.
CAPTCHA y otras medidas anti-bots: Reddit emplea varias defensas para detener bots y scrapers. Es posible que se le presenten CAPTCHA que impidan un mayor raspado.
Velocidades de raspado lentas: el selenio es confiable pero relativamente lento en comparación con otros métodos de raspado. Eliminar subreddits grandes puede llevar mucho tiempo.
Para extraer datos de Reddit a escala, deberá abordar estos problemas. A continuación se ofrecen algunos consejos:
- Utilice poderes rotativos para evitar límites y prohibiciones de tarifas. Los servidores proxy le permiten realizar solicitudes desde muchas direcciones IP diferentes. Automatizar la rotación de proxy te permite seguir buscando sin encontrar obstáculos.
Busque proxies rápidos, seguros y de origen ético de proveedores acreditados. Según las revisiones y las pruebas comparativas que he realizado, estos son algunos de los principales servicios de proxy a considerar:
- Datos brillantes
- IPRoyal
- Vendedor proxy
- SOAX
- proxy inteligente
- Proxy-barato
- hidraproxy
Maneje los CAPTCHA automáticamente utilizando un servicio como 2Captcha o Anticaptcha. Estos servicios económicos funcionan a través de una API para resolver CAPTCHA por usted para que pueda continuar con el scraping.
Optimice la velocidad y eficiencia de su raspado ejecutando múltiples raspadores en paralelo. Puede implementar su raspador de Reddit en una plataforma como Docker Swarm o Kubernetes para ejecutar muchas instancias simultáneamente y recopilar datos más rápido.
Alternativamente, utilice una herramienta de scraping especialmente diseñada como Scraping Browser de Bright Data. Maneja automáticamente los CAPTCHA y las medidas anti-scraping por usted y al mismo tiempo le permite raspar más rápido que Selenium.
Concluyendo
El web scraping es ahora el método preferido para recopilar datos de Reddit debido a que la API tiene un costo prohibitivo. Con el script de Python y las técnicas que se tratan en esta guía, estará bien equipado para extraer grandes cantidades de datos valiosos de Reddit de manera confiable y eficiente.
Recuerde, sea siempre respetuoso al realizar scraping y evite sobrecargar los servidores de Reddit con demasiadas solicitudes a la vez. Utilice poderes y ajuste su tasa de scraping para ser un buen ciudadano.
Si desea saltarse el complicado proceso de eliminar Reddit usted mismo, también puede comprar conjuntos de datos de Reddit ya preparados de varias fuentes en línea. Pero crear su propio raspador le brinda la máxima flexibilidad y los datos más recientes.
Ahora tiene todo lo que necesita para aprovechar la gran cantidad de datos de Reddit para sus proyectos comerciales, de investigación o de codificación. Entonces, ¿a qué estás esperando? ¡Empieza a raspar Reddit con Python hoy!













