Created
June 13, 2018 00:33
-
-
Save ssalvatella/6acaf5d6f61a29c49d305030f80b67e5 to your computer and use it in GitHub Desktop.
Pequeño ejemplo de script de web scraping sobre la web plusdede.com
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import time | |
import subprocess | |
from bs4 import BeautifulSoup | |
from PIL import Image | |
from selenium import webdriver | |
from selenium.webdriver.chrome.options import Options | |
from selenium.common.exceptions import TimeoutException | |
from selenium.webdriver.support.ui import WebDriverWait | |
from selenium.webdriver.common.by import By | |
from selenium.webdriver.support import expected_conditions as EC | |
URL = "https://www.plusdede.com" | |
opciones = Options() | |
opciones.set_headless(headless=True) | |
opciones.add_argument("log-level=3") | |
# Arrancamos el navegador | |
navegador = webdriver.Chrome("chromedriver", chrome_options=opciones) | |
def guardar_captcha(elemento, ruta): | |
# Obtenemos la posición y la medida del elemento | |
posicion = elemento.location | |
medida = elemento.size | |
# Guardamos una imagen de la página en la ruta indicada | |
navegador.save_screenshot(ruta) | |
# Utilizamos la librería para abrir la imagen en memoria | |
image = Image.open(ruta) | |
# Obtenemos las coordenadas a recortar de la imagen | |
izquierda = posicion['x'] | |
arriba = posicion['y'] | |
derecha = posicion['x'] + medida['width'] | |
abajo = posicion['y'] + medida['height'] | |
# Recortamos la imagen para dejar solo el captcha | |
imagen = image.crop((izquierda, arriba, derecha, abajo)) | |
# Guardamos la imagen después de recortarla | |
imagen.save(ruta, 'png') | |
return image | |
def login(usuario, contraseña): | |
print("Entrando en Plusdede.com para realizar login...") | |
navegador.get(URL + "/login") | |
captcha = navegador.find_element_by_css_selector("img") | |
guardar_captcha(captcha, "captcha.png") # guarda el captcha en un fichero | |
Image.open("captcha.png").show() # mostramos la imagen en el visor por defecto | |
# Se escribe el captcha y se pone en el input | |
texto_captcha = input("Introduce los números de la imagen: ") | |
campo_captcha = navegador.find_element_by_id("input-captcha") | |
campo_captcha.clear() | |
campo_captcha.send_keys(texto_captcha) | |
# Se escribe el usuario y la contraseña en el resto de campos | |
campo_usuario = navegador.find_element_by_id("input-email") | |
campo_usuario.clear() | |
campo_usuario.send_keys(usuario) | |
campo_contraseña = navegador.find_element_by_name("password") | |
campo_contraseña.clear() | |
campo_contraseña.send_keys(contraseña) | |
boton_entrar = navegador.find_element_by_css_selector("button") | |
boton_entrar.click() | |
# Esperamos un máximo de 3 segundos a que aparezca el elemento 'username' en la página | |
try: | |
WebDriverWait(navegador, 3).until( | |
EC.presence_of_element_located((By.CLASS_NAME, 'username')) | |
) | |
except TimeoutException: | |
return False | |
return True | |
def mostrar_capitulos_pendientes(): | |
print("Tienes pendientes los siguientes capítulos: ") | |
# Utilizamos BeautifulSoup para parsear el código de la página del navegador | |
pagina = BeautifulSoup(navegador.page_source, "html.parser") | |
# Obtenemos todos los elementos que contengan capítulos | |
capitulos = pagina.findAll("div", {"class": "media-container"}) | |
# Recorremos cada capitulo | |
for capitulo in capitulos: | |
# Obtenemos el nombre del capítulo | |
nombre = capitulo.find("div", {"class": "media-title"}).getText() | |
# Obtenemos el enlace a la serie | |
enlace = capitulo.find("a", {"data-container": "body"})['href'] | |
# Imprimimos por pantalla cada capítulo pendiente de ver | |
print("-> " + nombre + " " + enlace) | |
## SCRIPT ## --- | |
if login("ErKilloKoh", "tzuqng"): | |
print("Logeado correctamente!") | |
mostrar_capitulos_pendientes() | |
else: | |
print("Error en el login.") | |
navegador.quit() # Cerramos el navegador |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment