Programación Web y Scripting > Python
crawler http
Invisible:
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 ---import http.client, urllib.parsefrom http import cookiesfrom re import findall class CrawlerGeneral (): def __init__(self): self.logininfo = [] self.baseheaders = {"User-Agent":"Mozilla/5.0 (Windows; en-US; XP) Gecko/20101028 Firefox/3.5.15", "Accept": "*/*", "Accept-Language":"en-us,en;q=0.5", "Accept-Charset": "ISO-8859-1,utf-8;q=0.7,*;q=0.7"} self.cookies = cookies.SimpleCookie() self.referer = '' def _act(self, url, method, params={}): headers = self.baseheaders.copy() headers['Referer'] = self.referer headers['Cookie'] = self.cookies.output(header='', sep=';') self.referer = url if(url[:7] == 'htt'+'p://'): url = url[7:] safe = False elif (url[:8] == 'htt'+'ps://'): url = url[8:] safe = True else: self.error("I don't like the protocol, I don't know how to handle this.n" + url) (baseurl, extendedurl) = url.split('/', 1) extendedurl = '/' + extendedurl params = urllib.parse.urlencode(params) conn = http.client.HTTPConnection(baseurl) if not safe else http.client.HTTPSConnection(baseurl) conn.request(method, extendedurl, params, headers) resp = conn.getresponse() return self._processResponse(resp) def _processResponse(self, resp): data = resp.read() headers = resp.getheaders() data = bytes.decode(data) for (k, v) in headers: if k == 'Set-Cookie': self.cookies.load(v) return (headers, data) def post(self, url, params): realparams = urllib.parse.urlencode(params) return self._act(url, 'POST', params) def get(self, url): return self._act(url, 'GET')
Esto es lo que intento hacer para que haga login:
--- Código: Python ---from crawlergeneral import CrawlerGeneralfrom re import findallcg = CrawlerGeneral()(headers, data) = cg.get('htt'+'p://foros.solocodigo.com/ucp.php?mode=login')sid = findall('type="hidden" name="sid" value="([^"]+)"', data)[0](headers, data) = cg.post('htt'+'p://foros.solocodigo.com/ucp.php?mode=login', {'username=':'Invisible','password':'password', 'sid':sid, 'redirect': 'index.php', 'login':'Identificarse'})print(data)
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:
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
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:
F_Tanori:
--- 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:
--- Fin de la cita ---
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:
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.
--- Código: Python ---#!/usr/bin/env python3import urllib.request, urllib.parse class CrawlerGeneral (): def __init__(self): self.headers = [("User-Agent", "Mozilla/5.0 (Windows; en-US; XP) Gecko/20101028 Firefox/3.5.15"), ("Accept", "*/*"), ("Accept-Language":"en-us,en;q=0.5"), ("Accept-Encodingg", "gzip,deflate"), ("Accept-Charset", "ISO-8859-1,utf-8;q=0.7,*;q=0.7")] self.opener = urllib.request.build_opener(urllib.request.HTTPCookieProcessor()) self.referer = '' def open(self, url, params = None): self.opener.addheaders = self.headers + [('Referer', self.referer)] self.referer = url if not params is None: params = bytes(urllib.parse.urlencode(params), 'utf-8') resp = self.opener.open(url, params) return resp.read().decode('utf-8')
--- Código: Python ---from crawlergeneral import CrawlerGeneralfrom re import findallcg = CrawlerGeneral()data = cg.open('htt'+'p://foros.solocodigo.com/ucp.php?mode=login')sid = findall('type="hidden" name="sid" value="([^"]+)"', data)[0]data = cg.open('htt'+'p://foros.solocodigo.com/ucp.php?mode=login', {'username=':'Invisible','password':'password', 'sid':sid, 'redirect': 'index.php', 'login':'Identificarse'})print(cg.open('htt'+'p://foros.solocodigo.com/'))
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:
Navegación
[#] Página Siguiente
Ir a la versión completa