Рубрики
Без рубрики

Web Scraping Con Python

Соскабливание es una técnica para leer y externer datos de un sitio web cuando no ence uned que nos p … Tagged с помощью Python, Scraping, HTML.

Сскабливание 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 etiqueta IMG . El Atributo SRC 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:

  1. Comenzará Haciendo un запросить a la url /просматривать/
  2. Del Código html debe obtener las url de los обои
  3. Luego debe форматер las url para quitar el resize
  4. Procesar las descargas de las imágenes
  5. 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:

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 variable output_file Анкет
  • Por último usamos shutil.copyfileobj Para Copiar el Contenido de WP_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”