Underc0de - La Casa de los Informáticos

Foros Generales => Dudas y pedidos generales => Mensaje iniciado por: Hu0r en Marzo 02, 2013, 02:15:23 AM

Título: [SOLUCIONADO] Urls + python
Publicado por: Hu0r en Marzo 02, 2013, 02:15:23 AM
Hola, leí los tutoriales de Python de esta sección y hasta ahí todo bien. Pero no he encontrado nada que explique el manejo de Urls y Python. Me explico, si quiero chequear una url en python para diversas cosas, ¿qué comandos debo usar? Tienen algún tutorial donde expliquen esto? :D

Fundamentalmente quiero hacer algo como esto. Deseo hacer una búsqueda de temas de un usuario. Primero, tengo la url del perfil de un usuario: www.mipagina.com/miembro.php?id=XXX, donde XXX es el id del usuario, y posteriormente buscar en varios directorios y subdirectorios (de la misma web, obvio) si el username es el creador de la entrada.

Dentro de mi cabeza es algo así:

- Introducir el id del usuario.
- Buscar los por los directorios ya listados.
- Dentro de cada directorio, buscar en subdirectorios.
- Mostrar la cantidad de entradas publicadas por el usuario (quizá alguna búsqueda específica dentro del código de fuente, no sé).

Necesito documentación para hacer eso... Gracias de antemano!!
Título: Re:urls + python
Publicado por: Once en Marzo 02, 2013, 02:25:25 AM
Hola,

Si lo que quieres es documentación, hechale un vistazo a las librerias urllib (http://docs.python.org/2/library/urllib.html), urllib2 (http://docs.python.org/2/library/urllib2.html). Estas para las urls y HTMLParser (http://docs.python.org/2/library/htmlparser.html) o re (http://docs.python.org/2/library/re.html). Estos para trabajar con el código que te devuelve la web.

Si tienes alguna duda más específica no dudes preguntar de nuevo.

Saludos!
Título: Re:urls + python
Publicado por: Hu0r en Marzo 02, 2013, 02:32:06 AM
You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login
Hola,

Si lo que quieres es documentación, hechale un vistazo a las librerias urllib (http://docs.python.org/2/library/urllib.html), urllib2 (http://docs.python.org/2/library/urllib2.html). Estas para las urls y HTMLParser (http://docs.python.org/2/library/htmlparser.html) o re (http://docs.python.org/2/library/re.html). Estos para trabajar con el código que te devuelve la web.

Si tienes alguna duda más específica no dudes preguntar de nuevo.

Saludos!

Había leído sobre urllib2 y creo que no sirve para lo que busco :P. Leeré los demás, gracias. Cualquier cosa pregunto aquí!
Título: Re:urls + python
Publicado por: Once en Marzo 02, 2013, 02:41:30 AM
You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login
Había leído sobre urllib2 y creo que no sirve para lo que busco :P. Leeré los demás, gracias. Cualquier cosa pregunto aquí!

Lo que quieres es abrir una url, así que  cualquiera de las dos librerias te sirve:

Código (python) [Seleccionar]
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import urllib
URL = "http://underc0de.org/foro/profile/Hu0r/"
print urllib.urlopen(URL).read()


Saludos!
Título: Re:urls + python
Publicado por: Hu0r en Marzo 02, 2013, 03:25:31 AM
You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login
You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login
Había leído sobre urllib2 y creo que no sirve para lo que busco :P. Leeré los demás, gracias. Cualquier cosa pregunto aquí!

Lo que quieres es abrir una url, así que  cualquiera de las dos librerias te sirve:

Código (python) [Seleccionar]
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import urllib
URL = "http://underc0de.org/foro/profile/Hu0r/"
print urllib.urlopen(URL).read()


Saludos!

Sí, pero quiero buscar dentro de ese código un tag determinado. Por ejemplo, tengo el tag:

<a rel="nofollow" class="bigusername" href="http://sitio.com/miembro.php?u=XXXX"><font color="YYYYY"><strong>Hu0r</font></strong></a>

Entonces, la idea sería parsear y buscar dentro del code el tag <a>...</a> y que dentro de este busque el href=..../miembro.php?=XXXX (lo importante es el id). Y cuando lo encuentre lo almacene en un registro (+1). O podría cargarse toda la url: http://sitio.com/miembro.php?u=XXXX para buscarla, más fácil que andar para allá y para acá con la id.
Título: Re:urls + python
Publicado por: Once en Marzo 02, 2013, 03:43:21 AM
You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login
Sí, pero quiero buscar dentro de ese código un tag determinado. Por ejemplo, tengo el tag:

<a rel="nofollow" class="bigusername" href="http://sitio.com/miembro.php?u=XXXX"><font color="YYYYY"><strong>Hu0r</font></strong></a>

Entonces, la idea sería parsear y buscar dentro del code el tag <a>...</a> y que dentro de este busque el href=..../miembro.php?=XXXX (lo importante es el id). Y cuando lo encuentre lo almacene en un registro (+1).

Ahora entiendo mejor, y te acabas de responder, puedes usar como te dije en la primer respuesta HTMLParser o codear alguna expresión regular.

Saludos!
Título: Re:urls + python
Publicado por: Hu0r en Marzo 02, 2013, 06:43:07 PM
Ya me leí toda la documentación e hice un par de cosas, pero me asaltan un par de dudas :P. Mira, el código (incompleto, recién lo primero) que tengo y que es verificar un id y el username:

Código (python) [Seleccionar]

#!/usr/bin/python
# -*- coding: utf-8 -*-

print '''---------------------------------
Verificando usuario...
---------------------------------'''

user = input("Introduce el ID de tu usuario: ")

# Unir input(ID) con la url que carga urllib2
# ----------
# -----------

import urllib2
from BeautifulSoup import BeautifulSoup

url = 'http://sitio.com/member.php?u=XXXX'
data = urllib2.urlopen(url).read()
soup = BeautifulSoup(data)

for anchor in soup.findAll('h1'):
    if anchor('strong'):
      print "Bienvenido", anchor('strong')


Usé la librería BeautifulSoup porque me pareció más fácil de entender, y vaya que es así! Ahora dos dudas, lo primero es que, quiero introducir un entero que corresponderá al id del usuario, pero cómo hago que la url sea variable? Es decir, que a la url http://sitio.com/member.php?u= se le agregue el entero que se le introdujo a través de input (quedando http://sitio.com/member.php?u=ENTERO)? Y segundo, al introducir la id (en este caso, modificando la url) accedo al perfil del usuario y con BeautifulSoup parseo el html y encuentro el nombre de usuario, que está dentro de estos tags:

Código (python) [Seleccionar]
<h1><font color="white"><strong>Zefidu</strong></font> ... </h1>

Pero lo que consigo con ese código es:

Bienvenido [<strong>USERNAME</strong>]

Y claramente sólo quiero que diga "USERNAME".

Saludos y gracias!!

---------------------------

EDIT: Me respondo solo, sólo tenía que editar la línea de la URL como sigue:

Código (python) [Seleccionar]
url = 'http://sitio.com/member.php?u=%d' % (user)

:P. Sigo sin saber aún lo del BeautifulSoup!
Título: Re:urls + python
Publicado por: Once en Marzo 02, 2013, 08:45:20 PM
Hola,

Nunca he tocado BeautifulSoup pero parece que está regresando una lista, sólo cambia esta línea

Código (python) [Seleccionar]
print "Bienvenido", anchor('strong')[0]

No debería mostrar los [ ], pero sí la etiqueta <strong> para eliminarla, puedes hacerlo con una expresión regular (muy sencilla para este caso) o con un simple split

Saludos!
Título: Re:urls + python
Publicado por: Hu0r en Marzo 02, 2013, 09:05:24 PM
You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login
Hola,

Nunca he tocado BeautifulSoup pero parece que está regresando una lista, sólo cambia esta línea

Código (python) [Seleccionar]
print "Bienvenido", anchor('strong')[0]

No debería mostrar los [ ], pero sí la etiqueta <strong> para eliminarla, puedes hacerlo con una expresión regular (muy sencilla para este caso) o con un simple split

Saludos!

Gracias, pude eliminar los corchetes ([...]), pero no he podido eliminar los tags. A todo esto, me explicas por qué con
Título: Re:urls + python
Publicado por: Once en Marzo 02, 2013, 09:46:37 PM
You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login
Gracias, pude eliminar los corchetes ([...]), pero no he podido eliminar los tags. A todo esto, me explicas por qué con
  • se eliminaron los corchetes? Y depende del número? :O
anchor('strong') te regresa una lista y al poner el [ 0 ] le indicas que regrese el primer elemento de la lista, sí depende del número, el número lo que hace es que trae el elemento de la lista que corresponde a esa posición (tomando en cuenta que el primer elemento es cero. También puedes usar números negativos, -1 correpondería al último elemento de la lista). Ahora si no colocas el [ 0 ] imprimiras la lista completa (todos los elementos) incluidos los [ ]

Para eliminar la etiqueta <strong> te dejo una expresión regular:

Código (python) [Seleccionar]

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import re

Var = "<strong>USERNAME</strong>"
Usuario = re.findall(r'<strong>(.*?)</strong>', Var)
print Usuario[0]


Saludos!
Título: Re:urls + python
Publicado por: Hu0r en Marzo 03, 2013, 01:46:44 AM
You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login
You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login
Gracias, pude eliminar los corchetes ([...]), pero no he podido eliminar los tags. A todo esto, me explicas por qué con
  • se eliminaron los corchetes? Y depende del número? :O
anchor('strong') te regresa una lista y al poner el [ 0 ] le indicas que regrese el primer elemento de la lista, sí depende del número, el número lo que hace es que trae el elemento de la lista que corresponde a esa posición (tomando en cuenta que el primer elemento es cero. También puedes usar números negativos, -1 correpondería al último elemento de la lista). Ahora si no colocas el [ 0 ] imprimiras la lista completa (todos los elementos) incluidos los [ ]

Para eliminar la etiqueta <strong> te dejo una expresión regular:

Código (python) [Seleccionar]

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import re

Var = "<strong>USERNAME</strong>"
Usuario = re.findall(r'<strong>(.*?)</strong>', Var)
print Usuario[0]


Saludos!

Disculpa la ignorancia... Pero dónde iría eso? xD

Y sobre la librería urllib2, ¿cómo podría asignar que recorra más de una url? ¿Con un while?
Título: Re:urls + python
Publicado por: Once en Marzo 03, 2013, 02:29:12 AM
You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login
Disculpa la ignorancia... Pero dónde iría eso? xD

Y sobre la librería urllib2, ¿cómo podría asignar que recorra más de una url? ¿Con un while?

A la varibale Var le debes asignar el string que te regresa anchor('strong')[0] y en Usuario queda el usuario sin la etiqueta <strong>

Puedes hacerlo con un while o también puedes guardar las urls en una lista y recorrerla con un for

Saludos!
Título: Re:urls + python
Publicado por: Hu0r en Marzo 03, 2013, 02:38:36 AM
You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login
You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login
Disculpa la ignorancia... Pero dónde iría eso? xD

Y sobre la librería urllib2, ¿cómo podría asignar que recorra más de una url? ¿Con un while?

A la varibale Var le debes asignar el string que te regresa anchor('strong')[0] y en Usuario queda el usuario sin la etiqueta <strong>

Puedes hacerlo con un while o también puedes guardar las urls en una lista y recorrerla con un for

Saludos!

Trataré de digerir lo que me dices y te cuento. Te agradezco un montón tu tiempo y dedicación!!!  :D
Título: Re:urls + python
Publicado por: Hu0r en Marzo 03, 2013, 06:57:16 PM
No fue necesario usar la librería re. Bastaba con agregar

Código (python) [Seleccionar]
.string.strip()

Para eliminar el tag molesto. Sobre el while, ¿me echas una mano? No he podido combinar las librerías con el while, lo único que me quedó por hacer es agregar muchas urls aparte y muchos for, lo que implica que el código no es para nada limpio, sino hecho muy brutamente xD!

Onda la idea es si tengo la web

Código (python) [Seleccionar]
sitio.com/?id=1&page=1

Avanzar en páginas, &ṕage=2, &page=3... hasta que encuentre una página que no exista (donde se muestra un error, 404) y termine el loop. El problema es que no he encontrado documentación para hacer esto -.-. No me gusta preguntar mucho, pero bueno...

Saludos!
Título: Re:urls + python
Publicado por: Once en Marzo 03, 2013, 08:01:05 PM
Hola de nuevo, para lo que necesitas, tienes que hacer uso de la libreria httplib

Código (python) [Seleccionar]

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import httplib

Url = "/?id=1&page=%d"
Cont = 1

while True:
    Buff = Url % Cont
    Conn = httplib.HTTPConnection("www.sitio.com")
    Conn.request("GET", Buff)
    Resp = Conn.getresponse().status
    if Resp == 404:
        break
    else:
        print Cont, "Existe"
    Cont += 1


Por cierto, a veces las webs no regresan un 404 cuando no existe el archivo en el servidor, sino que regresan un 302 (por ejemplo el foro)

Y no te preocupes por preguntar que para eso estamos acá.

Saludos!
Título: Re:urls + python
Publicado por: Hu0r en Marzo 04, 2013, 02:46:05 AM
Investigando y preguntando por acá y por allá, encontré lo que quería. Lo dejaré por si alguien lo quiere:

Código (python) [Seleccionar]

#!/usr/bin/python
# -*- coding: utf-8 -*-

import urllib2
from BeautifulSoup import BeautifulSoup

pagenumber = 0
while(1):
    pagenumber = pagenumber +1
    url = 'somesite/cat?=188&paged=%d' % (pagenumber)
    try:
        page = urllib2.urlopen(url) 
        data = page.read()
        soup = BeautifulSoup(data)
        xa = soup.findAll('a', href=True)

        for web in xa:
            if web['href'].startswith('example'):
                print web['href']
        page.close()
    except IOError as e:
        break 



Es decir, si tienes una web del tipo sitio.com/?id=1&page=1 y quieres recorrer y parsear todas esos urls, lo haces con ese código. El parseo difiere dependiendo de lo que quieras.

Gracias por todo, tengo un par de dudas más, pero son más básicas y prefiero abrir otro thread. Se agradece la disposición (nuevamente).

Saludos!!!  :D