Сскабливание es una técnica para ler y extra datos de un sitio web cuando no ence on medio nos ormita obtener está información “por el buen camino”, como una api rss. Эль Сскабливание Está relacionado a lo que hoy conocemos como Crawler , o Smailymente бот Анкет
Sin ir más lejos google y los demás buscadores tienen bots que indexan la web constantemente almacenando toda la información que luego ves en restaudos de búsqueda. Pero no Solo los buscadores utilizan Сскабливание , También Sitios Como Los Comparathadores de Precios de Proklos, Hoteles, Vuelos, Y Muacos Otros Más.
Lo Que quiero mostrarte en este post es que nosotros programos nuestro propio bot, ya que se trata de una técnica que podemos aprender sin mayores Проблемы. Нет никаких программ Salir и El Proximo Google, Pero Por Ejemplo vas Poder Programar un bot para hacer un seguimiento del precio de ese producto que queres, o para consultar los titululares de los sitios de naticias que lees. Диарио. Y lo cool es que con un poco de ingenio podemos lograr cosas muaco más increíbles.
Si te Interesa conocer esta técnica más a fondo te Recomiendo el libro ” Скраивание с помощью Python “. Con Solo unos capítulos vas antender lo potente que es el Сскабливание , y como infularlo con python 🐍.
Пойдем!
¿Cómo Funciona el Scraping?
Существует Distintas técnicas, pero lo normar es scrapear un sitio web a través del código Html , indicándole a nuestro bot que Tags y atributos debe buscar para incontrar la información Que Queremos.
Imaginemos que deseamos obtener los titulures de unitio de naticias que tiene la siguiente estructura html:
Nuestro Software Debería buscar la etiqueta раздел
que actúa como un wrapper de las naticias, obtener todos los теги H1
, y de allí extreer la etiqueta A
que contiene el título y la url de las naticias.
Esto es solo un sencillo ejemplo para que vayas entendiendo La Idea, y Que te servirá para comprender mejor lo que vamos программа.
¿ Qué Vamos программа?
ESSISE ON SITIO GENIAL LLAMADO Простые рабочие столы que contiene una colección super cool de обои на обои, y nuestro bot encargrá de Recorrer las distintas páginas de esta web y descargar Automáticamente todos los обои 👏👏👏.
Como ves, lo diverertido del Сскабливание Es Que el Limite lo pone tu Imaginación.
Pero primero analicemos la estructura delitio y el código html, ya que esto nos ormitirá comprender que pasos debe seguir nuestro bot para cumplir su objetivo:
- La web contiene una paginación tipo
/просматривать/
,/просмотр/1/
,/просмотр/2/
и т. д., Donde Se Muestran Los обои. - Када обои es un
div
que dentro contiene una etiquetaIMG
. El AtributoSRC
de esta eTiqueta es lo que nos ounte ja que contiene la url para descargar el обои. - El Sitio USA Un Generador De Thumbnails Que viene Immenticito en la url de las imágenes, pero si elminamos el texto que hace referencia Al Resize Accedemos a la Imagen Оригинал: Apple_park.png ~~ .295x184_Q100.png ~~ 😎.
- La url hacia la próxima página la podemos obtener del tag
A
Анкет
Con La Información Передняя подростка Ver que el algoritmo debe hacer lo siguiente:
- Comenzará Haciendo un запросить a la url
/просматривать/
- Del Código html debe obtener las url de los обои
- Luego debe форматер las url para quitar el resize
- Procesar las descargas de las imágenes
- Obtener la url de la página siguiente y volver a comenzar
Гениальные, ahora que ya sabemos lo que tenemos que hacer, emececemos con la parte diverertida … ¡Кодовая! 🎈
¿Como Programar un bot en python?
Estas Son Las Librerías Que vamos usar:
- Операционные системы : para manejo de rutas de archivos y carpetas
- Re : para expresiones argites
- Shutil : Para Operaciones con Archivos
- Запросы : Para Realizar Peticiones http
- BeautifulSoup : para Pacersear El Código Html, es el corazón de nuestro bot ❤
BeautifulSoup y Запросы сын дос библиолрис Que Нет Vienen Incluidas con Python, por lo que tendrás que stalarlas con con пип
:
$ pip install beautifulsoup4 $ pip install requests
Para Hacer El Código Más Beignible y FACIL DE DEBUGEAR IREMOS SEARANDO LA Lógica EN Funciones, Cada Una de Las Cuales Cumplirá una Tarea Special.
Bien, primero te Recomiendo Que crees una carpeta para este proyecto y dentro Эль -Архиво simpledesktop-bot.py
, al cual comenzaremos ampormando las librerías:
import os import re import shutil import requests from requests.exceptions import HTTPError from bs4 import BeautifulSoup
El Punto de Entrada A Nuestra App Será la función init ()
, Que Funciona como un конструктор . Allí setearemos los datos iniciales, como la url del sitio web, el path desde donde comenzara a correr el el bot, y el degerio donde guardemos los обои. Por defecto se creará la carpeta Обои
DENTRO DEL DEHERENIO DE NUESTRO PROYECTO Y ALLí Haremos Las Descargas. Para ello primero chequeamos con OS.Path.exists
Si Este Directorio ya Essave, y de no exectir lo creamos con Os.madkedirs
.
Por último llamamos a la función ProcessPage ()
que iniciará el scraping.
def init(): url = 'http://simpledesktops.com' first_path = '/browse/' download_directory = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'wallpapers') if not os.path.exists(download_directory): os.makedirs(download_directory) processPage(url, first_path, download_directory)
ProcessPage ()
es un que se se encargará de realizar las llamadas a las demás funciones. Por Parámetro Recibirá la url inicial y Cada ejecución se vuelve a llamar Recursivamente Reciedo la nueva página a procesar, lo cual nos permite hacer un loop que finalizará al alcanzar la última página.
La Primera función Llamada es getPageContent ()
, Que Recibe por parámetros las переменные URL
y Путь
, con las cuales hace el effer http y devuelve un diccionario con estos datos:
- изображения : es una lista con las url de los обои на обоях
- Next_Page : contiene la url de la siguiente página a procesar
La Segunda Función Que ejecuta es Скачать wallpaper ()
A La Cual Le Pasaremos las url de los обои y se encargará de procesar las descargas.
Por último tenemos la Recurusión, verificamos si Next_Page
Tiene un Valor asignado y volvemos a llamar a ProcessPage ()
con el nuevo Путь
Анкет
def processPage(url, path, download_directory): print('\nPATH:', path) print('=========================') wallpapers = getPageContent(url + path) if wallpapers['images']: downloadWallpaper(wallpapers['images'], download_directory) else: print('This page does not contain any wallpaper') if wallpapers['next_page']: processPage(url, wallpapers['next_page'], download_directory) else: print('THIS IS THE END, BUDDY')
Como dije aydermente getPageContent ()
Es La Primer función llamada por ProcessPage ()
, y su objetivo es retornar las url de los обои y la url de la página siguiente.
Primero definimos las переменные изображение
y Next_Page
Que Guardarán Los Datos a Retornar, y las inicializamos convolores por defecto.
Luego llamamos a la función requestPage ()
( para que el código sea más fácil de leer he abrdsído el Запросить http a su propia función, Que Veremos más Adelante ) Que nos retornará el código html listo para ser manipulado. Y Aquí es Donde Veremos La Magia de Beautifulsoup! Primero Vamos USAR El Método find_all
Para obtener todos los обои Que, tal como vimos en el análisis de la estructura html, están esprestados por El Tag div
, y los Guardamos en la переменная Обои
Анкет Luego iteramos estos elementos y usando el método Найти
Buscaremos La Etiqueta IMG
, de la cual ovendremos el atributo SRC
que contiene la url del обои. Conste Dato Iremos Apployando Nuestra Lista изображения
Анкет
Por último buscamos el Tag A
, Extremos su url del atributo href
y lo asignamos a la переменная Next_Page
Que Creamos al
RETORNAMOS картинки
y Next_Page
en un diccionario.
def getPageContent(url): images = [] next_page = None html = requestPage(url) if html is not None: # Search wallpapers URL wallpapers = html.find_all('div', {'class': 'desktop'}) for wp in wallpapers: img = wp.find('img') images.append(img.attrs['src']) # Search for next page URL try: more_button = html.find('a', {'class':'more'}) next_page = more_button.attrs['href'] except: pass return {'images': images, 'next_page': next_page}
Передний USAMOS LA Función requestPage ()
, Que Tal Como Dijimos, SE Encarga del запрос Http y de retornar el html ya parseado. Пара -запрос USAMOS requests.get
y Guardamos el Pailload en la переменная raw_html
. Por último parseamos el html plano con Beautifulsoup Y LO RETORNAMOS.
Con Попробуйте/кроме
nos aseguramos de recepresar los errores y mostrar sus соответственно ошибка Mensajes de.
def requestPage(url): try: raw_html = requests.get(url) try: html = BeautifulSoup(raw_html.text, features='html.parser') return html except: print('Error parsing HTML code') return None except HTTPError as e: print(e.reason) return None
La Segunda función llamada por ProcessPage ()
es Скачать wallpaper ()
, Que Recibe la Lista de url y descarga los обои.
La Primer Tarea de esta función es Hacer una pequeña modificación url url, porque recquientemos que el sitio web un un un generador de thumbnails que viene inmenticito en El Nombre de la Imagen, y sin esta modificación estaríamos descargando un обои de 300×189 px Анкет Quitando Este Resize Vamos A Poder Descargar Las Imágenes en Su Tamaño Original. Veamos un ejemplo:
http://static.simpledesktops.com/uploads/desktops/2020/03/30/piano.jpg.300x189_q100.png
Pongamos la atención en el nombre del обои, vemos que en primer lugar se incluye el nombre del archivo con su extensión оригинал (piano.jpg) y luego el “código” del resize (300x189_q100.png). Lo Que necesitamos es obtener la misma url pero sin esta última parte, para lo cual vamos usar una expresión regraging.
Con la regex '^.+? (\. Png | jpg)'
Buscamos la Primer ocurrencia de .png
o .jpg
Comenzando Desde el Inicio de la url. Si hay match obtenemos todo ese string, con lo cual nos quedará la url sin el resize, y si no kay match quiere decir Que Que Нет encuentra la extensión de la Imagen y por lo tanto Нет es Una url válida.
Siguiendo con el Código, en la переменная file_path
Generamos la ruta oppla a la imagen y chequeamos si ya ense en nuestro disco para Нет Volver A Descargar. Si la Imagen No Essaine Haremos lo Siguiente:
- Усамос
request.get
para obtener la Imagen por потоковая передача y Guardamos la Serirecia a este objeto en la переменнаяWP_FILE
Анкет - Con la función
Open
Abrimos el Archivo Local (Que Será Creado en Este Momento, Aunque Se encontrará vacio) en modo binario y escritura, y lo serireciamos con el nombre de variableoutput_file
Анкет - Por último usamos
shutil.copyfileobj
Para Copiar el Contenido deWP_FILE
Dentro deвыходной файл
Conso ya tendremos descargado el обои en nuestro disco.
Los Bloques с
nos ormitirán liberar Automáticamente la memoria usada por python para el http y la creación del archivo local, por lo cual podemos -процедура A Descargar El Siguiente обои.
def downloadWallpaper(wallpapers, directory): for url in wallpapers: match_url = re.match('^.+?(\.png|jpg)', url) if match_url: formated_url = match_url.group(0) filename = formated_url[formated_url.rfind('/')+1:] file_path = os.path.join(directory, filename) print(file_path) if not os.path.exists(file_path): with requests.get(formated_url, stream=True) as wp_file: with open(file_path, 'wb') as output_file: shutil.copyfileobj(wp_file.raw, output_file) else: print('Wallpaper URL is invalid')
Eso Es Todo, Solo Resta Incluir La Llamada a la función init ()
que da inicio a la ejecución del código:
init()
Para poner a correr nuestro bot abrimos una consola En El Directorio del proyecto y ejecutamos el comando Python3 simpledesktop-bot.py
, y veremos algo como lo siguiente:
$ python3 simpledesktop-bot.py PATH: /browse/ ========================= /Users/MyUser/simple-desktop-scraper/wallpapers/sphericalharmonics1.png /Users/MyUser/simple-desktop-scraper/wallpapers/Dinosaur_eye_2.png /Users/MyUser/simple-desktop-scraper/wallpapers/trippin.png ... PATH: /browse/2/ ========================= /Users/MyUser/simple-desktop-scraper/wallpapers/Apple_Park.png /Users/MyUser/simple-desktop-scraper/wallpapers/triangles.png /Users/MyUser/simple-desktop-scraper/wallpapers/thanksgiving_twelvewalls.png ... PATH: /browse/3/ ========================= /Users/MyUser/simple-desktop-scraper/wallpapers/minimalistic_rubik_cube_2880.png /Users/MyUser/simple-desktop-scraper/wallpapers/Nesting_Dolls.png /Users/MyUser/simple-desktop-scraper/wallpapers/flat_bamboo_wallpaper.png
El Código Apployo Lo Podes Encontrar en El Repositorio de github y si te gustó dejale una estrellita al Repo 😉 SimpleSktop-Bot
Заключение
En Primer Lugar Gracias Por Haber Llegado Hasta Acá, значение Muaro Para Mí Que keaas Leído Este Post.
Espero que hayas podido aprender algo nuevo ya que ese es mi objetivo, y si es aTy Envonnicts dejame un Comment o mandame un tweet porque me gustaría saberlo.
También me gustaría conocer sus propios bot, así que si te animas a desarrollar uno contame porque me urdesa sabre. Y si crees que podes aportar nuestro Simple Desktop Bot (Porque También Es Tuyo) заставляет оживить запрос на вытягивание Mandarme un. Нет сена, коса, que me gustaría más.
Si te gusta mi contenido me ayudarías mucio difundiéndolo con tus amigos o en foot de twitter, y si te gustaría que escriba sobre elgo en common dejame un comment. ESPERO TU ОТВЕТСТВЕННАЯ ПАРА ПАРА МЕДЖОРАНДО CON CADA NUEVO POST ❤.
Оригинал: “https://dev.to/luciano_dev/web-scraping-con-python-1kl3”