freishner

Capo
Se incorporó
16 Noviembre 2021
Mensajes
436
Alguien por ahí me pidió (sí, los hago a pedido :santo) éste script para bajarse fotos de acáp (entre bajo su riesgo).
Yo se que mas de alguno por acá tiene la ilusión de guardar las fotiwis de las nudes, así que se los dejo de regalo, total ya está pagado el trabajo y me da no se qué dejarlo ahí tirado, a parte que se que a varios les gusta/intriga el web scraping ;)

Advertencia:
No me hago responsable de nada, Úselo con responsabilidad. No lo use en el compu de la pega. Ni en el de la pareja.

Versión de Python: 3.8 (no he probado anteriores)
Módulos necesarios:
  • lxml
  • requests
Instrucciones para sistemas basados en debian (debian, ubuntu, mate...)

Instalar Python LXML
Bash:
sudo apt-get install python3-lxml

Instalar módulo Requests
Bash:
pip3 install requests

Instalar módulo CSS Select
Bash:
pip3 install cssselect

Uso:

Es una herramienta CLI, tiene 2 parámetros, el nombre de la carpeta donde se guardará todo, y la url. Además en el source tiene que asignarle una carpeta a la variable packsFolder en la línea 8, para que todos los "packs" se guarden en un lugar definido.

Si hizo todo bien la ejecución debería ser algo así:

1652848210177.png

Luego, como tenemos configurada la carpeta img para guardar los packs, se debería ver algo así:


¿Cuanto cuesta algo así?

El cliente pagó 80K. Y estuvo entre el almuerzo y la once. (Para saciar su curiosidad).

PD: No baja fotos de instagram... ese no es gratis (y esa cazuela se está cocinando todavía)...
PD2: Se viene el medio asado el fin de semana :xd

Source
Python:
# -*- coding: utf-8 -*-
from lxml import html
from os import mkdir
from os.path import basename, exists
from sys import argv
from requests import get
# SETUP PACKS FOLDER HERE
packsFolder = './img/'
def run():
    if len(argv) < 3:
        print('[ERROR] Folder name not given!')
        print('[ERROR] Portalnet.cl url not given!')
        exit()
      
    if not 'https://www.portalnet.cl/temas/' in argv[2]:
        exit('[ERROR] Given URL do not match to Portalnet.cl!')
      
    packOutFolder = f"{packsFolder}{argv[1]}"
  
    # ADD / AT END OF PATH
    if packOutFolder[-1] != '/':
        packOutFolder += '/'
      
    # CREATE FOLDER
    if not exists(packOutFolder):
        print(f"[INFO] Creating: '{packOutFolder}'...", end='')
        mkdir(packOutFolder)
        print('[DONE]')
    # REQUEST HTML
    r = get(argv[2])
    if r.status_code == 200:
        dom = html.fromstring(r.text)
        imgList = dom.cssselect('#messageList')[0] \
            .cssselect('li')[0] \
            .cssselect('blockquote.messageText')[0] \
            .cssselect('img.bbCodeImage')
        imgLinks = [img.get('data-src') for img in imgList]
      
        # DOWNLOAD PHOTOS
        if len(imgLinks) > 0:
            print(f"[INFO] {len(imgLinks)} photos found!")
          
            for imgLink in imgLinks:
                imgName = f"{packOutFolder}{basename(imgLink)}"
              
                print(f"[INFO] Downloading: {imgLink}...", end='')
              
                # AVOID IF ALREADY EXISTS
                if exists(imgName):
                    print('[AVOID: ALREADY EXISTS!]')
                    continue
              
                with get(imgLink, stream=True) as imgR:
                    if imgR.status_code == 200:
                        with open(imgName, 'wb') as imgFile:
                            for chunk in imgR.iter_content(chunk_size=8192):
                                imgFile.write(chunk)
                        print('[COMPLETE]')
                    else:
                        print(f"[ERROR: HTTP CODE {imgR.status_code}]")
        else:
            print('[INFO] No photos found in first thread!')
              
    else:
        exit("\n[ERROR] HTTP_CODE: " + r.status_code)
      
# CLI PARAMETERS
# 1: FOLDER NAME INSIDE packsFolder
# 2: PORTALNET LINK
if __name__ == '__main__':
    try:
        run()
    except KeyboardInterrupt as e:
        print('\n\n...Aborted!')
 
Última modificación:

tglaria

InExperto
Se incorporó
10 Febrero 2005
Mensajes
9.753
Vamos a echarle un vistazo al codigo.

Hace rato que ando con ganas de aprender webscrapping.
 
Upvote 0

freishner

Capo
Se incorporó
16 Noviembre 2021
Mensajes
436
Vamos a echarle un vistazo al codigo.

Hace rato que ando con ganas de aprender webscrapping.

Dale una mirada al módulo lxml, la gracia del web scraping es parsear el dom y mirar con el inspector de código para hacer los requests que hagan falta.

Tambien está Selenium para Python. Es para hacer pruebas, pero tambien sirve como scraper.
 
Upvote 0

buhoblue

Casi-gamer
Se incorporó
30 Septiembre 2020
Mensajes
723
será posible algún videito simple de como poder hacerlo? Si no es mucha la patudes.
 
Upvote 0

tglaria

InExperto
Se incorporó
10 Febrero 2005
Mensajes
9.753
@freishner
En Windows, hay que instalar el paquete 'cssselect' para que funcione.

Personalmente estoy acostumbrado a usar nombres más descriptivos para las variables.
Consulta, ¿no sería mejor usar hebras para la descarga de imágenes?
Encuentro lento el descargarlas una tras otra de manera secuencial.

Por cierto, no funciona cuando la ruta de las fotos tienen argumentos/parámetros en su enlace (e.g.: url_foto.png?width=1024)

será posible algún videito simple de como poder hacerlo? Si no es mucha la patudes.
¿ No será mucho ?
 
Última modificación:
Upvote 0

freishner

Capo
Se incorporó
16 Noviembre 2021
Mensajes
436
@tglaria
En Windows, hay que instalar el paquete 'cssselect' para que funcione.
En Linux tambien, si no lo mencionas ni me acuerdo.

Personalmente estoy acostumbrado a usar nombres más descriptivos para las variables.
Me vendría bien un ejemplo.

Personalmente estoy acostumbrado a usar nombres más descriptivos para las variables.
Consulta, ¿no sería mejor usar hebras para la descarga de imágenes?
Encuentro lento el descargarlas una tras otra de manera secuencial.
Sí, de hecho se puede implementar un ThreadPool con ThreadPoolExecutor (módulo concurrent.futures), pero eso quedará para cuando el cliente diga que es lento y abra la posibilidad de una actualización. Lo hubiera hecho mas lento, pero se notaría :xd

Por cierto, no funciona cuando la ruta de las fotos tienen argumentos/parámetros en su enlace (e.g.: url_foto.png?width=1024)
¿Me podrías pasar la url en específico que intentaste descargar?

será posible algún videito simple de como poder hacerlo? Si no es mucha la patudes.
No lo veo muy viable, sólo los hago para la clientela en formato paso a paso como capacitación.
 
Upvote 0

tglaria

InExperto
Se incorporó
10 Febrero 2005
Mensajes
9.753
Me vendría bien un ejemplo.
Leyendo con más calma, creo que es sólo para un par de casos (que para esta aplicación no es realmente relevante): las variables <r> y <imgR>. Pero es tan acotado su uso que es irrelevante para este caso.

¿Me podrías pasar la url en específico que intentaste descargar?
Las de este enlace.
El error se produce al querer guardar el archivo en Windows.
Quizá en linux no ocurre el problema.
 
Upvote 0

freishner

Capo
Se incorporó
16 Noviembre 2021
Mensajes
436
Contruyo cosas parecidas en ruby + watir, quedan piolas en modo headless
Vi que tienen soporte para Python, lo voy a probar.

Por curiosidad, pq los textos son en inglés y no español?
olvidé consultar eso mismo...
Fué solicitud del cliente.

Ambas variables corresponden a una respuesta de un request. Son abreviaciones de response e imagenResponse respectivamente.

Las de este enlace.
El error se produce al querer guardar el archivo en Windows.
Quizá en linux no ocurre el problema.
Ya sé a lo que te refieres. Gracias
 
Upvote 0
Subir