viernes, 17 de octubre de 2014

PYTHON: CREANDO NUESTRA HERRAMIENTA DE WEB SCRAPING [III]

Lo prometido - aunque bueno.. técnicamente no prometí nada - es deuda. Procederemos ahora con la extracción de links en una pagina dada.

EXTRAYENDO LINKS.

Continuando con la base del primer script, añadiremos el siguiente regex y su respectiva función para extraer los links de una pagina web (Si... cambie la definición de PATRON_ por REGEX_... me pareció mas apropiada):

1
REGEX_URL   = re.compile('https?://[^\s<>"]+|www\.[^\s<>"]+')

1
2
3
4
5
6
7
def Extraer_URL(HTML):
    try:
        Url = re.findall(REGEX_URL, HTML)
        return Url
    except Exception, e:
        print "[ERROR: Extractor(HTML)] - ",e
        sys.exit(1)

Anexado esto y acomodado en nuestro script principal procederemos a realizar la prueba tomando como base bueno, la propia sección de links de esta pagina (link) ejecutándolo al menos en mi caso (dependerá de como quieran manejar los argumentos) de la siguiente manera:

python WebScraping.py -url -lnk <URL>

Y observando que funciona adecuadamente:




El resultado no esta precisamente ordenado, pero basta para nuestro propósito. De forma separada tiendo a manejar un script aparte para ir probando las funciones por separado - me ayuda a no perderme en el código si el script es muy grande - por lo que para sus propias pruebas les comparto la función usando Beautifulsoup (comente el proxy debido a que después de cierto numero de intentos las paginas simplemente ya no responden igual... imagino que lo ven sospechoso y simplemente bloquean la respuesta):

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#!/usr/bin/python -u
# -*- coding: utf-8 -*-
import mechanize
import cookielib
import re
import sys
from random import choice
from bs4 import BeautifulSoup

#VARIABLES GLOBALES
USER_AGENT  = {'User-Agent':(choice(open("user_agent.txt",'r').readlines()))}
REGEX_URL   = re.compile('https?://[^\s<>"]+|www\.[^\s<>"]+')

#FUNCIONES
def Extraer_HTML(URL):
    try:
        navegador = mechanize.Browser()                         # Inicializar Navegador
        #navegador.set_proxies({"http": "162.208.49.45:7808"})  # Establecer Proxy
        ncookie = cookielib.LWPCookieJar()                      # Cookie
        navegador.set_cookiejar(ncookie)
        navegador.set_handle_robots(False)                      # Ignorar Robots
        navegador.set_handle_refresh(mechanize._http.HTTPRefreshProcessor(), max_time=1)
        navegador.addheaders = [('User-agent', USER_AGENT)]     # Establecer User-Agent
        respuesta = navegador.open(URL)                         # Abrir URL
        return  respuesta.read()                                # Regresar codigo fuente de la pagina
    except Exception, e:
        print "[ERROR: Extraer_HTML(URL)] - ",e
        sys.exit(1)

def ExtraerBS_URL(HTML):
    try:
        BS_HTML=BeautifulSoup(HTML)
        for link in BS_HTML.find_all('a'):
            print(link.get('href'))
    except Exception, e:
        print "[ERROR: ExtraerBS_URL(HTML)] - ",e
        sys.exit(1)

URL='http://p01n7l355.blogspot.mx/p/online-tools-links-de-interes.html'
HTML=Extraer_HTML(URL)
ExtraerBS_URL(HTML)


Usando Beautifulsoup el resultado es un poco diferente y muestra un par de falsos positivos, aunque, esto quizá se deba a mi falta de experiencia con la librería; aun no juego lo suficiente con ella... francamente me siento mas cómodo usando regex. Cuestion de gustos:




NOTAS:


-Experimentando, hay sutiles diferencias entre la extracción de links entre paginas Web y un archivo de texto plano, pese a que en realidad esta entrada no contempla la idea de extraer esto desde un archivo - a fin de cuentas WebScraping se refiere exclusivamente a .. bueno.. eso... web... - considere importante como detalle mencionarlo. Es una cuestión de refinamiento en el regex - o esa es mi teoría- o contemplar un regex exclusivo para este escenario.
-En lo personal prefiero la idea de manejar regex que Beautifulsoup. Aunque en algunos enlaces leyendo por ahi escuche que no era lo mas optimo... igual es un debate habría que profundizar en el uso de ambos y realizar algunas pruebas para ver cual da mejor performance.
-En nuestra próxima entrada probaremos la extracción de IP y... a ver que mas se nos ocurre.

REFERENCIAS.

-http://www.pythonforbeginners.com/python-on-the-web/web-scraping-with-beautifulsoup/
-https://pypi.python.org/pypi/beautifulsoup4
-https://cloud.github.com/downloads/tartley/python-regex-cheatsheet/cheatsheet.pdf

No hay comentarios:

Publicar un comentario en la entrada

Nota: solo los miembros de este blog pueden publicar comentarios.