请看这个 Youtube 视频:https://youtu.be/Q5YWEqgw9X8
源代码存放在GitHub:subtitle-downloader更新:目前,该脚本支持多个字幕文件同时下载。步骤:按住 Ctrl ,选择你想要为其下载字幕的多个文件 , 末了实行脚本即可
2. IMDb 查询/电子表格天生器
我是一个电影迷,喜好看电影。我总是会为该看哪一部电影而困惑,由于我搜集了大量的电影。以是,我该当如何做才能肃清这种困惑,选择一部今晚看的电影?没错,便是IMDb。我打开 http://imdb.com,输入电影的名字,看排名,阅读和评论,找出一部值得看的电影。
但是,我有太多电影了。谁会想要在搜索框输入所有的电影的名字呢?我肯定不会这样做,尤其是我相信“如果某些东西是重复性的,那么它该当是可以自动化的”。因此,我写了一个 python 脚本, 目的是为了利用 非官方的 IMDb API 来获取数据。我选择一个电影文件(文件夹),点击右键,选择‘发送到’,然后 点击 IMDB.cmd (顺便提一下,IMDB.cmd 这个文件便是我写的 python 脚本),便是这样。
我的浏览器会打开这部电影在IMDb网站上的准确页面。
仅仅只需点击一个按键,就可以完成如上操作。如果你不能够理解这个脚本到底有多酷,以及它可以为你节省多少韶光,请看这个 Youtube 视频:https://youtu.be/JANNcimQGyk
从现在开始,你再也不须要打开你的浏览器,等待加载IMDb的页面,键入电影的名字。这个脚本会帮你完成所有的操作。跟往常一样,源代码放在了GitHub:imdb ,并且附有操作解释。当然,由于这个脚本必须去掉文件或文件夹中的无意义的字符,比如“DVDRip, YIFY, BRrip”等,以是在运行脚本的时候会有一定比例的缺点。但是经由测试,这个脚本在我险些所有的电影文件上都运行的很好。
2014-04-01更新:
许多人在问我是否可以写一个脚本,可以创造一个文件夹中所有电影的详细信息,由于每一次只能创造一个电影的详细信息是非常麻烦的。我已经更新了这个脚本,支持处理全体文件夹。脚本会剖析这个文件夹里的所有子文件夹,从 IMDb上抓取所有电影的详细信息 ,然后打开一个电子表格,根据IMDb 上的排名,从高到低降序排列所有的电影。这个表格中包含了 (所有电影)在 IMDb URL, 年份,情节,分类,获奖信息,演员信息,以及其他的你可能在 IMBb找到的信息。下面是脚本实行后,天生的表格范例:
Your very own personal IMDb database! What more can a movie buff ask for? ;)
Source on GitHub:imdb你也可以有一个个人 IMDb 数据库!
一个电影爱好者还能够哀求更多吗?:)源代码在 GitHub:imdb
3. theoatmeal.com 连载漫画下载器
我个人超级喜好 Matthew Inman 的漫画。它们在猖獗搞笑的同时,却又发人深省。但是,我很厌烦重复点击下一个,然后才能阅读每一个漫画。其余,由于每一个漫画都由多福图片组成,以是手动下载这些漫画是非常困难的。
基于如上缘故原由,我写了一个 python 脚本 ,用来从这个站点下载所有的漫画。这个脚本利用 BeautifulSoup (http://www.crummy.com/software/B… ) 解析 HTML 数据, 以是在运行脚本前,必须安装 BeautifulSoup。用于下载燕麦片(马修.英曼的一部漫画作品)的下载器已经上传到GitHub:theoatmeal.com-downloader 。(漫画)下载完后的文件夹是这样的 :D
4. someecards.com 下载器成功地从http://www.theoatmeal.com 下载了整部漫画后,我在想是否我可以做同样的事情 , 从另一个我喜好的站点— 搞笑的,唯一的http://www.someecards.com. 下载一些东西呢?
somececards 的问题是,图片命名是完备随机的,所有图片的排放没有特定的顺序,并且一共有52 个大的种别, 每一个种别都有数以千计的图片。
我知道,如果我的脚本是多线程的话,那将是非常完美的,由于有大量的数据须要解析和下载,因此我给每一个种别中的每一页都分配一个线程。这个脚本会从网站的每一个单独的分类下载搞笑的电子贺卡,并且把每一个放到单独的文件夹。现在,我拥有这个星球上最可笑的电子贺卡私人收藏。下载完成后,我的文件夹是这样的:
没错,我的私人收藏统共包括:52个种别,5036个电子贺卡。源代码在这里:someecards.com-downloader编辑:很多人问我是否可以共享我下载的所有文件,(在这里,我要说)由于我的网络不太稳定,我没办法把我的收藏上传到网络硬盘,但是我已经上传一个种子文件,你们可以在这里下载:somecards.com Site Rip torrent
种下种子,传播爱:)
Akshit Khurana,4400+ 顶感谢 500 多个朋友在 Facebook 上为我送出的生日祝福
有三个故事让我的21岁生日变的难忘,这是末了一个故事。我方向于在每一条祝福下亲自评论,但是利用 python 来做更好。
1…231. # Thanking everyone who wished me on my birthday452. import requests673. import json894.10115. # Aman s post time12136. AFTER = 135323375414157. TOKEN =16178.18199. def get_posts:202110. """Returns dictionary of id, first names of people who posted on my wall222311. between start and end time"""242512. query = ("SELECT post_id, actor_id, message FROM stream WHERE "262713. "filter_key = others AND source_id = me AND "282914. "created_time > 1353233754 LIMIT 200")303115.323316. payload = { q : query, access_token : TOKEN}343517. r = requests.get( https://graph.facebook.com/fql , params=payload)363718. result = json.loads(r.text)383919. return result[ data ]404120.424321. def commentall(wallposts):444522. """Comments thank you on all posts"""464723. #TODO convert to batch request later484924. for wallpost in wallposts:505125.525326. r = requests.get( https://graph.facebook.com/%s %545527. wallpost[ actor_id ])565728. url = https://graph.facebook.com/%s/comments % wallpost[ post_id ]585929. user = json.loads(r.text)606130. message = Thanks %s :) % user[ first_name ]626331. payload = { access_token : TOKEN, message : message}646532. s = requests.post(url, data=payload)666733.686934. print "Wall post %s done" % wallpost[ post_id ]707135.727336. if __name__ == __main__ :747537. commentall(get_posts)7677…
为了能够顺利运行脚本,你须要从Graph API Explorer(需适当权限)得到 token。本脚本假设特定时间戳之后的所有帖子都是生日祝福。
只管对评论功能做了一点改变,我仍旧喜好每一个帖子。
当我的点赞数,评论数以及评论构造在 ticker(Facebook一项功能,朋友可以看到另一个朋友在做什么,比如点赞,听歌,看电影等) 中爆涨后,我的一个朋友很快创造此事必有蹊跷。
只管这个不是我最满意的脚本,但是它大略,快捷,有趣。
当我和 Sandesh Agrawal 在网络实验室谈论时,有了写这个脚本的想法。为此,Sandesh Agrawal 耽搁了实验室作业,深表感谢。
Tanmay Kulshrestha,3300+ 顶
好了,在我失落去这个项目之前(一个猪一样的朋友格式化了我的硬盘,我的所有代码都在那个硬盘上)或者说,在我忘却这些代码之前,我决定来回答这个问题。
整理照片
当我对图像处理感兴趣之后,我一贯致力于研究机器学习。我写这个有趣的脚本,目的是为了分类图片,很像 Facebook 做的那样(当然这是一个不足精确的算法)。我利用了 OpenCV 的人脸检测算法,“haarcascade_frontalface_default.xml”,它可以从一张照片中检测到人脸。
你可能已经察觉到这张照片的某些地方被缺点地识别为人脸。我试图通过修正一些参数(来改动这一问题),但还是某些地方被缺点地识别为人脸,这是由相机的相对间隔导致的。我会不才一阶段办理这一问题(演习步骤)。
这个演习算法须要一些演习素材,每个人须要至少须要100-120个演习素材(当然多多益善)。我太
我利用图片中包含的人的人名来命名图片,(例如:Tanmay&&)。因此,我可以遍历全体文件夹,然后可以通过输入人名的方法来搜索图片。
初始状态下,当一个人脸还没有演习素材时(素材库中还没有包括这个人脸的名字),须要讯问他/她的名字。
我可以增加一个名字,像这个样子:
当演习了几个素材后,它会像这个样子:
末了一个是针对应对那些垃圾随机方块而利用的变通办理方案。
带名字的终极文件夹。
以是,现在探求图片变得相称大略。顺便提一下,很抱歉(我)放大了这些照片。
1import cv223import sys45import os,random,string67#choices=[ Add a name ]89import os1011current_directory=os.path.dirname(os.path.abspath(__file__))1213from Tkinter import Tk1415from easygui import 1617import numpy as np1819x= os.listdir(current_directory)2021new_x=2223testing=2425for i in x:2627if i.find( . )==-1:2829new_x+=[i]3031else:3233testing+=[i]3435x=new_x3637g=x3839choices=[ Add a name ]+x4041y= range(1,len(x)+1)4243def get_images_and_labels:4445global current_directory,x,y,g4647if x==:4849return (False,False)5051image_paths=5253for i in g:5455path=current_directory+ +i5657for filename in os.listdir(path):5859final_path=path+ +filename6061image_paths+=[final_path]6263# images will contains face images6465images =6667# labels will contains the label that is assigned to the image6869labels =7071for image_path in image_paths:7273# Read the image and convert to grayscale7475img = cv2.imread(image_path,0)7677# Convert the image format into numpy array7879image = np.array(img, uint8 )8081# Get the label of the image8283backslash=image_path.rindex8485underscore=image_path.index( _ ,backslash)8687nbr = image_path[backslash+1:underscore]8889t=g.index(nbr)9091nbr=y[t]9293# If face is detected, append the face to images and the label to labels9495images.append(image)9697labels.append(nbr)9899#cv2.imshow("Adding faces to traning set...", image)100101#cv2.waitKey(50)102103# return the images list and labels list104105return images, labels106107# Perform the tranining108109def train_recognizer:110111recognizer = cv2.createLBPHFaceRecognizer112113images, labels = get_images_and_labels114115if images==False:116117return False118119cv2.destroyAllWindows120121recognizer.train(images, np.array(labels))122123return recognizer124125def get_name(image_path,recognizer):126127global x,choices128129#if recognizer== :130131# recognizer=train_recognizer132133cascadePath = "haarcascade_frontalface_default.xml"134135faceCascade = cv2.CascadeClassifier(cascadePath)136137#recognizer=train_recognizer138139x1=testing140141global g142143print image_path144145image = cv2.imread(image_path)146147img = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)148149predict_image = np.array(img, uint8 )150151faces = faceCascade.detectMultiScale(152153img,154155scaleFactor=1.3,156157minNeighbors=5,158159minSize=(30, 30),160161flags = http://cv2.cv.CV_HAAR_SCALE_IMAGE162163)164165for (x, y, w, h) in faces:166167f= image[y:y+w,x:x+h]168169cv2.imwrite( temp.jpg ,f)170171im= temp.jpg172173nbr_predicted, conf = recognizer.predict(predict_image[y: y + h, x: x + w])174175predicted_name=g[nbr_predicted-1]176177print "{} is Correctly Recognized with confidence {}".format(predicted_name, conf)178179if conf>=140:180181continue182183msg= Is this +predicted_name184185reply = buttonbox(msg, image=im, choices=[ Yes , No ])186187if reply== Yes :188189reply=predicted_name190191directory=current_directory+ +reply192193if not os.path.exists(directory):194195os.makedirs(directory)196197random_name= .join(random.choice(string.ascii_uppercase + string.digits) for _ in range(7))198199path=directory+ +random_name+ .jpg200201cv2.imwrite(path,f)202203else:204205msg = "Who is this?"206207reply = buttonbox(msg, image=im, choices=choices)208209if reply == Add a name :210211name=enterbox(msg= Enter the name , title= Training , strip=True)212213print name214215choices+=[name]216217reply=name218219directory=current_directory+ +reply220221if not os.path.exists(directory):222223os.makedirs(directory)224225random_name= .join(random.choice(string.ascii_uppercase + string.digits) for _ in range(7))226227path=directory+ +random_name+ .jpg228229print path230231cv2.imwrite(path,f)232233234235# calculate window position236237root = Tk238239pos = int(root.winfo_screenwidth 0.5), int(root.winfo_screenheight 0.2)240241root.withdraw242243WindowPosition = "+%d+%d" % pos244245246247# patch rootWindowPosition248249rootWindowPosition = WindowPosition250251def detect_faces(img):252253global choices,current_directory254255imagePath = img256257faceCascade = cv2.CascadeClassifier(cascPath)258259image = cv2.imread(imagePath)260261gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)262263faces = faceCascade.detectMultiScale(264265gray,266267scaleFactor=1.3,268269minNeighbors=5,270271minSize=(30, 30),272273flags = http://cv2.cv.CV_HAAR_SCALE_IMAGE274275)276277278279print "Found {0} faces!".format(len(faces))280281m=0282283for (x, y, w, h) in faces:284285m+=1286287padding=0288289f= image[y-padding:y+w+padding,x-padding:x+h+padding]290291cv2.imwrite( temp.jpg ,f)292293im= temp.jpg294295msg = "Who is this?"296297reply = buttonbox(msg, image=im, choices=choices)298299if reply == Add a name :300301name=enterbox(msg= Enter the name , title= Training , strip=True)302303print name304305choices+=[name]306307reply=name308309directory=current_directory+ +reply310311if not os.path.exists(directory):312313os.makedirs(directory)314315random_name= .join(random.choice(string.ascii_uppercase + string.digits) for _ in range(7))316317path=directory+ +random_name+ .jpg318319print path320321cv2.imwrite(path,f)322323def new(img,recognizer):324325imagePath = current_directory+ +img326327print imagePath328329get_name(imagePath,recognizer)330331cascPath = haarcascade_frontalface_default.xml332333b=0334335os.system("change_name.py")336337for filename in os.listdir("."):338339b+=1340341if b%10==0 or b==1:342343os.system("change_name.py")344345recognizer=train_recognizer346347if filename.endswith( .jpg ) or filename.endswith( .png ):348349print filename350351imagePath=filename352353#detect_faces(imagePath)354355new(imagePath,recognizer)356357os.remove(filename)358359raw_input( Done with this photograph )
我想进一步修正它的搜索功能,个中会包含更多的搜索类型,比如基于地理位置,微笑的脸,伤心的脸等等。(这样我就可以在 Skylawns 上 搜索快乐的 Tanmay & 沮丧的 Akshay & 快乐的…)
我还写了很多脚本,但那都是良久之前的事情了,我也
GitHub 链接:tanmay2893/Image-Sorting
Gmail 邮件关照
在那段韶光,我没有智好手机。导致我常常错过来自于我所在的研究所的邮件(在我的研究所的邮件 ID),我写了一个脚本,可以在我的条记本上运行,而且能给我的手机发信息。我利用 python 的 IMAP 库来获取邮件。我可以输入一些主要的人的名字,这样一来,当这些人给我发了邮件后,我可以收到短信关照。对付短信, 我利用了 way2sms.com(写了一个 python 脚本,自动上岸我的账户,然后发送 短信)。
PNR(Passenger Name Record乘客订座记录,下同) 状态短讯
铁路方面不常常发送 PNR 状态。因此,我写了一个脚本,可以从印度铁路网站获取 PNR 状态。这是非常随意马虎的,由于那个网站没有验证码,纵然有,也只是形同虚设的验证码(在过去,一些字母会被写在看起来像图片一样的东西上面,由于他们为这些字母利用了一个 “check” 的背景图)。我们可以轻松地从 HTML 网页得到这些字母。我不明白他们这样做的目的是什么,难道仅仅是为了愚弄他们自己吗?不管怎么样,我利用短信息脚本来处理它,经由一段韶光间隔,它会在我的条记本上运行一次,就像是一个定时任务,只要 PNR 状态有更新,它就会把更新信息发送给我。
YouTube 视频下载器
这个脚本会从 Youtube 页面下载所有的 Youtube 视频 以及他们所有的字幕文件(从Download and save subtitles 下载)。为了使下载速率更快一点,我利用了多线程。还有一个功能是,纵然你的电脑重启了,仍旧可以停息和规复播放下载的(视频)。我原来想做一个UI的,但是我太
板球比分关照器
我猜想这个功能已经在别的地方提到过了。一个窗口关照器。(在右下角的关照区域,它会见告你实时比分以及评论信息)。如果你乐意的化,在某些韶光段,你也可以关掉它。
这个并不太实用,我只是写着玩玩。由于 Whatsapp 有网页版,我利用 selenium 和 Python 下载我的所有联系人的显示图片,并且,一旦有人更新了他们的显示图片,我将会知道。(如何做到的?非常大略,在设定好韶光间隔后,我会一遍又一遍的一直下载所有的头像信息,一旦照片的尺寸发生变革,我将会知道他/她更新了显示图片)。然后我会给他/她发一个信息,不错的头像。我仅仅利用了一次来测试它的可用性。
Nalanda 下载器
我们一样平常在这个叫 ‘Nalanda’ 的网站高下载一些传授教化课件以及其他的课程资料, ‘Nalanda’ 在 BITS Pilani (Nalanda). 我自己
代码:
1import mechanize,os,urllib2,urllib,requests,getpass,time23start_time = time.time45from bs4 import BeautifulSoup67br=mechanize.Browser89br.open( https://nalanda.bits-pilani.ac.in/login/index.php )1011br.select_form(nr=0)12131415name=1617while name== :1819 try:2021 print 2223 username=raw_input( Enter Your Nalanda Username: )2425 password=getpass.getpass( Password: )2627 br.form[ username ]=username2829 br.form[ password ]=password3031 res=br.submit3233 response=res.read3435 soup=BeautifulSoup(response)3637 name=str(soup.find( div ,attrs={ class : logininfo }).a.string)[:-2]3839 except:4041 print Wrong Password4243f=open( details.txt , w )4445f.write(username+ n +password)4647f.close4849print Welcome, +name5051print All the files will be downloaded in your Drive C in a folder named "nalanda"5253#print soup.prettify5455div=soup.find_all( div ,attrs={ class : box coursebox })565758l=len(div)5960a=6162for i in range(l):6364 d=div[i]6566 s=str(d.div.h2.a.string)6768 s=s[:s.find( ( )]6970 c=(s,str(d.div.h2.a[ href ]))7172 path= c:nalanda +c[0]7374 if not os.path.exists(path):7576 os.makedirs(path)7778 a+=[c]7980#print a8182overall=8384for i in range(l):8586 response=br.open(a[i][1])8788 page=response.read8990 soup=BeautifulSoup(page)9192 li=soup.find_all( li ,attrs={ class : section main clearfix })9394 x=len(li)9596 t=9798 folder=a[i][0]99100 print Downloading +folder+ files...101102 o=103104 for j in range(x):105106 g=li[j].ul107108 #print g109110 #raw_input111112 if g!=None:113114 temp=http://g.li[ class ].split115116 #raw_input117118 if temp[1]== resource :119120 #print yes121122 #print 123124 o+=[j]125126 h=li[j].find( div ,attrs={ class : content })127128 s=str(h.h3.string)129130 path= c:nalanda +folder131132 if path[-1]== :133134 path=path[:-1]135136 path+= +s137138 if not os.path.exists(path):139140 os.makedirs(path)141142 f=g.find_all( li )143144 r=len(f)145146 z=147148 for e in range(r):149150 p=f[e].div.div.a151152 q=f[e].find( span ,attrs={ class : resourcelinkdetails }).contents153154 link=str(p[ href ])155156 text=str(p.find( span ).contents[0])157158 typ=159160 if str(q[0]).find( word )!=-1:161162 typ= .docx163164 elif str(q[0]).find( JPEG )!=-1:165166 typ= .jpg167168 else:169170 typ= .pdf171172 if typ!= .docx :173174 res=br.open(link)175176 soup=BeautifulSoup(res.read)177178 if typ== .jpg :179180 di=soup.find( div ,attrs={ class : resourcecontent resourceimg })181182 link=di.img[ src ]183184 else:185186 di=soup.find( div ,attrs={ class : resourcecontent resourcepdf })187188 link=di.object[ data ]189190 try:191192 if not os.path.exists(path+ +text+typ):193194 br.retrieve(link,path+ +text+typ)[0]195196 except:197198 print Connectivity Issues199200 z+=[(link,text,typ)]201202 t+=[(s,z)]203204 if t==:205206 print No Documents in this subject207208 overall+=[o]209210 #raw_input( Press any button to resume )211212#print overall213214print Time Taken to Download: +str(time.time-start_time)+ seconds215216print Do you think you can download all files faster than this :P217218print Closing in 10 seconds219220time.sleep(10)
这个脚本并不是很有用,目前只有一些学生在用它, 况且,DC ++ 已经供应了一些很酷的功能。我原来可以优化我自己的版本,但是,由于我们已经有了DC ++,我并没有这么做,只管我已经利用 nodeJS 和 python 写了一个根本版本。
事情事理:
打开 DC++ , 进入一个中央站点,然后连接,我写了一个 python 脚本来做这件事。脚本会在 PC上创建一个做事器(可以通过修正 SimpleHTTPRequestHandler 来完成)。
在做事器端(利用了NodeJS),它会拿到 PC 的连接,共享给其他的用户。
这个是主页面:
这个页面显示了所有的用户和他们的链接。由于我给 Nick 加了一个超链接,以是在链接这一拦是空的。
以是,当用户数量增加往后,这个页面会列出所有的用户列表。基本上,这个页面充当了一个你和其余一个人联系的中间人角色。我还做了一个在所有用户中搜索特定文件的功能。