Junio 23, 2018, 10:55:49 pm

Autor Tema: Extractor links de capitulos de seriespepito  (Leído 2296 veces)

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

Desconectado hanlly

  • Yo vivo en CPH
  • ***
  • Mensajes: 505
    • Ver Perfil
Extractor links de capitulos de seriespepito
« en: Diciembre 04, 2013, 11:47:14 pm »
Holaaaaaaaaaaaaa!!!!! Tenía mucho tiempo sin entrar aquí!! y la verdad lo extrañaba.

Aquí les traigo uno de los tantos programas que he hecho en estos días....
Es un extractor de links de SeriesPepito.com solo para series. nada de peliculas (o no se, no he probado)

El funcionamiento es un tanto básico.
le damos la url.
él descarga el html de esa url, y filtra las otras urls para cada capitulo.
Esta url tiene el formato You are not allowed to view links. Register or Login

para cada una de esta URL se extrae el capitulo y temporada correspondiente, se anota, y se procesa.

El proceso correspondiente es descargar el html, y buscar las filas (todo esto con la funcion findall del módulo "re", para cada fila comprueba de que estén las condiciones de idioma/servidor correspondiente. Si están, se procede a tomar la url y nuevamente descargar el html para finalmente filtrar el link que se quiere obtener.

El resultado final es una carpeta (con el nombre de "Links - SERIE") donde hay mas carpetas (una por cada temporada) con el nombre "Links - SERIE Tx" donde x es el numero de temporada y dentro de cada una de estas subcarpetas estarán los archivos *.txt correspondientes a cada capítulo

Dentro de cada uno están los links que se pudieron filtrar según las condiciones dadas (idioma, servidores, etc.).

Hay que recalcar que si un archivo de un capítulo falta, es que no se encontraron links dentro de la web correspondiente a dichas condiciones.

Código: (python) You are not allowed to view links. Register or Login
#coding: utf-8

from Tkinter import *
from urllib2 import urlopen
from re import findall
import threading
from os import mkdir, path
from time import sleep

class obtener_datos(threading.Thread):
" Hilo para filtrar todos los links de UN solo capitulo."
def __init__(self, url, tmp, cap, idiomas, servers):
threading.Thread.__init__(self)
self.url=url
self.cap=cap
self.tmp=tmp
self.idiomas=idiomas
self.servidores=servers
self.start()

def run(self):
#aqui pricesamos todos los links de un capitulo
#y los vamos agregando a win.dic (diccionario de la serie completa.)
source=urlopen(self.url).read()
filas=findall(win.cnfg["patron_fila"], source)
for fila in filas:
datos=self.datos_fila(fila)

if datos:
if not self.tmp in win.dic:                    #Si no esta esa temporada, la agregamos
win.dic[self.tmp]={}
if not self.cap in win.dic[self.tmp]:          #y si ese capitulo no esta en esa temporada, lo agregamos
win.dic[self.tmp][self.cap]=[]
win.dic[self.tmp][self.cap].append(datos)      #finalmente agregamos los datos a la lista de links
def datos_fila(self, fila):

"Devuelve (idioma, fecha, servidor, link, usuario)"
"de una fila de la tabla de links de un capitulo"

tdservidor=findall('<td class="tdservidor">.*', fila)[0]
servidor=findall('alt=".*"', tdservidor)[0][5:-1]

if not servidor.lower() in self.servidores:
return False

flag=findall('<td class="tdidioma"><span class="flag flag_\d">\d</span></td>', fila)[0][-13:-12]
idioma=win.cnfg["flags idiomas"][flag]
if not idioma in self.idiomas:
return False

fecha=findall("<td class=\"tdfecha\">\d\d/\d\d/\d\d\d\d</td>", fila)[0][20:-5]


tdenlace=findall('<td class="tdenlace">.*', fila)[0]
enlace=findall('href=".*html', tdenlace)[0][6:]

source=urlopen(enlace).read()

link=findall('title="Bajar..." href=".*"><i class="icon-download">', source)[0][23:-27]

tdusuario=findall('<td class="tdusuario">.*', fila)[0]

if "title=" in tdusuario:
usuario=findall('title=".*"  href', tdusuario)[0][7:-7]
else:
usuario=tdusuario[22:-5]

return (idioma, fecha, servidor, link, usuario)

class iniciar(threading.Thread):
"Hilo para iniciar el proceso."
def __init__(self, url, idiomas, serv):
threading.Thread.__init__(self)
if url[-1]=="/":
url=url[:-1]
self.UrlPepito=url
self.idiomas=idiomas
self.servidores=serv
"http://lost-perdidos.seriespepito.com/"
nombre=url.lower()
nombre=nombre.replace("http:", "")
nombre=nombre.replace("/", "")
nombre=nombre.replace(".seriespepito.com", "")
nombre=nombre.replace("-", " ")
nombre=nombre.title()

self.nombre=nombre
self.start()

def run(self):
s=urlopen(self.UrlPepito).read()
#url para cada capitulo
URLs=findall("%s/temporada-\d/capitulo-\d{1,2}/"%self.UrlPepito, s)
total=len(URLs)

URLs2={} #para recuperar la url de cada capítulo luego e incluirla en cada archivo de links.
while URLs:
url=URLs.pop(0)

tmp=findall("temporada-\d*", url)[0][10:]
cap=findall("capitulo-\d*", url)[0][9:]

URLs2["%sx%s"%(tmp, cap)]=url
obtener_datos(url, tmp, cap, self.idiomas, self.servidores)
porciento=100-((len(URLs))/float(total))*100
estado.config(text="Avance: %s/%s, %.2f%%"%(total-len(URLs), total, porciento))

while threading.activeCount()>int(hilos.get())+2:
pass

Hilos=threading.activeCount()
change=True
while threading.activeCount()>2:
count=threading.activeCount()
if count!=Hilos:
Hilos=count
estado.config(text="Faltan %s Hilos"%Hilos)
sleep(0.1)

dic=win.dic
main="Links - %s"%self.nombre #carpeta principal para esa serie.
if not path.exists(main):
mkdir(main)
for tmp in dic:
for cap in dic[tmp]:
midioma=mserver=mlink=musuario=0 #valores maximos (longitud) de cualquier dato de esos
#para crear la tabla con un ancho maximo
for datos in dic[tmp][cap]:
#(idioma, fecha, servidor, link, usuario)
if len(datos[0])>midioma:  midioma= len(datos[0])
if len(datos[2])>mserver:  mserver= len(datos[2])
if len(datos[3])>mlink:    mlink=   len(datos[3])
if len(datos[4])>musuario: musuario=len(datos[4])

encabezado="TTxCC | %s |   Fecha    | %s | %s |%s |\n"%("Idioma".ljust(midioma), "Server".ljust(mserver), "Usuario".ljust(musuario), "Link".ljust(mlink))

folder="%s\\Links - %s T%s"%(main, self.nombre, tmp)
archivo="%s. %sx%s.txt"%(self.nombre, tmp.rjust(2, "0"), cap.rjust(2, "0")) #nombre del archivo para guardar los datos
url=URLs2["%sx%s"%(tmp, cap)] #Recuperamos url del capitulo correspondiente.

if not path.exists(folder):
mkdir(folder)

f=open("%s/%s"%(folder, archivo), "w")

f.write("Capitulo: %sx%s\n"%(tmp, cap))
f.write("URL: %s\n"%url)
f.write(encabezado)

for dato in dic[tmp][cap]:
#(idioma, fecha, servidor, link, usuario)
linea="%sx%s | %s | %s | %s | %s |%s |\n"%(
tmp.rjust(2, "0"),
cap.rjust(2, "0"),
dato[0].ljust(midioma),
dato[1],
dato[2].ljust(mserver),            #Escribimos los datos a la anchura determinada
dato[4].ljust(musuario),           #anteriormente.
dato[3].ljust(mlink)
)
f.write(linea)
f.close()
estado.config(text="Terminado.")

def error(msg):
ventana=Tk()
Label(ventana, text=msg).pack()
Button(ventana, text="Aceptar", command=ventana.destroy).pack()


def ejecutar():
idiomas=[]
for idioma in win.cnfg["var_idiomas"]:
var=win.cnfg["var_idiomas"][idioma]
if var.get():
idiomas.append(idioma)

url=E_URL.get()

s=[serv.strip() for serv in E_servers.get(0.0, END).encode("utf-8").lower().split("\n")]
servidores=[]
for serv in s:
if serv: servidores.append(serv)

if not url:
error("No se introdujo URL")
elif not servidores:
error("Indique al menos un servidor")
elif not idiomas:
error("Seleccione algun idioma.")
else:
iniciar(url, idiomas, servidores)

if True: #Interfaz
fuente=("Lucida Console", 10, "normal")
win=Tk()
win.title("Extractor links SeriesPepito")
#Al objeto principal le añadimos dos atributos extraoficiales.
#dic, será el diccionario que contendrá todos los links
#config, es una pequeña configuración por default
win.dic={}
win.cnfg={
"patron_fila":'<tr>\n<td class="tdidioma">.*</td>\n<td class="tdfecha">.*</td>\n<td class="tdservidor">.*</td>\n<td class="tdenlace">.*Bajar.*</td>\n<td class="tdusuario">.*</td>\n<td class="tdcomentario">.*</td>\n<td class="tdreportar">.*</td>\n</tr>',
"servers":["putlocker", "mega", "bitshare"],
"flags idiomas":{
#son extraidas del html de un capitulo cualquiera de alguna serie. seleccionando texto por encima de la bandera
#hay un numero, ese numero, flag, corresponde al idioma
"0":"Castellano",
"1":"Latino",
"2":"Ingles",
"3":"Ingles Subtitulado"
},
"flags activos":["1", "0"],
"var_idiomas":{}#Diccionario para las variables de idiomas (no tocar.)
}
if True:#URL
frame_url=Frame(win)
frame_url.pack(anchor="nw", pady=5, padx=5)
Label(frame_url, text="URL:", font=fuente).pack(side=LEFT)
E_URL=Entry(frame_url, font=fuente, width=30)
E_URL.pack(side=LEFT)

main=Frame(win)
main.pack(anchor="nw")
if True:#Servidores
frame_serv=Frame(main)
frame_serv.pack(anchor="nw", padx=5, pady=5, side=LEFT)
Label(frame_serv, text="Servidores para filtrar\n(uno por línea)").pack()
E_servers=Text(frame_serv, font=fuente, height=6, width=20)
E_servers.insert("0.end", "\n".join(win.cnfg["servers"]) + "\n")
E_servers.pack()
if True:#Idiomas
frame_lang=Frame(main)
frame_lang.pack(anchor="nw", padx=5, pady=5, side=LEFT)
Label(frame_lang, text="Idiomas para filtrar").pack()

for flag in win.cnfg["flags idiomas"]:
idioma=win.cnfg["flags idiomas"][flag]
win.cnfg["var_idiomas"][idioma]=IntVar()
Checkbutton(frame_lang, text=idioma, variable=win.cnfg["var_idiomas"][idioma], onvalue=1, offvalue=0).pack(anchor="nw")
if flag in win.cnfg["flags activos"]:
win.cnfg["var_idiomas"][idioma].set(1)

if True:#Botones, Hilos
f=Frame(win)
f.pack(anchor="nw")
Label(f, text="Hilos").pack(side=LEFT, padx=5, pady=5)
hilos=StringVar()
hilos.set("20")
Entry(f, textvariable=hilos, font=fuente, width=5).pack(side=LEFT, padx=5, pady=5)
Button(f, text="Filtrar links", command=ejecutar).pack(side=LEFT, padx=5, pady=5)
if True:#Estado
estado=Label(win, text="Barra de estado... [No iniciado]")
estado.pack(anchor="nw")
win.mainloop()
« Última modificación: Diciembre 05, 2013, 10:56:02 am por hanlly »
You are not allowed to view links. Register or Login

Desconectado JaAViEr

  • ¡ Programming the world !
  • Colaborador
  • ****
  • Mensajes: 8218
  • https://uniendo.la
    • Ver Perfil
    • Ethereum Chile
Re:Extractor links de capitulos de seriespepito
« Respuesta #1 en: Diciembre 05, 2013, 08:52:32 am »
Desearía haberlo probado, pero tengo Debian y el Tkinter no me anda en este SO, deberías usar PyQT4 que es más universal.

Otra cosa sobre las buenas prácticas en Python, es declarar las variables con un espacio :

variable = contenido

Ya que al hacer : variable=contenido

El programa se torna ilegible a la rápida con esas malas prácticas. También te recomiendo que al conectar con cualquier librería a una web externa, controles los errores con "try , except" , pues el control de errores en esos casos es vital, pues dependemos de esa conexión para todo el funcionamiento del programa.


Saludos !
¡MI TWITTER You are not allowed to view links. Register or Login!
You are not allowed to view links. Register or Login !

Desconectado hanlly

  • Yo vivo en CPH
  • ***
  • Mensajes: 505
    • Ver Perfil
Re:Extractor links de capitulos de seriespepito
« Respuesta #2 en: Diciembre 05, 2013, 09:02:32 am »
hmmmm bien, entiendo :)

pero weno... ya el que quiera modificarlo que lo haga :3 luego iré posteando algunos programitas más...

Desconectado JaAViEr

  • ¡ Programming the world !
  • Colaborador
  • ****
  • Mensajes: 8218
  • https://uniendo.la
    • Ver Perfil
    • Ethereum Chile
Re:Extractor links de capitulos de seriespepito
« Respuesta #3 en: Diciembre 05, 2013, 09:29:52 am »
No me refiero a quién quiera modificarlo, me refiero que al programar tengas esas prácticas, para que se pueda leer sin tener que nosotros mismos tener que aplicar los espacios a las variables ni añadir los Try and Except, pues la idea es que lo hagas tú y que cuando entregues un código final ya venga con todo, sino sería muy raro programar algo y añadir al final del post: Ah por cierto, faltan unos try and except pero naaaah, los agregan ustedes ya ?

Saludos!

Desconectado hanlly

  • Yo vivo en CPH
  • ***
  • Mensajes: 505
    • Ver Perfil
Re:Extractor links de capitulos de seriespepito
« Respuesta #4 en: Diciembre 05, 2013, 10:57:25 am »
jajajj vale, lo modificaré lueguito cuando salga del semestre (próxima semana) o en este mismo finde ;)

Tengo unas ideitas y mejoras que aplicarle.


xx
[PyQt4] CSS Extractor

Iniciado por 11Sep

0 Respuestas
1390 Vistas
Último mensaje ſeptiembre 30, 2012, 11:52:57 am
por 11Sep
exclamation
Tuenti SID Extractor [TSE]

Iniciado por mr.blood

2 Respuestas
4323 Vistas
Último mensaje Julio 15, 2011, 02:50:53 pm
por mr.blood
exclamation
[Perl] Emails Extractor 0.2

Iniciado por BigBear

0 Respuestas
1139 Vistas
Último mensaje Diciembre 27, 2013, 08:35:48 am
por BigBear
xx
Ventilador o Extractor de aire

Iniciado por russianchileanboy

4 Respuestas
5088 Vistas
Último mensaje Marzo 23, 2007, 12:28:46 pm
por M.Scofield
exclamation
[Código-PyQT4]Extractor de imágenes - JaAViEr(0x5d)

Iniciado por JaAViEr

0 Respuestas
1046 Vistas
Último mensaje Diciembre 24, 2011, 01:49:38 pm
por JaAViEr
exclamation
[Código-Python]Extractor de formularios+sus propiedades+Inputs - JaAViEr (0x5d)

Iniciado por JaAViEr

0 Respuestas
1180 Vistas
Último mensaje Marzo 21, 2013, 09:58:11 am
por JaAViEr
xx
Curso Rompiendo algoritmos (Todos los capitulos)

Iniciado por Punk-Rock

2 Respuestas
2151 Vistas
Último mensaje Junio 14, 2007, 07:19:31 am
por vVegeta
xx
+ Curso Seguridad Informatica Capitulos & Comentarios. [UPDATE! 25-06-2009]

Iniciado por Confused

30 Respuestas
10286 Vistas
Último mensaje Junio 25, 2009, 01:12:23 pm
por Confused
xx
[DOWN]Icon extractor+Icon Changer

Iniciado por sn0x.

0 Respuestas
1442 Vistas
Último mensaje Marzo 21, 2008, 02:56:15 pm
por sn0x.
question
Links de CPH

Iniciado por sbd2

8 Respuestas
3029 Vistas
Último mensaje Febrero 04, 2008, 08:31:31 am
por sbd2