<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/">
	<channel>
		<title><![CDATA[ChuJALT - Python]]></title>
		<link>https://chujalt.com/</link>
		<description><![CDATA[ChuJALT - https://chujalt.com]]></description>
		<pubDate>Thu, 30 Apr 2026 16:07:16 +0000</pubDate>
		<generator>MyBB</generator>
		<item>
			<title><![CDATA[Python, insertar saltos de línea en textos grandes]]></title>
			<link>https://chujalt.com/thread-50.html</link>
			<pubDate>Tue, 03 Aug 2021 18:00:45 +0000</pubDate>
			<dc:creator><![CDATA[<a href="https://chujalt.com/member.php?action=profile&uid=1">chujalt</a>]]></dc:creator>
			<guid isPermaLink="false">https://chujalt.com/thread-50.html</guid>
			<description><![CDATA[<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>#!/usr/bin/env python<br />
n = 8 #Numero caracteres por linea<br />
contenido = open("documento_original.txt", "r")<br />
s = contenido.read()<br />
contenido.close()<br />
with open('documento_salida.txt', 'w', encoding='utf-8') as myfile:<br />
    myfile.write('&#92;n'.join(s[i:i+n] for i in range(0, len(s), n)))<br />
    myfile.close()</code></div></div><br />
Lee el archivo original y crea uno nuevo con n caracteres por línea, es este caso 8.]]></description>
			<content:encoded><![CDATA[<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>#!/usr/bin/env python<br />
n = 8 #Numero caracteres por linea<br />
contenido = open("documento_original.txt", "r")<br />
s = contenido.read()<br />
contenido.close()<br />
with open('documento_salida.txt', 'w', encoding='utf-8') as myfile:<br />
    myfile.write('&#92;n'.join(s[i:i+n] for i in range(0, len(s), n)))<br />
    myfile.close()</code></div></div><br />
Lee el archivo original y crea uno nuevo con n caracteres por línea, es este caso 8.]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Web scraping con python y selenium.]]></title>
			<link>https://chujalt.com/thread-21.html</link>
			<pubDate>Sun, 07 Mar 2021 19:44:42 +0000</pubDate>
			<dc:creator><![CDATA[<a href="https://chujalt.com/member.php?action=profile&uid=1">chujalt</a>]]></dc:creator>
			<guid isPermaLink="false">https://chujalt.com/thread-21.html</guid>
			<description><![CDATA[Saludos.<br />
<br />
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.<br />
<br />
El script está probado en este mismo foro y funciona perfectamente, aunque en el que se publica aquí he puesto una dirección ficticia.<br />
<br />
Lo que vamos a necesitar es, además de tener python instalado, instalarnos la librería selenium<br />
<br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>sudo pip install selenium</code></div></div><br />
y tener el controlador geckodriver, lo podeís bajar de <a href="https://github.com/mozilla/geckodriver/releases" target="_blank" rel="noopener" class="mycode_url">AQUÍ</a>.<br />
<br />
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.<br />
<br />
Voy a poner en script completo y luego iremos linea por linea.<br />
<br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>#!/usr/bin/env python&nbsp;&nbsp;&nbsp;&nbsp;<br />
from selenium import webdriver<br />
import time<br />
driver = webdriver.Firefox(executable_path='/home/chujalt/geckodriver')<br />
driver.get('https://paginaweb.com')<br />
link = driver.find_element_by_link_text('Iniciar sesión').click()<br />
time.sleep(2)<br />
driver.find_element_by_id('quick_login_username').send_keys("Pepito")<br />
driver.find_element_by_id('quick_login_password').send_keys("contraseña_de_Pepito")<br />
driver.find_element_by_name('submit').click()<br />
time.sleep(5)<br />
driver.find_element_by_link_text('Chistes').click()<br />
time.sleep(2)<br />
driver.find_element_by_class_name('new_thread_button').click()<br />
time.sleep(5)<br />
driver.find_element_by_name('subject').send_keys("Chiste de Pepito")<br />
driver.find_element_by_xpath("//iframe").send_keys("Hola, este es mi primer chiste")<br />
driver.find_element_by_name('submit').click()<br />
time.sleep(2)<br />
driver.close()</code></div></div><br />
Importamos webdriver de selenium<br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>from selenium import webdriver</code></div></div><br />
Importamos Time<br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>import time</code></div></div><br />
Vamos a trabajar con Firefox y le decimos donde está el ejecutable geckodriver<br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>driver = webdriver.Firefox(executable_path='/home/chujalt/geckodriver')</code></div></div><br />
Le decimos la página web a abrir<br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>driver.get('https://paginaweb.com')</code></div></div><br />
Buscamos un enlace que tenga el texto "Iniciar sesión" y que lo pulse<br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>link = driver.find_element_by_link_text('Iniciar sesión').click()</code></div></div><br />
Esperamos 2 segundos a que se cargue la página de autentificación<br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>time.sleep(2)</code></div></div><br />
En el formulario, la id de la caja de texto donde va el usuario es "quick_login_username" y le enviamos nuestro usuario<br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>driver.find_element_by_id('quick_login_username').send_keys("Pepito")</code></div></div><br />
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<br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>driver.find_element_by_id('quick_login_password').send_keys("contraseña_de_Pepito")</code></div></div><br />
En el formulario, el botón de enviar el name es "submit" y hacemos click en él<br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>driver.find_element_by_name('submit').click()</code></div></div><br />
Esperamos 5 segundos a que la autentificación se realice y se vuelva a cargar la página<br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>time.sleep(5)</code></div></div><br />
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<br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>driver.find_element_by_link_text('Chistes').click()</code></div></div><br />
Esperamos 2 segundos a que se cargue la sección chistes<br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>time.sleep(2)</code></div></div><br />
El botón para crear un nuevo hilo es una class con el nombre "new_thread_button" lo buscamos y hacemos click en él<br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>driver.find_element_by_class_name('new_thread_button').click()</code></div></div><br />
Esperamos 5 segundos a que se cargue la caja para hacer los post<br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>time.sleep(5)</code></div></div><br />
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<br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>driver.find_element_by_name('subject').send_keys("Chiste de Pepito")</code></div></div><br />
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<br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>driver.find_element_by_xpath("//iframe").send_keys("Hola, este es mi primer chiste")</code></div></div><br />
Hacemos click en el botón de envío cuyo name es submit<br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>driver.find_element_by_name('submit').click()</code></div></div><br />
Esperamos 2 segundos para que se realice la grabación del post<br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>time.sleep(2)</code></div></div><br />
Y cerramos el navegador y la aplicación<br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>driver.close()</code></div></div><br />
Con esto habremos conseguido identificarnos y realizar un post.<br />
Saludos.]]></description>
			<content:encoded><![CDATA[Saludos.<br />
<br />
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.<br />
<br />
El script está probado en este mismo foro y funciona perfectamente, aunque en el que se publica aquí he puesto una dirección ficticia.<br />
<br />
Lo que vamos a necesitar es, además de tener python instalado, instalarnos la librería selenium<br />
<br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>sudo pip install selenium</code></div></div><br />
y tener el controlador geckodriver, lo podeís bajar de <a href="https://github.com/mozilla/geckodriver/releases" target="_blank" rel="noopener" class="mycode_url">AQUÍ</a>.<br />
<br />
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.<br />
<br />
Voy a poner en script completo y luego iremos linea por linea.<br />
<br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>#!/usr/bin/env python&nbsp;&nbsp;&nbsp;&nbsp;<br />
from selenium import webdriver<br />
import time<br />
driver = webdriver.Firefox(executable_path='/home/chujalt/geckodriver')<br />
driver.get('https://paginaweb.com')<br />
link = driver.find_element_by_link_text('Iniciar sesión').click()<br />
time.sleep(2)<br />
driver.find_element_by_id('quick_login_username').send_keys("Pepito")<br />
driver.find_element_by_id('quick_login_password').send_keys("contraseña_de_Pepito")<br />
driver.find_element_by_name('submit').click()<br />
time.sleep(5)<br />
driver.find_element_by_link_text('Chistes').click()<br />
time.sleep(2)<br />
driver.find_element_by_class_name('new_thread_button').click()<br />
time.sleep(5)<br />
driver.find_element_by_name('subject').send_keys("Chiste de Pepito")<br />
driver.find_element_by_xpath("//iframe").send_keys("Hola, este es mi primer chiste")<br />
driver.find_element_by_name('submit').click()<br />
time.sleep(2)<br />
driver.close()</code></div></div><br />
Importamos webdriver de selenium<br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>from selenium import webdriver</code></div></div><br />
Importamos Time<br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>import time</code></div></div><br />
Vamos a trabajar con Firefox y le decimos donde está el ejecutable geckodriver<br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>driver = webdriver.Firefox(executable_path='/home/chujalt/geckodriver')</code></div></div><br />
Le decimos la página web a abrir<br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>driver.get('https://paginaweb.com')</code></div></div><br />
Buscamos un enlace que tenga el texto "Iniciar sesión" y que lo pulse<br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>link = driver.find_element_by_link_text('Iniciar sesión').click()</code></div></div><br />
Esperamos 2 segundos a que se cargue la página de autentificación<br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>time.sleep(2)</code></div></div><br />
En el formulario, la id de la caja de texto donde va el usuario es "quick_login_username" y le enviamos nuestro usuario<br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>driver.find_element_by_id('quick_login_username').send_keys("Pepito")</code></div></div><br />
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<br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>driver.find_element_by_id('quick_login_password').send_keys("contraseña_de_Pepito")</code></div></div><br />
En el formulario, el botón de enviar el name es "submit" y hacemos click en él<br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>driver.find_element_by_name('submit').click()</code></div></div><br />
Esperamos 5 segundos a que la autentificación se realice y se vuelva a cargar la página<br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>time.sleep(5)</code></div></div><br />
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<br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>driver.find_element_by_link_text('Chistes').click()</code></div></div><br />
Esperamos 2 segundos a que se cargue la sección chistes<br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>time.sleep(2)</code></div></div><br />
El botón para crear un nuevo hilo es una class con el nombre "new_thread_button" lo buscamos y hacemos click en él<br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>driver.find_element_by_class_name('new_thread_button').click()</code></div></div><br />
Esperamos 5 segundos a que se cargue la caja para hacer los post<br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>time.sleep(5)</code></div></div><br />
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<br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>driver.find_element_by_name('subject').send_keys("Chiste de Pepito")</code></div></div><br />
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<br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>driver.find_element_by_xpath("//iframe").send_keys("Hola, este es mi primer chiste")</code></div></div><br />
Hacemos click en el botón de envío cuyo name es submit<br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>driver.find_element_by_name('submit').click()</code></div></div><br />
Esperamos 2 segundos para que se realice la grabación del post<br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>time.sleep(2)</code></div></div><br />
Y cerramos el navegador y la aplicación<br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>driver.close()</code></div></div><br />
Con esto habremos conseguido identificarnos y realizar un post.<br />
Saludos.]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Web scraping con python BeautifulSoup y MySql.]]></title>
			<link>https://chujalt.com/thread-20.html</link>
			<pubDate>Sun, 07 Mar 2021 19:43:09 +0000</pubDate>
			<dc:creator><![CDATA[<a href="https://chujalt.com/member.php?action=profile&uid=1">chujalt</a>]]></dc:creator>
			<guid isPermaLink="false">https://chujalt.com/thread-20.html</guid>
			<description><![CDATA[Saludos.<br />
<br />
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.<br />
<br />
Yo trabajo en entorno linux, pero bajo Windows o MAc debería funcionar igual.<br />
<br />
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<br />
<br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>sudo pip install beautifulsoup4<br />
<br />
sudo pip install mysql-connector</code></div></div><br />
En este ejemplo vamos a trabajar con la página de la Bolsa de Madrid, si la quieres ver <a href="http://www.bolsamadrid.es/esp/aspx/Mercados/Precios.aspx?indice=ESI100000000&amp;punto=indice" target="_blank" rel="noopener" class="mycode_url">PULSA AQUI</a>, 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.<br />
<br />
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.<br />
<br />
Voy a poner el script completo y luego comentaremos por bloques.<br />
<br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>#!/usr/bin/env python<br />
# -*- coding: utf-8 -*-<br />
import json<br />
from bs4 import BeautifulSoup<br />
import requests<br />
from functools import reduce<br />
import os<br />
import mysql.connector<br />
import datetime<br />
website_url = requests.get("http://www.bolsamadrid.es/esp/aspx/Mercados/Precios.aspx?indice=ESI100000000&amp;punto=indice").text<br />
soup = BeautifulSoup(website_url,'lxml')<br />
soup = soup.find('table',{'id':'ctl00_Contenido_tblAcciones'})<br />
rows = soup.findAll("tr")[1:]<br />
headers = {}<br />
thead = soup.findAll("th")<br />
for i in range(len(thead)):<br />
    headers[i] = thead[i].text.strip().lower()<br />
data = []<br />
for row in rows:<br />
    cells = row.find_all("td")<br />
    item = {}    <br />
    for i in headers:<br />
        item[headers[i]] = cells[i].text   <br />
    data.append(item)<br />
pepe = json.dumps (data, indent=4) <br />
diccionario = [<br />
("&#92;&#92;u00fa", "u"), <br />
("&#92;&#92;u00ed", "i"), <br />
("&#92;&#92;u00e1", "a"),<br />
("&#92;&#92;u20ac", "€")  <br />
]<br />
salida = reduce(lambda a, kv: a.replace(*kv), diccionario, pepe)<br />
data = json.loads(salida)<br />
mydb = mysql.connector.connect(<br />
  host="localhost",<br />
  user="usuario",<br />
  passwd="contraseña",<br />
  database="ibex35"<br />
)<br />
mycursor = mydb.cursor()<br />
for device in data:<br />
   fecha = datetime.datetime.strptime(device["fecha"], '%d/%m/%Y')<br />
   sql = "INSERT INTO diario (nombre, fecha, ultimo, diferencia, max, min, volumen, efectivo) VALUES (%s, %s, %s, %s, %s, %s, %s, %s)"<br />
   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(",", "."))<br />
   mycursor.execute(sql, val)<br />
   mydb.commit()<br />
   print(mycursor.rowcount, "Datos de ",device["nombre"]," introducidos correctamente")<br />
print ("Todos los datos han sido introducidos correctamente")</code></div></div><br />
<br />
<br />
<span style="font-weight: bold;" class="mycode_b"><span style="color: #3333ff;" class="mycode_color">BLOQUE 1</span></span><br />
<br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>#!/usr/bin/env python<br />
# -*- coding: utf-8 -*-<br />
import json<br />
from bs4 import BeautifulSoup<br />
import requests<br />
from functools import reduce<br />
import os<br />
import mysql.connector<br />
import datetime<br />
website_url = requests.get("http://www.bolsamadrid.es/esp/aspx/Mercados/Precios.aspx?indice=ESI100000000&amp;punto=indice").text<br />
soup = BeautifulSoup(website_url,'lxml')<br />
soup = soup.find('table',{'id':'ctl00_Contenido_tblAcciones'})</code></div></div><br />
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.<br />
<br />
<br />
<br />
<span style="font-weight: bold;" class="mycode_b"><span style="color: #3333ff;" class="mycode_color">BLOQUE 2</span></span> <br />
<br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>rows = soup.findAll("tr")[1:]<br />
headers = {}<br />
thead = soup.findAll("th")<br />
for i in range(len(thead)):<br />
    headers[i] = thead[i].text.strip().lower()<br />
data = []<br />
for row in rows:<br />
    cells = row.find_all("td")<br />
    item = {}    <br />
    for i in headers:<br />
        item[headers[i]] = cells[i].text   <br />
    data.append(item)<br />
pepe = json.dumps (data, indent=4)  </code></div></div><br />
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.<br />
<br />
<br />
<br />
<span style="font-weight: bold;" class="mycode_b"><span style="color: #3333ff;" class="mycode_color">BLOQUE 3</span></span> <br />
<br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>diccionario = [<br />
("&#92;&#92;u00fa", "u"), <br />
("&#92;&#92;u00ed", "i"), <br />
("&#92;&#92;u00e1", "a"),<br />
("&#92;&#92;u20ac", "€")   <br />
]<br />
salida = reduce(lambda a, kv: a.replace(*kv), diccionario, pepe)<br />
data = json.loads(salida)<br />
mydb = mysql.connector.connect(<br />
  host="localhost",<br />
  user="usuario",<br />
  passwd="contraseña",<br />
  database="ibex35"<br />
)<br />
mycursor = mydb.cursor()<br />
for device in data:<br />
   fecha = datetime.datetime.strptime(device["fecha"], '%d/%m/%Y')<br />
   sql = "INSERT INTO diario (nombre, fecha, ultimo, diferencia, max, min, volumen, efectivo) VALUES (%s, %s, %s, %s, %s, %s, %s, %s)"<br />
   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(",", "."))<br />
   mycursor.execute(sql, val)<br />
   mydb.commit()<br />
   print(mycursor.rowcount, "Datos de ",device["nombre"]," introducidos correctamente")<br />
print ("Todos los datos han sido introducidos correctamente")</code></div></div><br />
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.<br />
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.<br />
<br />
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".<br />
<br />
Bueno, ya está, espero que le sirva a alguien.<br />
<br />
Saludos.]]></description>
			<content:encoded><![CDATA[Saludos.<br />
<br />
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.<br />
<br />
Yo trabajo en entorno linux, pero bajo Windows o MAc debería funcionar igual.<br />
<br />
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<br />
<br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>sudo pip install beautifulsoup4<br />
<br />
sudo pip install mysql-connector</code></div></div><br />
En este ejemplo vamos a trabajar con la página de la Bolsa de Madrid, si la quieres ver <a href="http://www.bolsamadrid.es/esp/aspx/Mercados/Precios.aspx?indice=ESI100000000&amp;punto=indice" target="_blank" rel="noopener" class="mycode_url">PULSA AQUI</a>, 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.<br />
<br />
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.<br />
<br />
Voy a poner el script completo y luego comentaremos por bloques.<br />
<br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>#!/usr/bin/env python<br />
# -*- coding: utf-8 -*-<br />
import json<br />
from bs4 import BeautifulSoup<br />
import requests<br />
from functools import reduce<br />
import os<br />
import mysql.connector<br />
import datetime<br />
website_url = requests.get("http://www.bolsamadrid.es/esp/aspx/Mercados/Precios.aspx?indice=ESI100000000&amp;punto=indice").text<br />
soup = BeautifulSoup(website_url,'lxml')<br />
soup = soup.find('table',{'id':'ctl00_Contenido_tblAcciones'})<br />
rows = soup.findAll("tr")[1:]<br />
headers = {}<br />
thead = soup.findAll("th")<br />
for i in range(len(thead)):<br />
    headers[i] = thead[i].text.strip().lower()<br />
data = []<br />
for row in rows:<br />
    cells = row.find_all("td")<br />
    item = {}    <br />
    for i in headers:<br />
        item[headers[i]] = cells[i].text   <br />
    data.append(item)<br />
pepe = json.dumps (data, indent=4) <br />
diccionario = [<br />
("&#92;&#92;u00fa", "u"), <br />
("&#92;&#92;u00ed", "i"), <br />
("&#92;&#92;u00e1", "a"),<br />
("&#92;&#92;u20ac", "€")  <br />
]<br />
salida = reduce(lambda a, kv: a.replace(*kv), diccionario, pepe)<br />
data = json.loads(salida)<br />
mydb = mysql.connector.connect(<br />
  host="localhost",<br />
  user="usuario",<br />
  passwd="contraseña",<br />
  database="ibex35"<br />
)<br />
mycursor = mydb.cursor()<br />
for device in data:<br />
   fecha = datetime.datetime.strptime(device["fecha"], '%d/%m/%Y')<br />
   sql = "INSERT INTO diario (nombre, fecha, ultimo, diferencia, max, min, volumen, efectivo) VALUES (%s, %s, %s, %s, %s, %s, %s, %s)"<br />
   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(",", "."))<br />
   mycursor.execute(sql, val)<br />
   mydb.commit()<br />
   print(mycursor.rowcount, "Datos de ",device["nombre"]," introducidos correctamente")<br />
print ("Todos los datos han sido introducidos correctamente")</code></div></div><br />
<br />
<br />
<span style="font-weight: bold;" class="mycode_b"><span style="color: #3333ff;" class="mycode_color">BLOQUE 1</span></span><br />
<br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>#!/usr/bin/env python<br />
# -*- coding: utf-8 -*-<br />
import json<br />
from bs4 import BeautifulSoup<br />
import requests<br />
from functools import reduce<br />
import os<br />
import mysql.connector<br />
import datetime<br />
website_url = requests.get("http://www.bolsamadrid.es/esp/aspx/Mercados/Precios.aspx?indice=ESI100000000&amp;punto=indice").text<br />
soup = BeautifulSoup(website_url,'lxml')<br />
soup = soup.find('table',{'id':'ctl00_Contenido_tblAcciones'})</code></div></div><br />
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.<br />
<br />
<br />
<br />
<span style="font-weight: bold;" class="mycode_b"><span style="color: #3333ff;" class="mycode_color">BLOQUE 2</span></span> <br />
<br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>rows = soup.findAll("tr")[1:]<br />
headers = {}<br />
thead = soup.findAll("th")<br />
for i in range(len(thead)):<br />
    headers[i] = thead[i].text.strip().lower()<br />
data = []<br />
for row in rows:<br />
    cells = row.find_all("td")<br />
    item = {}    <br />
    for i in headers:<br />
        item[headers[i]] = cells[i].text   <br />
    data.append(item)<br />
pepe = json.dumps (data, indent=4)  </code></div></div><br />
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.<br />
<br />
<br />
<br />
<span style="font-weight: bold;" class="mycode_b"><span style="color: #3333ff;" class="mycode_color">BLOQUE 3</span></span> <br />
<br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>diccionario = [<br />
("&#92;&#92;u00fa", "u"), <br />
("&#92;&#92;u00ed", "i"), <br />
("&#92;&#92;u00e1", "a"),<br />
("&#92;&#92;u20ac", "€")   <br />
]<br />
salida = reduce(lambda a, kv: a.replace(*kv), diccionario, pepe)<br />
data = json.loads(salida)<br />
mydb = mysql.connector.connect(<br />
  host="localhost",<br />
  user="usuario",<br />
  passwd="contraseña",<br />
  database="ibex35"<br />
)<br />
mycursor = mydb.cursor()<br />
for device in data:<br />
   fecha = datetime.datetime.strptime(device["fecha"], '%d/%m/%Y')<br />
   sql = "INSERT INTO diario (nombre, fecha, ultimo, diferencia, max, min, volumen, efectivo) VALUES (%s, %s, %s, %s, %s, %s, %s, %s)"<br />
   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(",", "."))<br />
   mycursor.execute(sql, val)<br />
   mydb.commit()<br />
   print(mycursor.rowcount, "Datos de ",device["nombre"]," introducidos correctamente")<br />
print ("Todos los datos han sido introducidos correctamente")</code></div></div><br />
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.<br />
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.<br />
<br />
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".<br />
<br />
Bueno, ya está, espero que le sirva a alguien.<br />
<br />
Saludos.]]></content:encoded>
		</item>
	</channel>
</rss>