• Domingo 22 de Diciembre de 2024, 12:50

Autor Tema:  crawler http  (Leído 3841 veces)

Invisible

  • Nuevo Miembro
  • *
  • Mensajes: 7
    • Ver Perfil
crawler http
« en: Miércoles 20 de Abril de 2011, 23:43 »
0
Hola,

Quiero hacer un bot http, pero a la primera de cambio, en cuanto he intentado hacer login en un sitio, ya no he podido seguir, algo falla y no se que es.

Este es el bot, muy simple, aunque estoy muy orgullosa de lo que llevo :D

Código: Python
  1. import http.client, urllib.parse
  2. from http import cookies
  3. from re import findall
  4.  
  5. class CrawlerGeneral ():
  6.   def __init__(self):
  7.     self.logininfo = []
  8.     self.baseheaders = {"User-Agent":"Mozilla/5.0 (Windows; en-US; XP) Gecko/20101028 Firefox/3.5.15",
  9.                         "Accept": "*/*", "Accept-Language":"en-us,en;q=0.5",
  10.                         "Accept-Charset": "ISO-8859-1,utf-8;q=0.7,*;q=0.7"}
  11.     self.cookies = cookies.SimpleCookie()
  12.     self.referer = ''
  13.        
  14.   def _act(self, url, method, params={}):
  15.     headers = self.baseheaders.copy()
  16.     headers['Referer'] = self.referer
  17.     headers['Cookie'] = self.cookies.output(header='', sep=';')
  18.     self.referer = url
  19.     if(url[:7] == 'htt'+'p://'):
  20.       url = url[7:]
  21.       safe = False
  22.     elif (url[:8] == 'htt'+'ps://'):
  23.       url = url[8:]
  24.       safe = True
  25.     else:
  26.       self.error("I don't like the protocol, I don't know how to handle this.n" + url)
  27.     (baseurl, extendedurl) = url.split('/', 1)
  28.     extendedurl = '/' + extendedurl
  29.     params = urllib.parse.urlencode(params)
  30.     conn = http.client.HTTPConnection(baseurl) if not safe else http.client.HTTPSConnection(baseurl)
  31.     conn.request(method, extendedurl, params, headers)
  32.     resp = conn.getresponse()
  33.     return self._processResponse(resp)
  34.  
  35.   def _processResponse(self, resp):
  36.     data = resp.read()
  37.     headers = resp.getheaders()
  38.     data = bytes.decode(data)
  39.     for (k, v) in headers:
  40.       if k == 'Set-Cookie':
  41.         self.cookies.load(v)
  42.     return (headers, data)
  43.  
  44.   def post(self, url, params):
  45.     realparams = urllib.parse.urlencode(params)
  46.     return self._act(url, 'POST', params)
  47.  
  48.   def get(self, url):
  49.     return self._act(url, 'GET')
  50.  

Esto es lo que intento hacer para que haga login:

Código: Python
  1. from crawlergeneral import CrawlerGeneral
  2. from re import findall
  3. cg = CrawlerGeneral()
  4. (headers, data) = cg.get('htt'+'p://foros.solocodigo.com/ucp.php?mode=login')
  5. sid = findall('type="hidden" name="sid" value="([^"]+)"', data)[0]
  6. (headers, data) = cg.post('htt'+'p://foros.solocodigo.com/ucp.php?mode=login', {'username=':'Invisible','password':'password', 'sid':sid, 'redirect': 'index.php', 'login':'Identificarse'})
  7. print(data)
  8.  

Pero no funciona, y no se por que...

Necesito hacer login porque en algunos sitios la informacion que se muestra es distinta dependiendo de si haces login o no, este foro lo estoy usando para empezar, porque el login es simple en comparación con otros, creo :-

GRacias!!

F_Tanori

  • Moderador
  • ******
  • Mensajes: 1919
  • Nacionalidad: mx
    • Ver Perfil
Re: crawler http
« Respuesta #1 en: Viernes 22 de Abril de 2011, 15:17 »
0
Desconozco de Pyton,

Pero no crees que es ilogico pensar que los bots inician sesion en todos los sitios? (seria un enorme hueco de seguridad, ademas de problematico) no digo que sea imposible, pero no creo que lo hagan. y por ejemplo en este foro no requiere de hacer login, un bot es tratado de manera diferente (segun el perfil de un bot), ya que es identificado como tal; segun su USER-AGENT STRING

http://www.useragentstring.com/pages/us ... string.php
http://www.seoconsultants.com/meta-tags/robots/
http://www.google.com.mx/#q=crear+un+bo ... &hl=es-419

No creo que haya la necesidad de hacer un login para un crawler,a menos que tuviera propositos especificos

Saludos
El mensaje contiene 1 archivo adjunto. Debes ingresar o registrarte para poder verlo y descargarlo.
" ExIsTo y A vEcEs PiEnSo "

NOTA:
===========================================================================================================================
Este foro es para ayudar, aprender, compartir... usenlo para eso,
NO SE RESUELVEN DUDAS POR MENSAJE PRIVADO Y MENOS POR CORREO
===========================================================================================================================

Invisible

  • Nuevo Miembro
  • *
  • Mensajes: 7
    • Ver Perfil
Re: crawler http
« Respuesta #2 en: Sábado 23 de Abril de 2011, 04:31 »
0
Tiene propósitos específicos, quiero usarlo en facebook ^_^.
Ya he pensado en el user agent, mira donde pone: "User-Agent":"Mozilla/5.0 (Windows; en-US; XP) Gecko/20101028 Firefox/3.5.15"
Espero que facebook no use mucho javascript, o tenga versión sin javascript, porque eso se sale de mis propósitos.
De todas formas, también quiero usarlo en twitter  ^_^.

No me has respondido a la pregunta, pero agradezco la inteción ;)

Hablando de fallos de seguridad, no puedo ver tu adjunto, no tengo suficientes mensajes, pero si le doy a previsualizar mi respuesta sí lo veo :lol:

F_Tanori

  • Moderador
  • ******
  • Mensajes: 1919
  • Nacionalidad: mx
    • Ver Perfil
Re: crawler http
« Respuesta #3 en: Sábado 23 de Abril de 2011, 09:47 »
0
Cita de: "Invisible"
Tiene propósitos específicos, quiero usarlo en facebook ^_^.
Ya he pensado en el user agent, mira donde pone: "User-Agent":"Mozilla/5.0 (Windows; en-US; XP) Gecko/20101028 Firefox/3.5.15"
Espero que facebook no use mucho javascript, o tenga versión sin javascript, porque eso se sale de mis propósitos.
De todas formas, también quiero usarlo en twitter  ^_^.

No me has respondido a la pregunta, pero agradezco la inteción ;)

Hablando de fallos de seguridad, no puedo ver tu adjunto, no tengo suficientes mensajes, pero si le doy a previsualizar mi respuesta sí lo veo :lol:

Pues en tu ejemplo es para este foro (phpBB), y como ya decia antes eso que intentas asi es porque es algo especifico,no es posible utilizar las herramientas que brindan las propias redes sociales?

http://developers.facebook.com/
http://apiwiki.twitter.com/w/page/22554648/FrontPage

En cuanto al fallo ... a estos de phpBB  :rolleyes:
" ExIsTo y A vEcEs PiEnSo "

NOTA:
===========================================================================================================================
Este foro es para ayudar, aprender, compartir... usenlo para eso,
NO SE RESUELVEN DUDAS POR MENSAJE PRIVADO Y MENOS POR CORREO
===========================================================================================================================

Invisible

  • Nuevo Miembro
  • *
  • Mensajes: 7
    • Ver Perfil
Re: crawler http
« Respuesta #4 en: Sábado 23 de Abril de 2011, 15:29 »
0
Entonces sí tendría propósitos específicos, cada vez que quisiera usar el crawler con un dominio tendría que hacerlo nuevo. Si quiero guardar mis mensajes privados de phpBB o los favoritos de yahoo bookmarks no quiero tener que hacer esta parte neuva, ni mirar una librería para manejar una api de un servicio que puede que ni exista (con facebook y twitter somos afortunados). El código de calidad es reusable.

hay muchos sitios que requieren hacer login para acceder a la información, sólo quiero poder hacer eso, creo que no es nada del otro mundo, no sé por qué me respondes con indirectas.

He puesto un código, que parece estar bien pero no funciona, sólo pido eso, que si alguien sabe por qué no funciona me lo diga... debería ser fácil para los expertos de aquí. Ahora incluso he conseguido acortarlo, una clase de 18 líneas no puede ser compleja.

Código: Python
  1. #!/usr/bin/env python3
  2. import urllib.request, urllib.parse
  3.  
  4. class CrawlerGeneral ():
  5.   def __init__(self):
  6.     self.headers = [("User-Agent", "Mozilla/5.0 (Windows; en-US; XP) Gecko/20101028 Firefox/3.5.15"),
  7.                     ("Accept", "*/*"), ("Accept-Language":"en-us,en;q=0.5"),
  8.                     ("Accept-Encodingg", "gzip,deflate"), ("Accept-Charset", "ISO-8859-1,utf-8;q=0.7,*;q=0.7")]
  9.     self.opener = urllib.request.build_opener(urllib.request.HTTPCookieProcessor())
  10.     self.referer = ''
  11.  
  12.   def open(self, url, params = None):
  13.     self.opener.addheaders = self.headers + [('Referer', self.referer)]
  14.     self.referer = url
  15.     if not params is None:
  16.       params = bytes(urllib.parse.urlencode(params), 'utf-8')
  17.     resp = self.opener.open(url, params)
  18.     return resp.read().decode('utf-8')
  19.  


Código: Python
  1. from crawlergeneral import CrawlerGeneral
  2. from re import findall
  3. cg = CrawlerGeneral()
  4. data = cg.open('htt'+'p://foros.solocodigo.com/ucp.php?mode=login')
  5. sid = findall('type="hidden" name="sid" value="([^"]+)"', data)[0]
  6. data = cg.open('htt'+'p://foros.solocodigo.com/ucp.php?mode=login', {'username=':'Invisible','password':'password', 'sid':sid, 'redirect': 'index.php', 'login':'Identificarse'})
  7. print(cg.open('htt'+'p://foros.solocodigo.com/'))
  8.  

El ejemplo es con el foro de aquí porque seguro que quien me responda también tiene cuenta y puede probar. ¿Os habéis puesto paranoicos?  :lol:

F_Tanori

  • Moderador
  • ******
  • Mensajes: 1919
  • Nacionalidad: mx
    • Ver Perfil
Re: crawler http
« Respuesta #5 en: Sábado 23 de Abril de 2011, 18:36 »
0
Cita de: "Invisible"
Entonces sí tendría propósitos específicos, cada vez que quisiera usar el crawler con un dominio tendría que hacerlo nuevo. Si quiero guardar mis mensajes privados de phpBB o los favoritos de yahoo bookmarks no quiero tener que hacer esta parte neuva, ni mirar una librería para manejar una api de un servicio que puede que ni exista (con facebook y twitter somos afortunados). El código de calidad es reusable.

hay muchos sitios que requieren hacer login para acceder a la información, sólo quiero poder hacer eso, creo que no es nada del otro mundo, no sé por qué me respondes con indirectas.

He puesto un código, que parece estar bien pero no funciona, sólo pido eso, que si alguien sabe por qué no funciona me lo diga... debería ser fácil para los expertos de aquí. Ahora incluso he conseguido acortarlo, una clase de 18 líneas no puede ser compleja.


Entiendo eso que dices del software de calidad, aunque la caracteristica es Reutilizacion
quizas es que tu español y el mio no es el mismo.

Si vuelves a leer veras que he dicho, como haz mencionado que es para facebook y twitter, entonces solo he confirmado que es para algo en especifico, y te he preguntado si no te servian las   librerias que los propios sitios ofrecen (hay un signo de interrogacion).No tengo necesidad de contestar indirectas como tu dices, ya que no estoy jugando he dicho las cosas en serio. No entiendo porque te alteras.

Ni mucho menos he dicho que sea algo de otro mundo, ni me sorprende la tarea a realizar, me parece muy buena pero no de otro mundo o imposible.

y Pienso que si haces cosas como esta:

Código: Python
  1. sid = findall('type="hidden" name="sid" value="([^"]+)"', data)[0]
  2.  

Parece que estas buscando un control del formulario web y en cada pagina se llaman diferente, asi que de todos modos se tendra que hacer la adaptacion a cada sitio, creo que seria complicado y al final tener que estar modificando tu metodo para cada pagina, y si le sumas que algunas paginas hacen login con flash, o con AJAX,CAPTCHAs,Timers,IP etc..

en mi opinion es dificil querer hacer algo tan general, lo quizas yo haria es agregar metodos segun el soporte de mi aplicacion, utilizando las Apis probadas y desarrolladas para cada proposito

Código: PHP
  1.  
  2. loginFaceBook()
  3. loginTwitter()
  4. loginMySpace()
  5.  

ya la mayoria de las redes sociales tiene informacion para developers (pues de eso se tratan las redes sociales de compartir)
yahoo tiene Developer Networks,muchas aplicaciones de google (como youtube) tienen GData (Google Data Protocol), MySpace tiene APIS (no se si ya funcione en GData) , pero esto es solo un ejemplo no tienes que tomarlo en otro sentido, entiendo lo que dices y tambien lo que tienes en mente, hacerlo para que funcione con cualquier pagina sin requerir nada especial

En fin...

Animo mucho exito  :suerte:

Saludos
" ExIsTo y A vEcEs PiEnSo "

NOTA:
===========================================================================================================================
Este foro es para ayudar, aprender, compartir... usenlo para eso,
NO SE RESUELVEN DUDAS POR MENSAJE PRIVADO Y MENOS POR CORREO
===========================================================================================================================

Invisible

  • Nuevo Miembro
  • *
  • Mensajes: 7
    • Ver Perfil
Re: crawler http
« Respuesta #6 en: Sábado 23 de Abril de 2011, 19:08 »
0
Cita de: "F_Tanori"
y te he preguntado si no te servian las   librerias que los propios sitios ofrecen
No, no me sirven, porque quiero poder ampliarlo para que tenga un propósito tan general como sea posible, por eso necesito que mi crawler sea capaz de hacer login.

Cita de: "F_Tanori"
Ni mucho menos he dicho que sea algo de otro mundo, ni me sorprende la tarea a realizar, me parece muy buena pero no de otro mundo o imposible.
Si, es sencilla, ¿qué es lo que está mal?

Cita de: "F_Tanori"
y Pienso que si haces cosas como esta:

Código: Python
  1. sid = findall('type="hidden" name="sid" value="([^"]+)"', data)[0]
  2.  

Parece que estas buscando un control del formulario web y en cada pagina se llaman diferente, asi que de todos modos se tendra que hacer la adaptacion a cada sitio,
Date cuenta que eso está fuera de la clase, incluso son dos cajas de code distintas.

Cita de: "F_Tanori"
creo que seria complicado y al final tener que estar modificando tu metodo para cada pagina,
No, la primera caja se va ampliando para que cada vez sirva para más cosas.

Cita de: "F_Tanori"
y si le sumas que algunas paginas hacen login con flash, o con AJAX,CAPTCHAs,Timers,IP etc..
Por eso he empezado por una tan simple como un foro phpbb.

Mira que hay dos cajas de código.

F_Tanori

  • Moderador
  • ******
  • Mensajes: 1919
  • Nacionalidad: mx
    • Ver Perfil
Re: crawler http
« Respuesta #7 en: Sábado 23 de Abril de 2011, 19:55 »
0
Cita de: "Invisible"
Cita de: "F_Tanori"
y te he preguntado si no te servian las   librerias que los propios sitios ofrecen
No, no me sirven, porque quiero poder ampliarlo para que tenga un propósito tan general como sea posible, por eso necesito que mi crawler sea capaz de hacer login.
Exacto solo era una pregunta

Cita de: "Invisible"
Cita de: "F_Tanori"
Ni mucho menos he dicho que sea algo de otro mundo, ni me sorprende la tarea a realizar, me parece muy buena pero no de otro mundo o imposible.
Si, es sencilla, ¿qué es lo que está mal?
No esta mal, al contario me parece muy buena.

Cita de: "Invisible"
Cita de: "F_Tanori"
y Pienso que si haces cosas como esta:

Código: Python
  1. sid = findall('type="hidden" name="sid" value="([^"]+)"', data)[0]
  2.  

Parece que estas buscando un control del formulario web y en cada pagina se llaman diferente, asi que de todos modos se tendra que hacer la adaptacion a cada sitio,
Date cuenta que eso está fuera de la clase, incluso son dos cajas de code distintas.
Lo entiendo, veo la clase, y la utilizacion no hay ningun problema en eso, pero al ser cadenas constantes, significa que tienes que colocarlo dependiendo del sitio, es decir no lo lo identificaria el bot. pero va esta bien como vas

Cita de: "Invisible"
Cita de: "F_Tanori"
creo que seria complicado y al final tener que estar modificando tu metodo para cada pagina,
No, la primera caja se va ampliando para que cada vez sirva para más cosas.

Cita de: "Invisible"
Cita de: "F_Tanori"
y si le sumas que algunas paginas hacen login con flash, o con AJAX,CAPTCHAs,Timers,IP etc..
Por eso he empezado por una tan simple como un foro phpbb.
Claro, eso lo veo y va bien

Cita de: "Invisible"
Mira que hay dos cajas de código.
Eso lo he visto.
" ExIsTo y A vEcEs PiEnSo "

NOTA:
===========================================================================================================================
Este foro es para ayudar, aprender, compartir... usenlo para eso,
NO SE RESUELVEN DUDAS POR MENSAJE PRIVADO Y MENOS POR CORREO
===========================================================================================================================

Invisible

  • Nuevo Miembro
  • *
  • Mensajes: 7
    • Ver Perfil
Re: crawler http
« Respuesta #8 en: Sábado 23 de Abril de 2011, 21:02 »
0
Entonces, ¿por qué no fucniona?

Aparentemente todo está bien, pero no consigo hacer login. Quería hacer login aquí antes de pasar a cosas más complicadas.

he visto que smf requiere sha1, tengo que probarlo, con yahoo ya ni me atrevo, twitter que tiene oauth y cosas más complicadas lo dejo para después.