[python] crawler http

Iniciado por lnvisible, 20 Abril 2011, 23:43 PM

0 Miembros y 1 Visitante están viendo este tema.

lnvisible

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) [Seleccionar]
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 (python) [Seleccionar]
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!!

.:Swik:.

#1
Código (python) [Seleccionar]
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?

lnvisible

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é.

lnvisible

Así es, pasa lo mismo.

Código (python) [Seleccionar]
#!/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 (python) [Seleccionar]
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  :¬¬