|
Esta sección te permite ver todos los posts escritos por este usuario. Ten en cuenta que sólo puedes ver los posts escritos en zonas a las que tienes acceso en este momento.
Mensajes - Invisible
Páginas: [1]
1
« en: Domingo 25 de Diciembre de 2011, 14:52 »
Hay un tipo de retos incrementales que son más productivos que los retos habituales. http://en.wikipedia.org/wiki/Cutting_contesthttp://en.wikipedia.org/wiki/Guitar_battleEsto es un reto a ese estilo, consiste en ir añadiendo algo al bot para hacerlo más parecido a una persona en la navegación (con cookies, con referer, con todo eso), además para que sea más fácil indicarle los parámetros que tiene que rellenar (por ejemplo muchos formularios tienen campos hidden, podría rellenarlos él mismo), para que sea más fácil parsear el html después, para que sea más fácil usar proxies... el límite lo pone vuestra imaginación. Creo que puede ser un reto interesante, entretenido, productivo y del que todos saquemos el divertirnos, un código interesante y aprender y hacer algo útil. Vosotros diréis. Aquí tenéis un ejemplo de cómo podría empezarse, veremos si alguien continua o no, en unos días pondré una mejora si nadie se anima, y con eso espero que ya sí se anime alguien. class PHPBot { function PHPBot (){ $ch = $this->ch; curl_setopt($ch, CURLOPT_HEADER , 1); // Include headers in response or not curl_setopt($ch, CURLOPT_RETURNTRANSFER , 1); // Return (don't print) answer of exec curl_setopt($ch, CURLOPT_USERAGENT , "Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.0.12) Gecko/2009070611 Firefox/3.0.12"); curl_setopt($ch, CURLOPT_AUTOREFERER , true); // Isn't this great? curl_setopt($ch, CURLOPT_HTTPHEADER , array('Accept: */*', 'Accept-Language: en-us,en;q=0.5', 'Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7')); } private function act($url, $params = false){ $ch = $this->ch; if ($params != false){ curl_setopt($ch, CURLOPT_POSTFIELDS , $this->myurlencode($params)); } else return $r; } private function myurlencode($dict){ $r = ""; foreach($dict as $key => $value) return $r; } function get ($url){ return $this->act($url); } function post($url, $params){ return $this->act($url, $params); } }
2
« en: Domingo 29 de Mayo de 2011, 13:22 »
Hola. Quiero procesar html en python, no estoy segura de si quiero pasarlo a objetos python como con amara, si quiero usar xml.dom que viene ya de serie con python o si quiero usar xquery o xpath para extraer los valors. De lo que estoy segura es de que no quiero aprender las cuatro cosas para luego ver que no me vale, o que otra es mejor o que he perdido el tiempo, o que no se. ¿que es lo mejor y lo que deberia aprender? Quiero algo que sea facil, estandar y potente. Lo quiero todo GRacias!! PD: ah!! uso python3, amara no me vale por eso, pero puede que haya otras cosas iguales
3
« en: Sábado 23 de Abril de 2011, 21:02 »
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.
4
« en: Sábado 23 de Abril de 2011, 19:08 »
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. 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? y Pienso que si haces cosas como esta:
sid = findall('type="hidden" name="sid" value="([^"]+)"', data)[0]
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. 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. 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.
5
« en: Sábado 23 de Abril de 2011, 15:29 »
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. #!/usr/bin/env python3 import 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')
from crawlergeneral import CrawlerGeneral from re import findall cg = 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?
6
« en: Sábado 23 de Abril de 2011, 04:31 »
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
7
« en: Miércoles 20 de Abril de 2011, 23:43 »
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 import http.client, urllib.parse from http import cookies from 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: from crawlergeneral import CrawlerGeneral from re import findall cg = 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!!
Páginas: [1]
|
|
|