Bienvenido, Invitado
Tienes que registrarte para poder participar en nuestro foro.

Nombre de usuario/Email:
  

Contraseña
  





Buscar en los foros

(Búsqueda avanzada)

Estadísticas del foro
» Miembros: 22
» Último miembro: Wandajeowl
» Temas del foro: 49
» Mensajes del foro: 68

Estadísticas totales

Usuarios en línea
Actualmente hay 18 usuarios en línea.
» 0 miembro(s) | 18 invitado(s)

Últimos temas
Web scraping con python B...
Foro: Python
Último mensaje por: chujalt
10-08-2019, 20:44
» Respuestas: 0
» Vistas: 9
Web scraping con python y...
Foro: Python
Último mensaje por: chujalt
05-08-2019, 21:13
» Respuestas: 0
» Vistas: 22
Uno mas por aqui
Foro: Presentaciones
Último mensaje por: AdrianSoloLinux
02-04-2019, 15:28
» Respuestas: 2
» Vistas: 608
Herramientas libres
Foro: Charla
Último mensaje por: chujalt
14-01-2019, 23:37
» Respuestas: 5
» Vistas: 1,261
Me presento
Foro: Presentaciones
Último mensaje por: chujalt
22-12-2018, 20:55
» Respuestas: 1
» Vistas: 636
Hola compae !!
Foro: Presentaciones
Último mensaje por: chujalt
27-10-2018, 19:12
» Respuestas: 3
» Vistas: 2,280
Instalar micropython en W...
Foro: Wemos
Último mensaje por: chujalt
23-10-2018, 16:48
» Respuestas: 0
» Vistas: 533
Instalar micropython en N...
Foro: Nodemcu
Último mensaje por: chujalt
22-10-2018, 18:38
» Respuestas: 0
» Vistas: 502
Recuperar GRUB después de...
Foro: Linux
Último mensaje por: chujalt
25-09-2018, 17:35
» Respuestas: 0
» Vistas: 1,358
Nodemcu, controlar encend...
Foro: Nodemcu
Último mensaje por: chujalt
24-09-2018, 17:30
» Respuestas: 2
» Vistas: 4,831

 
  Web scraping con python BeautifulSoup y MySql
Enviado por: chujalt - 10-08-2019, 20:44 - Foro: Python - Sin respuestas

Saludos.

Vamos a recoger los datos que nos interesan de una página web y los vamos a meter en una base de datos MySql para su almacenamiento y posteriormente tratar esos datos como mas nos convenga.

Yo trabajo en entorno linux, pero bajo Windows o MAc debería funcionar igual.

Para poder realizar este trabajo necesitaremos tener instalado MySql en nuestro PC. Además, entre otras librerías tenemos que tener instalada la de BeautifulSoup y el conector a la base de datos MySql

sudo pip install beautifulsoup4

sudo pip install mysql-connector

En este ejemplo vamos a trabajar con la página de la Bolsa de Madrid, si la quieres ver PULSA AQUI, concretamente en la sección donde nos da la información de las cotizaciones de las empresas del Ibex 35. Esta información se actualiza cada 15 minutos, pero nosotros vamos a ejecutar nuestro script a la hora de cierre para saber como han cerrado las cotizaciones día por día.

Yo he creado una base de datos llamada "ibex35" con una tabla llamada "diario" y en esta tabla 9 campos, id, nombre, fecha, ultimo, diferencia, max, min, volumen y efectivo.

Voy a poner el script completo y luego comentaremos por bloques.

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import json
from bs4 import BeautifulSoup
import requests
from functools import reduce
import os
import mysql.connector
import datetime
website_url = requests.get("http://www.bolsamadrid.es/esp/aspx/Mercados/Precios.aspx?indice=ESI100000000&punto=indice").text
soup = BeautifulSoup(website_url,'lxml')
soup = soup.find('table',{'id':'ctl00_Contenido_tblAcciones'})
rows = soup.findAll("tr")[1:]
headers = {}
thead = soup.findAll("th")
for i in range(len(thead)):
   headers[i] = thead[i].text.strip().lower()
data = []
for row in rows:
   cells = row.find_all("td")
   item = {}    
   for i in headers:
       item[headers[i]] = cells[i].text  
   data.append(item)
pepe = json.dumps (data, indent=4)
diccionario = [
("\\u00fa", "u"),
("\\u00ed", "i"),
("\\u00e1", "a"),
("\\u20ac", "€")  
]
salida = reduce(lambda a, kv: a.replace(*kv), diccionario, pepe)
data = json.loads(salida)
mydb = mysql.connector.connect(
 host="localhost",
 user="usuario",
 passwd="contraseña",
 database="ibex35"
)
mycursor = mydb.cursor()
for device in data:
  fecha = datetime.datetime.strptime(device["fecha"], '%d/%m/%Y')
  sql = "INSERT INTO diario (nombre, fecha, ultimo, diferencia, max, min, volumen, efectivo) VALUES (%s, %s, %s, %s, %s, %s, %s, %s)"
  val = (device["nombre"], fecha, device["ult."].replace(".", "").replace(",", "."), device["% dif."].replace(".", "").replace(",", "."), device["max."].replace(".", "").replace(",", "."), device["min."].replace(".", "").replace(",", "."), device["volumen"].replace(".", "").replace(",", "."), device["efectivo (miles €)"].replace(".", "").replace(",", "."))
  mycursor.execute(sql, val)
  mydb.commit()
  print(mycursor.rowcount, "Datos de ",device["nombre"]," introducidos correctamente")
print ("Todos los datos han sido introducidos correctamente")



BLOQUE 1

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import json
from bs4 import BeautifulSoup
import requests
from functools import reduce
import os
import mysql.connector
import datetime
website_url = requests.get("http://www.bolsamadrid.es/esp/aspx/Mercados/Precios.aspx?indice=ESI100000000&punto=indice").text
soup = BeautifulSoup(website_url,'lxml')
soup = soup.find('table',{'id':'ctl00_Contenido_tblAcciones'})

En este bloque cargamos todas las librerías necesarias, cargamos la página y metemos en una variable la tabla que nos interesa, concretamente la que tiene id = ctl00_Contenido_tblAcciones.



BLOQUE 2 

rows = soup.findAll("tr")[1:]
headers = {}
thead = soup.findAll("th")
for i in range(len(thead)):
   headers[i] = thead[i].text.strip().lower()
data = []
for row in rows:
   cells = row.find_all("td")
   item = {}    
   for i in headers:
       item[headers[i]] = cells[i].text  
   data.append(item)
pepe = json.dumps (data, indent=4)  

En este bloque con todos los datos almacenados de la tabla creamos un json con la estructura cabecera tabla / valor, eso por cada fila de la tabla.



BLOQUE 3 

diccionario = [
("\\u00fa", "u"),
("\\u00ed", "i"),
("\\u00e1", "a"),
("\\u20ac", "€")  
]
salida = reduce(lambda a, kv: a.replace(*kv), diccionario, pepe)
data = json.loads(salida)
mydb = mysql.connector.connect(
 host="localhost",
 user="usuario",
 passwd="contraseña",
 database="ibex35"
)
mycursor = mydb.cursor()
for device in data:
  fecha = datetime.datetime.strptime(device["fecha"], '%d/%m/%Y')
  sql = "INSERT INTO diario (nombre, fecha, ultimo, diferencia, max, min, volumen, efectivo) VALUES (%s, %s, %s, %s, %s, %s, %s, %s)"
  val = (device["nombre"], fecha, device["ult."].replace(".", "").replace(",", "."), device["% dif."].replace(".", "").replace(",", "."), device["max."].replace(".", "").replace(",", "."), device["min."].replace(".", "").replace(",", "."), device["volumen"].replace(".", "").replace(",", "."), device["efectivo (miles €)"].replace(".", "").replace(",", "."))
  mycursor.execute(sql, val)
  mydb.commit()
  print(mycursor.rowcount, "Datos de ",device["nombre"]," introducidos correctamente")
print ("Todos los datos han sido introducidos correctamente")

En este bloque lo primero que hacemos, como la página web tiene acentos y python no es amigo de ellos, ha escrito símbolos raros en las palabras que tenían acentos, cambiamos esos símbolos por las sílabas pero sin los acentos.
Volvemos a cargar en json, conectamos con la base de datos y hacemos un bucle for para hacer insert por cada fila de la tabla.

Nótese que debemos de hacer varios "replace" pues la información de la página nos da los miles en puntos y los decimales con comas, cosa que no admite la base de datos mysql, por lo que quitamos los puntos y las comas las transformamos en puntos. También transformamos el campo fecha en tipo "date".

Bueno, ya está, espero que le sirva a alguien.

Saludos.

Imprimir

  Web scraping con python y selenium
Enviado por: chujalt - 05-08-2019, 21:13 - Foro: Python - Sin respuestas

Saludos.

Vamos a utilizar python y selenium (que es una librería de python) para loguearnos y escribir un post en un foro, todo ello de manera automática.

El script está probado en este mismo foro y funciona perfectamente, aunque en el que se publica aquí he puesto una dirección ficticia.

Lo que vamos a necesitar es, además de tener python instalado, instalarnos la librería selenium

sudo pip install selenium

y tener el controlador geckodriver, lo podeís bajar de AQUÍ.

Este trabajo está hecho bajo entorno linux y hay que tener ciertas nociones de html porque selenium busca entre los tags para poder trabajar. Lo que busca son elementos por name, id, texto del enlace, texto parcial del enlace, xpath, CSS, tagname y Classname.

Voy a poner en script completo y luego iremos linea por linea.

#!/usr/bin/env python    
from selenium import webdriver
import time
driver = webdriver.Firefox(executable_path='/home/chujalt/geckodriver')
driver.get('https://paginaweb.com')
link = driver.find_element_by_link_text('Iniciar sesión').click()
time.sleep(2)
driver.find_element_by_id('quick_login_username').send_keys("Pepito")
driver.find_element_by_id('quick_login_password').send_keys("contraseña_de_Pepito")
driver.find_element_by_name('submit').click()
time.sleep(5)
driver.find_element_by_link_text('Chistes').click()
time.sleep(2)
driver.find_element_by_class_name('new_thread_button').click()
time.sleep(5)
driver.find_element_by_name('subject').send_keys("Chiste de Pepito")
driver.find_element_by_xpath("//iframe").send_keys("Hola, este es mi primer chiste")
driver.find_element_by_name('submit').click()
time.sleep(2)
driver.close()

Importamos webdriver de selenium
from selenium import webdriver

Importamos Time
import time

Vamos a trabajar con Firefox y le decimos donde está el ejecutable geckodriver
driver = webdriver.Firefox(executable_path='/home/chujalt/geckodriver')

Le decimos la página web a abrir
driver.get('https://paginaweb.com')

Buscamos un enlace que tenga el texto "Iniciar sesión" y que lo pulse
link = driver.find_element_by_link_text('Iniciar sesión').click()

Esperamos 2 segundos a que se cargue la página de autentificación
time.sleep(2)

En el formulario, la id de la caja de texto donde va el usuario es "quick_login_username" y le enviamos nuestro usuario
driver.find_element_by_id('quick_login_username').send_keys("Pepito")

En el formulario, la id de la caja de texto donde va la contraseña es "quick_login_password" y le enviamos nuestra contraseña
driver.find_element_by_id('quick_login_password').send_keys("contraseña_de_Pepito")

En el formulario, el botón de enviar el name es "submit" y hacemos click en él
driver.find_element_by_name('submit').click()

Esperamos 5 segundos a que la autentificación se realice y se vuelva a cargar la página
time.sleep(5)

Vamos a postear un chiste, por lo que vamos a ir a la sección chistes, buscamos un enlace con el texto "Chistes" y hacemos click en él
driver.find_element_by_link_text('Chistes').click()

Esperamos 2 segundos a que se cargue la sección chistes
time.sleep(2)

El botón para crear un nuevo hilo es una class con el nombre "new_thread_button" lo buscamos y hacemos click en él
driver.find_element_by_class_name('new_thread_button').click()

Esperamos 5 segundos a que se cargue la caja para hacer los post
time.sleep(5)

En la caja para hacer posts, la caja de texto para poner el título del post tiene el name "subject", lo buscamos y enviamos el título
driver.find_element_by_name('subject').send_keys("Chiste de Pepito")

El post en si está en un iframe, lo buscamos por el path, que puede ser absoluto o relativo (es este caso relativo), y le enviamos el texto
driver.find_element_by_xpath("//iframe").send_keys("Hola, este es mi primer chiste")

Hacemos click en el botón de envío cuyo name es submit
driver.find_element_by_name('submit').click()

Esperamos 2 segundos para que se realice la grabación del post
time.sleep(2)

Y cerramos el navegador y la aplicación
driver.close()

Con esto habremos conseguido identificarnos y realizar un post.
Saludos.

Imprimir

  Uno mas por aqui
Enviado por: AdrianSoloLinux - 30-03-2019, 17:21 - Foro: Presentaciones - Respuestas (2)

Buena a todos. Me presento soy Adrian, encantado de estar por aqui.
Un saludo y nos leemos por el foro

Imprimir

  Herramientas libres
Enviado por: Swadm - 11-01-2019, 03:32 - Foro: Charla - Respuestas (5)

Hola a todos,

Aún no he tenido tiempo para aportar, sin embargo, quería conocer un poco sobre las herramientas libres que utilizan.

Actualmente me he adentrado en administración de servidores (gnu/linux) y estoy migrando máquinas virtuales KVM a PROXMOX. Ésto me ha parecido ventajoso en el sentido de que se puede formar un cluster y mover las máquinas virtuales (incluso contenedores LXC) en caliente sin tanta preocupación. La administración se convierte algo más sencilla de realizar, incluso a la hora de extender volúmenes lógicos.

También, he estado utilizando mucho docker en microservicios para independizarme del servicio en sí y obtener de manera persistente la configuración y volúmenes.

Me encantaría conocer qué herramientas libres utilizan, qué perspectivas tienen sobre las mencionadas y espero que puedan cuestionar mi visión sobre las mismas.

Saludos!

Imprimir

  Me presento
Enviado por: Swadm - 21-12-2018, 00:43 - Foro: Presentaciones - Respuestas (1)

Hola,
llegué a esta pequeña comunidad mientras estaba investigando y decidí quedarme. En cuanto a mi persona, puedo decir que mi placer se encuentra en probar software libre y adquirir nuevos conocimientos.
Espero compartir algunos conocimientos que pueden ser útiles y debatir sobre temas relacionados al mundo de la informática.

Saludos!  Sonrisa
Swadm

Imprimir

  Instalar micropython en Wemos Mini
Enviado por: chujalt - 23-10-2018, 16:48 - Foro: Wemos - Sin respuestas

Saludos.

Vamos a explicar como instalar una versión de micropython en nuestro Wemos Mini. Este tutorial está explicado para hacerlo en un sistema operativo LINUX.

Yo he utilizado un Wemos Mini D1.

[Imagen: wemosmini.jpg]


En primer lugar tenemos que bajarnos una herramienta que se llama esptool mediante el comando pip. Abrimos un terminal y escribimos:

sudo pip install esptool

En muchos sitios de internet pone que esta herramienta funciona bajo python 2.7, pero eran las versiones antiguas, ahora funciona en cualquier versión de python, yo trabajo con la 3.5

Una vez instalado esptool conectamos nuestro Wemos Mini al PC y tecleamos:

sudo esptool.py flash_id


[Imagen: micropython_1.png]

Como veis, sale varia información, entre ellas el tamaño de la memoria y el puerto serie al que está conectado, en mi caso /dev/ttyUSB0

Opcionalmente le doy permisos a ese puerto serie para luego no estar logeándome como sudo en todos los pasos siguientes:

sudo chmod 777 /dev/ttyUSB0

Vamos a bajarnos la versión de micropython de la siguiente dirección http://micropython.org/download#esp8266, yo me bajé la que pone entre paréntesis latest, que es la última.

Ahora vamos a flashear la memoria del Wemos Mini, tecleamos:

esptool.py --port /dev/ttyUSB0 erase_flash

Si todo ha ido bien no os dará ningún mensaje de error y os informará que la memoria ha sido flasheada. El proceso dura poco, unos 10 segundos.

Seguidamente cargamos micropython en nuestro Wemos Mini (el archivo que nos hemos bajado antes) tecleamos:

esptool.py --port /dev/ttyUSB0 --baud 460800 write_flash --flash_size=detect 0 /home/chujalt/esp8266-20180511-v1.9.4.bin

Lógicamente cambiar la ruta donde tenéis vuestro archivo. OJO este comando es el que sale en la página oficial de micropython, si carga correctamente, pero luego, a la hora de comprobar por consola si funcionaba micropython (último paso de este tutorial), no sale nada, volved a flashear la memoria y probad con estos comandos:

esptool.py --port /dev/ttyUSB0 --baud 115200 write_flash --flash_mode=dout --flash_size=detect 0 /home/chujalt/esp8266-20180511-v1.9.4.bin

Si no os da errores os dirá que ya está cargado micropython.

Ahora toca comprobar que funciona correctamente, hay varios programas para comunicarnos con el puerto serie, screen, minicom, picocom..... Yo he utilizado screen. Si no lo tenéis instalado:

sudo apt install screen

 
Una vez instalado, tecleamos:
screen /dev/ttyUSB0 115200

Se quedará la pantalla en negro, pulsamos el botón reset de nuestro Wemos Mini para que se reseté, y si todo ha ido bien nos saldrá el promt de micropyton.

[Imagen: micropython_2.png]

Bueno, ya está, espero que le sirva a alguien.
Saludos.

Imprimir

  Instalar micropython en Nodemcu
Enviado por: chujalt - 22-10-2018, 18:38 - Foro: Nodemcu - Sin respuestas

Saludos.

Vamos a explicar como instalar una versión de micropython en nuestro Nodemcu. Este tutorial está explicado para hacerlo en un sistema operativo LINUX.

Yo he utilizado un Nodemcu V2.


[Imagen: nodemcu.jpg]
En primer lugar tenemos que bajarnos una herramienta que se llama esptool mediante el comando pip. Abrimos un terminal y escribimos:

sudo pip install esptool

En muchos sitios de internet pone que esta herramienta funciona bajo python 2.7, pero eran las versiones antiguas, ahora funciona en cualquier versión de python, yo trabajo con la 3.5

Una vez instalado esptool conectamos nuestro nodemcu al PC y tecleamos:

sudo esptool.py flash_id


[Imagen: micropython_1.png]

Como veis, sale varia información, entre ellas el tamaño de la memoria y el puerto serie al que está conectado, en mi caso /dev/ttyUSB0

Opcionalmente le doy permisos a ese puerto serie para luego no estar logeándome como sudo en todos los pasos siguientes:

sudo chmod 777 /dev/ttyUSB0

Vamos a bajarnos la versión de micropython de la siguiente dirección http://micropython.org/download#esp8266, yo me bajé la que pone entre paréntesis latest, que es la última.

Ahora vamos a flashear la memoria del nodemcu, tecleamos:

esptool.py --port /dev/ttyUSB0 erase_flash

Si todo ha ido bien no os dará ningún mensaje de error y os informará que la memoria ha sido flasheada. El proceso dura poco, unos 10 segundos.

Seguidamente cargamos micropython en nuestro nodemcu (el archivo que nos hemos bajado antes) tecleamos:

esptool.py --port /dev/ttyUSB0 --baud 460800 write_flash --flash_size=detect 0 /home/chujalt/esp8266-20180511-v1.9.4.bin

Lógicamente cambiar la ruta donde tenéis vuestro archivo. OJO este comando es el que sale en la página oficial de micropython, me cargaba correctamente, pero luego, a la hora de comprobar por consola si funcionaba micropython (último paso de este tutorial), no salía nada. Si es así, volver a flashear la memoria y probad con estos comandos:

esptool.py --port /dev/ttyUSB0 --baud 115200 write_flash --flash_mode=dout --flash_size=detect 0 /home/chujalt/esp8266-20180511-v1.9.4.bin

Si no os da errores os dirá que ya está cargado micropython.

Ahora toca comprobar que funciona correctamente, hay varios programas para comunicarnos con el puerto serie, screen, minicom, picocom..... Yo he utilizado screen. Si no lo tenéis instalado:

sudo apt install screen

 
Una vez instalado, tecleamos:
screen /dev/ttyUSB0 115200

Se quedará la pantalla en negro, pulsamos el botón reset de nuestro Nodemcu para que se reseté, y si todo ha ido bien nos saldrá el promt de micropyton.

[Imagen: micropython_2.png]

Bueno, ya está, espero que le sirva a alguien.
Saludos.

Imprimir

Información Recuperar GRUB después de actualización de Windows 10
Enviado por: chujalt - 25-09-2018, 17:35 - Foro: Linux - Sin respuestas

Saludos.

OJO, este método funciona a los que tienen la bios EFI, en las bios antiguas no funcionará.

De vez en cuando Windows 10 hace una actualización importante y los que también tenemos instalados Linux nos llevamos la mala sorpresa que al reiniciar el ordenador arranca Windows directamente, el GRUB a desaparecido.

Tranquilos, hay una rápida y fácil solución.

Una vez Windows abierto ejecutamos como administrador su consola de comandos y escribimos la siguiente línea:

bcdedit /set {bootmgr} path \EFI\ubuntu\grubx64.efi

Reiniciamos y nos volverá a salir el GRUB.

Saludos.

Imprimir