lunes, 6 de junio de 2011

buscando autos con python y chileautos

Un compañero de trabajo paul beltran anda en busqueda de un toyota yaris, pero como muchos saben este es un auto muy cotizado, y cuando llega a llamar ya el auto se vendio.

Yo le dije que usara buskautos , ya que ellos por cada publicacion de autos, envian un tweet a todos sus seguidores en twitter.

Por ultimo me parecio bastante interesante, tratar de hacer una aplicacion que busque autos en la pagina de chileautos y encontrar las publicaciones nuevas. esto se puede hacer, por que los parametros de busqueda en su sitio son pasados por las urls.

Bueno aqui el buscador.



##
## python buscador.py
##
import urllib, os, re, getpass, smtplib
from email.mime.image import MIMEImage
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.utils import COMMASPACE
import os.path


current_path = "D:\\buscardorDeAutos\\yaris"
xml_dir = current_path + "\\xmlFiles\\"
URL = "http://www2.chileautos.cl/cemagic.asp?pag=1&dea=50&sort=vcrec&ciudad=37&tipo=TODOS&modelo=yaris&ai=1928&af=2011&pi=4000000&pf=5000000&disp=1&formulario=Busqueda_Avanzada";

mail_to = ['vhspiceros@gmail.com','paulbeltran@gmail.com']
mail_subject = '[toyota Yaris] Nueva publicacion en chileautos!!'

def create_ditectory():
if os.path.isdir(xml_dir) == False:
os.mkdir(xml_dir)

def save_url(filename):
os.chdir(xml_dir)
dirs = os.listdir(xml_dir)
urllib.urlretrieve(URL,filename)

def get_content_file(filename):
try:
f = open(filename, "r")
content = f.read()
f.close()
return content
except:
return ""

def filter_content(filename):
content = get_content_file(filename)

beginWord = "<table align='center' border=1 class=\"tbl_Principal\">"
endWord = "<div class='prevnextlinks'>"

content = content[content.find(beginWord):len(content)] ##sacamos el inicio del documento
content = content[0:content.find(endWord)]
return content

def save_file(filename,content):
f = open(filename, "w")
f.write(content)
f.close()

def path_Filename():
dirs = os.listdir(xml_dir)
return xml_dir + str(len(dirs))+'.html'

def path_previus_Filename():
dirs = os.listdir(xml_dir)
return xml_dir + str(len(dirs)-1)+'.html'

def get_id_cars(content):
# TODO: hacer que traiga el precio, para ver variaciones de precio.
return re.findall("codauto\x3D([0-9]*)",content)

def get_diferences(previus,actual):
dif = []
for x in actual:
if x not in previus:
dif.append(x)
return dif

def send_mail(diff):
sender = smtplib.SMTP('smtp.gmail.com')
sender.ehlo()
sender.starttls()
usuario_gmail = 'vhspiceros'
sender.login(usuario_gmail, "******")

msg = MIMEMultipart()
msg['Subject'] = mail_subject
msg['From'] = "vhspiceros@gmail.com"
msg['To'] = COMMASPACE.join(mail_to)


list = ["http://www3.chileautos.cl/auto.asp?codauto=" + x for x in diff]
body = "< br />".join(list)


part1 = MIMEText(body, 'html')
msg.attach(part1)

sender.sendmail(msg['From'], msg['To'],msg.as_string() )
sender.close()


def main():
create_ditectory()
filename = path_Filename()
previus_Filename = path_previus_Filename()
save_url(filename)
content = filter_content(filename)
save_file(filename,content)

previus_content = get_content_file(previus_Filename);

previues_cars = get_id_cars(previus_content)
actual_cars = get_id_cars(content)

dif = get_diferences(previues_cars,actual_cars)
if len(dif) > 0:
send_mail(dif)

if __name__ == "__main__":
main()



A esta aplicacion se le pueden hacer mejoras obviamente, pero ya envia por correo con los links de las nuevas publicaciones, en el futuro se podria hacer que detecte los aumentos o disminuciones de precios.


Ya terminado este desarrollo, que es bastante ocioso la vedad, ahora solo me queda configurarlo en el "programador de tareas" de windows para que se ejecute unas 2 veces al dia :D.


Ahora mi amigo paul, podrá ser uno de los primeros en enterarse cuando se publique un nuevo auto :D.






--
Atte.
Victor Hugo Saavedra
http://vhspiceros.blogspot.com

2 comentarios:

  1. jajaja La necesidad hace al Maestro jajaj
    Muy buena idea y muy buen script

    Kudos!!!!

    ResponderEliminar
  2. Y no sería más rápido usando BeautifulSoup???

    ResponderEliminar