elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.
 
Inicio Ayuda Buscar Ingresar Registrarse
29 Mayo 2012, 05:13  


Tema destacado: Suscripción al boletín mensual de elhacker.net

+  Foro de elhacker.net
|-+  Programación
| |-+  Scripting (Moderadores: Novlucker, Leo Gutiérrez., EleKtro H@cker)
| | |-+  [python] crawler http
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: [python] crawler http  (Leído 1,155 veces)
lnvisible


Desconectado Desconectado

Mensajes: 456



Ver Perfil
[python] crawler http
« en: 20 Abril 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 :D

Código
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:

Código
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=%2526quot%253Bsid%2526quot%253B 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!!


« Última modificación: 20 Abril 2011, 23:45 por lnvisible » En línea

.:Swik:.

Desconectado Desconectado

Mensajes: 32



Ver Perfil WWW
Re: [python] crawler http
« Respuesta #1 en: 21 Abril 2011, 12:35 »

Código
import urllib2
from urllib import urlencode
 
diccionario={'user':'swik','passwrd':'pass','cookielength':'9000'}
 
cookie = urllib2.HTTPCookieProcessor()
 
opener = urllib2.build_opener(cookie)
urllib2.install_opener(opener)
 
datos = urlencode(diccionario)
 
direc = urllib2.urlopen('direccion del login', datos)
 
print direc.read()
direc.close()

asi?


« Última modificación: 21 Abril 2011, 12:41 por .:Swik:. » En línea

lnvisible


Desconectado Desconectado

Mensajes: 456



Ver Perfil
Re: [python] crawler http
« Respuesta #2 en: 21 Abril 2011, 15:13 »

Creo que no me vale, urllib2 no está en python 3, no parece manejar el referer y desde luego ese codigo no funcionaría porque para mandar los datos del formulario hay un campo hidden con el sid, por eso tengo que hacer get y luego post.

Intuyo que si lo pasara a python3, arreglara el referer o no, al final tendría el mismo problema, no funcionaría y no sabría por qué.
En línea

lnvisible


Desconectado Desconectado

Mensajes: 456



Ver Perfil
Re: [python] crawler http
« Respuesta #3 en: 23 Abril 2011, 05:55 »

Así es, pasa lo mismo.

Código
#!/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')


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

Puede que alguien se anime ahora que el código es más corto  :¬¬
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Powered by SMF 1.1.16 | SMF © 2006-2008, Simple Machines