Recolectar datos de un sitio web es mucho más que recolectar su contenido; hay mucho en juego. Para saltarse los límites, las brechas y otros bloqueos sofisticados, hay que utilizar una multitud de métodos adicionales como el raspado de datos en Python.
En este artículo definiremos qué es el scraping con Python y justificaremos por qué es la herramienta óptima para esta tarea. Y también esbozaremos tácticas que hacen uso de las capacidades de scraping de datos de Python. Todo ello ayudará a recuperar información incluso de los sitios más seguros.
Esta herramienta está diseñada específicamente para servir como un excelente recurso para la recolección de datos de sitios web. Aparte de su facilidad de uso, las bibliotecas de Python como Scrapy, Selenium y BeautifulSoup son notablemente potentes. Además, existe una nueva comunidad activa que sigue desarrollando scripts y ofrece soporte a los nuevos usuarios. Es por eso que Python se utiliza para el web scraping hoy en día. Por lo tanto, vamos a destacar las principales estrategias disponibles en este momento.
Este bloque mostrará al usuario cómo scrapear sitios web complejos utilizando técnicas más sofisticadas integradas en Python. El usuario aprenderá cómo:
Estos enfoques ayudarían a hacer efectivo el scraping de datos Python, minimizando al mismo tiempo las posibilidades de ser bloqueado o denegado el acceso desde el servidor.
Ahora, vamos a proceder a las tácticas sobre cómo hacer scraping en Python de una manera eficaz.
Una plétora de sitios web implementan sistemas de seguridad CAPTCHA como una excelente línea de defensa para salvaguardar su información frente a la sustracción premeditada de datos de Python. Estos sistemas pueden ser vencidos por muchos medios, empleando servicios de reconocimiento automático, como 2Captcha o Anti-Captcha, o utilizando el aprendizaje automático para identificar cognitivamente las imágenes. Otra posibilidad es reducir la cantidad de consultas a un nivel que el tribunal no asocie con una expectativa de recopilación de información.
Para que las consultas sean menos hostiles, los usuarios deben actuar de un modo más cercano al comportamiento normal. Introducir tiempos aleatorios entre las acciones, cambiar de User-Agent, desplazarse por la página, mover el puntero del ratón, simular la escritura, e incluso más. El uso de Selenium o Playwright como herramientas de scraping de Python proporciona a la automatización características mucho más parecidas a las humanas, por lo que se pueden evitar los bloqueos.
import random
import requests
url = 'https://google.com'
user_agents = [
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
]
headers = {
'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',
'accept-language': 'en-IN,en;q=0.9',
'dnt': '1',
'sec-ch-ua': '"Not/A)Brand";v="8", "Chromium";v="126", "Google Chrome";v="126"',
'sec-ch-ua-mobile': '?0',
'sec-ch-ua-platform': '"Linux"',
'sec-fetch-dest': 'document',
'sec-fetch-mode': 'navigate',
'sec-fetch-site': 'none',
'sec-fetch-user': '?1',
'upgrade-insecure-requests': '1',
}
headers['user-agent'] = random.choice(user_agents)
response = requests.get(url=url, headers=headers)
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.action_chains import ActionChains
options = webdriver.ChromeOptions()
options.add_argument("--headless") # Ejecutar el navegador sin interfaz gráfica
driver = webdriver.Chrome(options=options)
driver.get("https://google.com")
# Buscar un elemento por XPath
element = driver.find_element(By.XPATH, "//button[text()=Confirm]")
# Utiliza ActionChains para mover el cursor
actions = ActionChains(driver)
actions.move_to_element(element).perform()
# Cerrar el navegador
driver.quit()
Algunos sitios web incorporan elementos adicionales diseñados para usuarios normales que son invisibles, pero que un bot puede activar accidentalmente. Entre estos elementos se encuentran los formularios ocultos, si se hace clic en ellos y se envían, el sitio bloqueará el acceso del bot. Antes de recopilar datos, utilice estilos y atributos CSS como display: none u opacity: 0 y absténgase de activarlos.
Si las peticiones se realizan sin las cookies o la configuración de sesión correctas, algunos sitios bloquearán las peticiones repetidas que se consideren demasiado sencillas. Para solucionar este problema, utilice requests.Session(), utilice cookies guardadas y actúe como un usuario real. También es necesario cambiar los encabezados User-Agent, ya que el bot será reconocido por ellos.
En caso de que el servidor no responda o devuelva un error temporalmente, haz una pausa antes de verter nuevos intentos de repetir el comando. Es más preferible el backoff exponencial, que consiste en aumentar el tiempo de espera tras cada intento fallido. Por ejemplo, se puede aumentar 1 segundo, 2 segundos, luego 4 segundos, etc. Esto disminuye la posibilidad de ser bloqueado al tiempo que minimiza las limitaciones del sitio web y disminuye la carga de trabajo de raspado de datos con Python.
import time
import requests
def fetch_with_backoff(url, max_retries=5):
retries = 0
wait_time = 1 # Retraso de 1 segundo
while retries < max_retries:
try:
response = requests.get(url)
# Si la solicitud tiene éxito, devuelve el resultado
if response.status_code == 200:
return response.text
print(f"Error {response.status_code}. Retrying in {wait_time} sec.")
except requests.exceptions.RequestException as e:
print(f"Connection error: {e}. Retrying in {wait_time} sec.")
# Esperar antes de reintentar
time.sleep(wait_time)
# Aumentar el retraso
wait_time *= 2
retries += 1
return None
url = "https://google.com"
html = fetch_with_backoff(url)
Algunos sitios web pueden cargar el contenido por etapas, o pueden funcionar sólo al recibir alguna entrada del usuario. En estos casos, es poco probable que bibliotecas como BeautifulSoup sean de ayuda. En este caso, el web scraping con Selenium, Puppeteer y Playwright será de gran ayuda. Permiten abrir páginas como lo haría un usuario normal, es decir, haciendo clic en botones, escribiendo texto o interactuando con los elementos de la página.
Algunas páginas web no utilizarán JavaScript para mostrar datos hasta que el usuario haya accedido a la página. Con esto, una petición HTTP estándar no obtendrá toda la información necesaria. Selenium se puede utilizar para recopilar dicha información, o las solicitudes de red se pueden escudriñar utilizando DevTools del navegador. Esto ayuda en la detección de puntos finales de API ocultos, que más tarde pueden ser utilizados para la recuperación de información con un mínimo de molestias.
La inmensa mayoría de los sitios web pasan las solicitudes automatizadas al servidor para su posterior procesamiento. Es bien sabido que algunos sitios web verifican las huellas dactilares TLS como medio para distinguir las solicitudes automatizadas. Eso significa que el servidor estudia varios atributos de conexión como la atención TLS/SSL usando tecnología, cifrados y otras conexiones sofisticadas. Lograr eso podría hacerse mezclando atributos de conexión en las peticiones utilizando cabeceras y proxies personalizados.
import requests
url = 'username:password@your-proxy'
proxy = 'your-proxy'
proxies = {
"http": f"http://{proxy}",
"https": f"https://{proxy}",
}
response = requests.get(url=url, proxies=proxies)
Si un sitio web ofrece una API pública, es aconsejable utilizarla en lugar de recurrir al scraping. Este método es más rápido, más fiable y tiene menos probabilidades de ser bloqueado. Un buen punto de partida para encontrar un punto final de API es comprobar las solicitudes que realiza el sitio web, que es visible en DevTools. En ausencia de una API, tendrás que trabajar con el código HTML.
Los sitios web pueden modificar su código, lo que puede retrasar su rastreo. Como contrapartida, considere lo siguiente:
En algunos casos, el web scraping con Python de sitios web puede incumplir sus condiciones de uso o incluso considerarse ilegal en determinadas jurisdicciones. Es imperativo examinar tanto robots.txt como los términos de servicio junto con la política del sitio antes de raspar datos. También es mejor utilizar una API pública si existe. Además, establezca límites en el número de solicitudes para minimizar la carga del servidor.
El web scraping avanzado con Python tiene sus propias ventajas, pero hacerlo de la forma correcta también es igual de importante. Hemos discutido aspectos importantes de dicho proceso en relación con eludir CAPTCHA, simular acciones de usuario, gestionar cookies y sesiones, tratar con honeypots y examinar datos en aplicaciones web asíncronas.
Además, ten en cuenta el aspecto moral y el acuerdo pertinente del sitio utilizado. Utiliza los puntos finales de la API cuando estén disponibles y, si el análisis sintáctico de HTML es inevitable, sigue todas las directrices para reducir las posibilidades de ser bloqueado y tener complicaciones legales.
Con el uso de este tutorial de métodos de web scraping con Python, el potencial de riesgo se puede reducir en gran medida, mientras que la eficacia se puede aumentar al máximo.
Мы получили вашу заявку!
Ответ будет отправлен на почту в ближайшее время.
С уважением proxy-seller.com!
Comentarios: 0