Descargar archivo por FTP con Python

Si necesitamos descargar algún archivo desde un servidor remoto, lo podemos hacer gracias a Python.
Entre las diferentes utilidades que se le puede dar a este pequeño pedazo de código seria la de por ejemplo hacer descargar los Backups de un servidor de forma automática.

 

"""
Recursively backup all the files from a remote directory using ftp.
"""

# information about the source ftp server
# and the target directory on my laptop

hostname = 'ftp.dlptest.com'
username = '[email protected]'
password = 'e73jzTRTNqCN9PYAAjjn'
start_directory = '/'
backup_dir = 'C:\\Users\\Oficina\\Desktop\\back_wp\\hidro\\'

import ftplib
import os
import datetime

def get_files_directories():

    dirlisting = []
    
    ftp_obj.retrlines('LIST',callback=dirlisting.append)
    
    files = []
    directories = []
    
    for l in dirlisting:
        lastspace = l.rindex(' ')
        file_name = l[lastspace+1:]
        if l[0] == 'd':
            directories.append(file_name)
        elif l[0] == '-':
            files.append(file_name)
            
    return files,directories
    
def backup_directory(local_dir,remote_dir):

    os.chdir(local_dir)
    ftp_obj.cwd(remote_dir)
    print('In directory '+remote_dir)

    files,directories = get_files_directories()

    for f in files:
        print('Backing up OK'+f)
        try:
            ftp_obj.retrbinary('RETR '+f, open(f, 'wb').write)
        except ftplib.error_perm:
            print('Skipping '+f+' due to permissions')
        
    for d in directories:
        newremote = remote_dir+d+'/'
        newlocal = local_dir+'\\'+d
        try:
            os.mkdir(newlocal)
        except:
            continue
        backup_directory(newlocal,newremote)
        
# Main program

# backup directories under here

os.chdir(backup_dir)

# Create directory with today's date

datestring = str(datetime.date.today())

os.mkdir(datestring)
os.chdir(datestring)
local_dir = os.getcwd()

# connect to ftp server

ftp_obj = ftplib.FTP(host=hostname, user=username, passwd=password)

# back up everthing from top directory

remote_dir = start_directory

backup_directory(local_dir,remote_dir)

# quit ftp connection

ftp_obj.quit()


Espinear textos con Python (FÁCIL)

Si tenemos un texto en formato “spin”  queremos transformarlo en texto normal este código en python nos hará el trabajo.

 """Ejemplo Texto Spin:

    Hola {mi nombre|me llamo|soy} {Antonio|Toni|Juan} y me gustan {los coches|las motos|los caballos}
    
    """


def spin(content):
   
    start = content.find('{')
    end = content.find('}')

    if start == -1 and end == -1:
        #none left
        return content
    elif start == -1:
        return content
    elif end == -1:
        raise "unbalanced brace"
    elif end < start:
        return content
    elif start < end:
        rest = spin(content[start+1:])
        end = rest.find('}')
        if end == -1:
            raise "unbalanced brace"
        return content[:start] + random.choice(rest[:end].split('|')) + spin(rest[end+1:])

 

¿Como hacer comentarios en Python? (SOLUCIÓN)

Los comentarios es algo muy importare a la hora de programar, ya sea para dar información adicional para un futuro como para ayudar a otras personas involucradas en el proyecto.

Para comenta podremos utilizar la almohadilla “#” para comentar una linea o tres comillas para comentar un texto mas largo.

# Aqui pedimos el nombre

nombre = input=('¿Cual es tu nombre?')

# Esta linea hace que se imprima el resultado

print ('Tu nombre es: ' + nombre)

"""
Así de simple es comentar en Python, ESTO ES PARA COMENTAR UN TEXTO MAS LARGO O EN 

                VARIAS LINEAS

   Recuerda: Comentar es importante y ayuda a que tu trabajo sea mas fácil de entender por otros humanos, las maquinas ignoran estas lineas
"""

Selenium Navegador Basico (EJEMPLO PYTHON)

Selenium es la librería que mas cariño le tengo, ya con ella empece a programar en Python.

Mis inquietudes que me hicieron empezar a programar fue la creación de bots y esta librería es la mejor, cierto es que con el paso del tiempo me estoy haciendo mas purista.

Ejemplo para lanzar el navegador Firefox:

from selenium import webdriver
driver = webdriver.Firefox()
driver.get('https://noteando.com/')

Modulo requests de Pytho (EJEMPLOS)

Este es uno de mis modulo preferidos por su sencillez y gran potencia, para que veas lo fácil que es, solo necesitamos dos lineas, la tercera es para validar la conexión.

Ejemplo:

import requests
html = requests.get('https://noteando.com/')
html.encoding = 'utf-8'
print (html.status_code) # Si respondo 200 es que todo esta OK

 

El modulo requests de python se utiliza para conectarnos a diferentes paginas por diversos motivos.

Este ejemplo se basa a la hora de hacer algún bot o script el cual queremos que pase lo mas desbastecido posible.

Para hacer esto tenemos que crear una cabecera convincente y no esta de mas añadir un referer a nuestra cabecera.

import requests

user_agent = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36'

referer = 'https://noteando.com/'

header = {'User-Agent': user_agent , 'referer': referer }
 
html = requests.get('https://noteando.com/test-referer.php', headers = header, verify=False, stream=True)
html.encoding = 'utf-8'
print (html.text) # Aquí veras el código fuente de la pagina

Información Añadida:

El User-Agent: Esta es una información que les tramite nuestro navegador a pagina que estamos visitando para mejorar nuestra experiencia como usuario entre otras funciones.

El referer: Le informa a la pagina de donde llegamos, es decir la pagina donde hemos hecho click para llegar aquí.

 

Y Ahora con Proxys:

import requests

user_agent = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36'

referer = 'https://noteando.com/'

http_proxy  = "http://10.10.1.10:3128"
https_proxy = "https://10.10.1.11:1080"
ftp_proxy   = "ftp://10.10.1.10:3128"

proxyDict = { 
              "http"  : http_proxy, 
              "https" : https_proxy, 
              "ftp"   : ftp_proxy
            }


header = {'User-Agent': user_agent , 'referer': referer }
 
html = requests.get('https://noteando.com/test-referer.php', headers = header, verify=False, stream=True , proxies = proxyDict)
print (html) # Aquí veras el código fuente de la pagina