viernes, 25 de noviembre de 2016

Web Scraping con Python II (requests)




En este tutorial vamos a extraer información de una web, tal y como os adelanté en el anterior tutorial en esta ocasión la extraeremos de un dato que no sea una variable de JS. Lo que nos ahorrará tener que abrir el explorador mediante Selenium.

Si no tenemos instalado Beautiful Soup, lo haremos:

pip install beautifulSoup4

A continuación instalaremos Requests

pip install requests

El funcionamiento sería más o menos el mismo que con Selenium, a continuación el código comentado:

from bs4 import BeautifulSoup
import requests


url = 'http://geekyhour.blogspot.com.es'
# Le pasamos la web a request para convertirla en texto plano
r = requests.get(url)

soup = BeautifulSoup(r.text, 'html.parser')

# Buscamos en este caso todos los tags h3, que tengan class = post-title entry-title
html = soup.findAll('h3', 'post-title entry-title')

# Iniciamos un bucle para mostrar todos los valores que contienen esos tags
for i in html:
 print(i.getText())




Y hasta aquí el tutorial de esta semana, espero que le puedan sacar provecho, hasta la proxima!!

sábado, 19 de noviembre de 2016

Web scraping con Python

Buenas a todos !!

Después de un largo tiempo sin escribir, hoy por fin me he decidido a volver con Geeky Hour, falta de ideas, falta de tiempo... en fin.

Volvemos pues con un tutorial sobre web scraping, que es la acción de extraer información de una pagina web y luego poder usar esos datos para lo que necesitemos.

Para empezar instalaremos las librerias necesarias.

BeautifulSoup

pip install beautifulsoup4

Selenium

pip install selenium

Como web driver, un ejecutable que necesitaremos para poder extraer los datos cuando estos sean datos de javaScript nos descargaremos desde aquí chromedriver.


Una vez hecho todo esto vamos a pasar al código, en este caso vamos a hacer webscraping de la web weather.com para poder extraer la información en texto del tiempo que hace en la ciudad.

Concretamente este dato:


from bs4 import BeautifulSoup
from selenium import webdriver

#Cargamos el driver, el archivo chromedriver debe estar en la
#misma carpeta del código

driver = webdriver.Chrome()

# Introducimos la url y la pasamos al driver
url = "https://weather.com/es-ES/tiempo/hoy/l/41.38,2.18"

driver.get(url)

html = driver.page_source

# Transformamos al url a html con Beautifulsoup

html2 = BeautifulSoup(html, "html.parser")

# Aqui buscaremos dentro de ese código, el lugar donde se 
# encuentra el dato que necesitamos.
tiempo  = html2.find('div', {'class':'today_nowcard-phrase'})

# Imprimimos texto por consola y cerramos el explorador.

print (tiempo.getText())
driver.quit()

Como veis, es un código bastante cortito, no vamos a complicarnos mucho la vida para obtener un simple dato "Soleado / Tormenta ....".

Para poder encontrar el texto que nos interesa de una web, lo que haremos será localizar la posición dentro del código. Entraremos en el modo inspección de nuestro explorador "F12" en el caso de Chrome:


Si seleccionamos la parte de la pagina que nos interesa, en este caso el texto "PARCIALMENTE NUBLADO", en el inspector podremos obtener la información que nos interesa, <div class="today-nowcard-phrase" .... 
Lo usamos en nuestro código con el formato: ('div', {'class':'today-nowcard-phrase'})

Y listo, ejecutamos el código y obtendremos el dato actualizado.

En este tutorial hemos utilizado Selenium porque el texto que teniamos que extraer de la pagina se trataba de un codigo JavaScript, y otros métodos más rapidos y sencillos no logran extraer este tipo de información, en el próximo os mostraré como usar la libreria Requests.