編譯:Python開發(fā)者 - Jake_on 英文:Quora有網(wǎng)友在 Quora 上提問,,「你用 Python 寫過最牛逼的程序/腳本是什么,?」。本文摘編了 3 個(gè)國外程序員的多個(gè)小項(xiàng)目,,含代碼,。Manoj Memana Jayakumar, 3000+ 頂更新:憑借這些腳本,,我找到了工作,!可看我在這個(gè)帖子中的回復(fù),,《Has anyone got a job through Quora? Or somehow made lots of money through Quora?》1. 電影/電視劇 字幕一鍵下載器我們經(jīng)常會(huì)遇到這樣的情景,就是打開字幕網(wǎng)站subscene 或者opensubtitles,, 搜索電影或電視劇的名字,,然后選擇正確的抓取器,下載字幕文件,,解壓,,剪切并粘貼到電影所在的文件夾,并且需把字幕文件重命名以匹配電影文件的名字,。是不是覺得太無趣呢,?對(duì)了,我之前寫了一個(gè)腳本,,用來下載正確的電影或電視劇字幕文件,,并且存儲(chǔ)到與電影文件所在位置。所有的操作步驟僅需一鍵就可以完成,。懵逼了嗎,?請看這個(gè) Youtube 視頻:https:///Q5YWEqgw9X8源代碼存放在GitHub:subtitle-downloader更新:目前,該腳本支持多個(gè)字幕文件同時(shí)下載,。步驟:按住 Ctrl ,,選擇你想要為其下載字幕的多個(gè)文件 , 最后執(zhí)行腳本即可2. IMDb 查詢/電子表格生成器我是一個(gè)電影迷,,喜歡看電影,。我總是會(huì)為該看哪一部電影而困惑,因?yàn)槲宜鸭舜罅康碾娪?。所以,,我?yīng)該如何做才能消除這種困惑,選擇一部今晚看的電影,?沒錯(cuò),,就是IMDb。我打開 http://,,輸入電影的名字,,看排名,閱讀和評(píng)論,,找出一部值得看的電影,。但是,我有太多電影了,。誰會(huì)想要在搜索框輸入所有的電影的名字呢,?我肯定不會(huì)這樣做,,尤其是我相信“如果某些東西是重復(fù)性的,那么它應(yīng)該是可以自動(dòng)化的”,。因此,,我寫了一個(gè) python 腳本, 目的是為了使用 非官方的 IMDb API 來獲取數(shù)據(jù),。我選擇一個(gè)電影文件(文件夾),,點(diǎn)擊右鍵,選擇‘發(fā)送到’,,然后 點(diǎn)擊 IMDB.cmd (順便提一下,,IMDB.cmd 這個(gè)文件就是我寫的 python 腳本),就是這樣,。我的瀏覽器會(huì)打開這部電影在IMDb網(wǎng)站上的準(zhǔn)確頁面,。 僅僅只需點(diǎn)擊一個(gè)按鍵,就可以完成如上操作,。如果你不能夠了解這個(gè)腳本到底有多酷,,以及它可以為你節(jié)省多少時(shí)間,請看這個(gè) Youtube 視頻:https:///JANNcimQGyk從現(xiàn)在開始,,你再也不需要打開你的瀏覽器,,等待加載IMDb的頁面,鍵入電影的名字,。這個(gè)腳本會(huì)幫你完成所有的操作,。跟往常一樣,源代碼放在了GitHub:imdb ,,并且附有操作說明,。當(dāng)然,由于這個(gè)腳本必須去掉文件或文件夾中的無意義的字符,,比如“DVDRip, YIFY, BRrip”等,,所以在運(yùn)行腳本的時(shí)候會(huì)有一定比例的錯(cuò)誤。但是經(jīng)過測試,,這個(gè)腳本在我?guī)缀跛械碾娪拔募隙歼\(yùn)行的很好,。許多人在問我是否可以寫一個(gè)腳本,可以發(fā)現(xiàn)一個(gè)文件夾中所有電影的詳細(xì)信息,,因?yàn)槊恳淮沃荒馨l(fā)現(xiàn)一個(gè)電影的詳細(xì)信息是非常麻煩的,。我已經(jīng)更新了這個(gè)腳本,支持處理整個(gè)文件夾,。腳本會(huì)分析這個(gè)文件夾里的所有子文件夾,,從 IMDb上抓取所有電影的詳細(xì)信息 ,然后打開一個(gè)電子表格,,根據(jù)IMDb 上的排名,,從高到低降序排列所有的電影,。這個(gè)表格中包含了 (所有電影)在 IMDb URL, 年份,,情節(jié),,分類,獲獎(jiǎng)信息,,演員信息,,以及其他的你可能在 IMBb找到的信息,。下面是腳本執(zhí)行后,,生成的表格范例:Your very own personal IMDb database! What more can a movie buff ask for? ;) Source on GitHub: imdb你也可以有一個(gè)個(gè)人 IMDb 數(shù)據(jù)庫!一個(gè)電影愛好者還能夠要求更多嗎,?:)3. 連載漫畫下載器我個(gè)人超級(jí)喜歡 Matthew Inman 的漫畫,。它們在瘋狂搞笑的同時(shí),卻又發(fā)人深省,。但是,,我很厭煩重復(fù)點(diǎn)擊下一個(gè),然后才能閱讀每一個(gè)漫畫,。另外,,由于每一個(gè)漫畫都由多福圖片組成,所以手動(dòng)下載這些漫畫是非常困難的,。基于如上原因,,我寫了一個(gè) python 腳本 ,用來從這個(gè)站點(diǎn)下載所有的漫畫,。這個(gè)腳本利用 BeautifulSoup (http://www./software/B… ) 解析 HTML 數(shù)據(jù),, 所以在運(yùn)行腳本前,必須安裝 BeautifulSoup,。用于下載燕麥片(馬修.英曼的一部漫畫作品)的下載器已經(jīng)上傳到GitHub:-downloader ,。(漫畫)下載完后的文件夾是這樣的 :D成功地從http://www. 下載了整部漫畫后,我在想是否我可以做同樣的事情 ,, 從另一個(gè)我喜歡的站點(diǎn)— 搞笑的,,唯一的http://www. . 下載一些東西呢?somececards 的問題是,,圖片命名是完全隨機(jī)的,,所有圖片的排放沒有特定的順序,并且一共有52 個(gè)大的類別,, 每一個(gè)類別都有數(shù)以千計(jì)的圖片,。我知道,如果我的腳本是多線程的話,,那將是非常完美的,,因?yàn)橛写罅康臄?shù)據(jù)需要解析和下載,,因此我給每一個(gè)類別中的每一頁都分配一個(gè)線程。這個(gè)腳本會(huì)從網(wǎng)站的每一個(gè)單獨(dú)的分類下載搞笑的電子賀卡,,并且把每一個(gè)放到單獨(dú)的文件夾?,F(xiàn)在,我擁有這個(gè)星球上最好笑的電子賀卡私人收藏,。下載完成后,,我的文件夾是這樣的:沒錯(cuò),我的私人收藏總共包括:52個(gè)類別,,5036個(gè)電子賀卡,。源代碼在這里:-downloader 編輯:很多人問我是否可以共享我下載的所有文件,(在這里,,我要說)由于我的網(wǎng)絡(luò)不太穩(wěn)定,,我沒辦法把我的收藏上傳到網(wǎng)絡(luò)硬盤,但是我已經(jīng)上傳一個(gè)種子文件,,你們可以在這里下載:somecards.com Site Rip torrentAkshit Khurana,4400+ 頂感謝 500 多個(gè)朋友在 Facebook 上為我送出的生日祝福有三個(gè)故事讓我的21歲生日變的難忘,,這是最后一個(gè)故事,。我傾向于在每一條祝福下親自評(píng)論,但是使用 python 來做更好,。1… 2 31. # Thanking everyone who wished me on my birthday 4 52. import requests 6 73. import json 8 94. 10 115. # Aman s post time 12 136. AFTER = 1353233754 14 157. TOKEN = 16 178. 18 199. def get_posts(): 20 2110. '''Returns dictionary of id, first names of people who posted on my wall 22 2311. between start and end time''' 24 2512. query = ('SELECT post_id, actor_id, message FROM stream WHERE ' 26 2713. 'filter_key = others AND source_id = me() AND ' 28 2914. 'created_time > 1353233754 LIMIT 200') 30 3115. 32 3316. payload = { q : query, access_token : TOKEN} 34 3517. r = requests.get( https://graph./fql , params=payload) 36 3718. result = json.loads(r.text) 38 3919. return result[ data ] 40 4120. 42 4321. def commentall(wallposts): 44 4522. '''Comments thank you on all posts''' 46 4723. #TODO convert to batch request later 48 4924. for wallpost in wallposts: 50 5125. 52 5326. r = requests.get( https://graph./%s % 54 5527. wallpost[ actor_id ]) 56 5728. url = https://graph./%s/comments % wallpost[ post_id ] 58 5929. user = json.loads(r.text) 60 6130. message = Thanks %s :) % user[ first_name ] 62 6331. payload = { access_token : TOKEN, message : message} 64 6532. s = requests.post(url, data=payload) 66 6733. 68 6934. print 'Wall post %s done' % wallpost[ post_id ] 70 7135. 72 7336. if __name__ == __main__ : 74 7537. commentall(get_posts()) 76 77…
為了能夠順利運(yùn)行腳本,,你需要從Graph API Explorer(需適當(dāng)權(quán)限)獲得 token。本腳本假設(shè)特定時(shí)間戳之后的所有帖子都是生日祝福,。盡管對(duì)評(píng)論功能做了一點(diǎn)改變,,我仍然喜歡每一個(gè)帖子。當(dāng)我的點(diǎn)贊數(shù),,評(píng)論數(shù)以及評(píng)論結(jié)構(gòu)在 ticker(Facebook一項(xiàng)功能,,朋友可以看到另一個(gè)朋友在做什么,比如點(diǎn)贊,,聽歌,,看電影等) 中爆漲后,我的一個(gè)朋友很快發(fā)現(xiàn)此事必有蹊蹺,。盡管這個(gè)不是我最滿意的腳本,,但是它簡單,快捷,,有趣,。當(dāng)我和 Sandesh Agrawal 在網(wǎng)絡(luò)實(shí)驗(yàn)室討論時(shí),有了寫這個(gè)腳本的想法。為此,,Sandesh Agrawal 耽擱了實(shí)驗(yàn)室作業(yè),,深表感謝。Tanmay Kulshrestha,,3300+ 頂好了,,在我失去這個(gè)項(xiàng)目之前(一個(gè)豬一樣的朋友格式化了我的硬盤,我的所有代碼都在那個(gè)硬盤上)或者說,,在我忘記這些代碼之前,我決定來回答這個(gè)問題,。整理照片當(dāng)我對(duì)圖像處理感興趣之后,,我一直致力于研究機(jī)器學(xué)習(xí)。我寫這個(gè)有趣的腳本,,目的是為了分類圖片,,很像 Facebook 做的那樣(當(dāng)然這是一個(gè)不夠精確的算法)。我使用了 OpenCV 的人臉檢測算法,,“haarcascade_frontalface_default.xml”,它可以從一張照片中檢測到人臉,。你可能已經(jīng)察覺到這張照片的某些地方被錯(cuò)誤地識(shí)別為人臉,。我試圖通過修改一些參數(shù)(來修正這一問題),但還是某些地方被錯(cuò)誤地識(shí)別為人臉,,這是由相機(jī)的相對(duì)距離導(dǎo)致的,。我會(huì)在下一階段解決這一問題(訓(xùn)練步驟)。這個(gè)訓(xùn)練算法需要一些訓(xùn)練素材,,每個(gè)人需要至少需要100-120個(gè)訓(xùn)練素材(當(dāng)然多多益善),。我太懶了,并沒有為每一個(gè)人挑選照片,,并把它們復(fù)制粘帖到訓(xùn)練文件夾,。所以,你可能已經(jīng)猜到,,這個(gè)腳本會(huì)打開一個(gè)圖片,,識(shí)別人臉,并顯示每一個(gè)人臉(腳本會(huì)根據(jù)處于當(dāng)前節(jié)點(diǎn)的訓(xùn)練素材給每一個(gè)人臉預(yù)測一個(gè)名字),。伴隨著每次你標(biāo)記的照片,,Recognizer 會(huì)被更新,并且還會(huì)包含上一次的訓(xùn)練素材,。在訓(xùn)練過程中,你可以增加新的名字。我使用 python 庫 tkinter 做了一個(gè) GUI,。因此,,大多數(shù)時(shí)候,,你必須初始化一小部分照片(給照片中的人臉命名),其他的工作都可以交給訓(xùn)練算法,。因此,我訓(xùn)練了 Recognizer ,,然后讓它(Recognizer)去處理所有的圖片,。我使用圖片中包含的人的人名來命名圖片,,(例如:Tanmay&*****&*****),。因此,我可以遍歷整個(gè)文件夾,,然后可以通過輸入人名的方法來搜索圖片,。初始狀態(tài)下,當(dāng)一個(gè)人臉還沒有訓(xùn)練素材時(shí)(素材庫中還沒有包括這個(gè)人臉的名字),,需要詢問他/她的名字,。我可以增加一個(gè)名字,,像這個(gè)樣子:當(dāng)訓(xùn)練了幾個(gè)素材后,,它會(huì)像這個(gè)樣子:最后一個(gè)是針對(duì)應(yīng)對(duì)那些垃圾隨機(jī)方塊而使用的變通解決方案。所以,,現(xiàn)在尋找圖片變得相當(dāng)簡單。順便提一下,,很抱歉(我)放大了這些照片,。1import cv2 2 3import sys 4 5import os,random,string 6 7#choices=[ Add a name ] 8 9import os 10 11current_directory=os.path.dirname(os.path.abspath(__file__)) 12 13from Tkinter import Tk 14 15from easygui import * 16 17import numpy as np 18 19x= os.listdir(current_directory) 20 21new_x=[] 22 23testing=[] 24 25for i in x: 26 27if i.find( . )==-1: 28 29new_x+=[i] 30 31else: 32 33testing+=[i] 34 35x=new_x 36 37g=x 38 39choices=[ Add a name ]+x 40 41y= range(1,len(x)+1) 42 43def get_images_and_labels(): 44 45global current_directory,x,y,g 46 47if x==[]: 48 49return (False,False) 50 51image_paths=[] 52 53for i in g: 54 55path=current_directory+ +i 56 57for filename in os.listdir(path): 58 59final_path=path+ +filename 60 61image_paths+=[final_path] 62 63# images will contains face images 64 65images = [] 66 67# labels will contains the label that is assigned to the image 68 69labels = [] 70 71for image_path in image_paths: 72 73# Read the image and convert to grayscale 74 75img = cv2.imread(image_path,0) 76 77# Convert the image format into numpy array 78 79image = np.array(img, uint8 ) 80 81# Get the label of the image 82 83backslash=image_path.rindex( ) 84 85underscore=image_path.index( _ ,backslash) 86 87nbr = image_path[backslash+1:underscore] 88 89t=g.index(nbr) 90 91nbr=y[t] 92 93# If face is detected, append the face to images and the label to labels 94 95images.append(image) 96 97labels.append(nbr) 98 99#cv2.imshow('Adding faces to traning set...', image) 100 101#cv2.waitKey(50) 102 103# return the images list and labels list 104 105return images, labels 106 107# Perform the tranining 108 109def train_recognizer(): 110 111recognizer = cv2.createLBPHFaceRecognizer() 112 113images, labels = get_images_and_labels() 114 115if images==False: 116 117return False 118 119cv2.destroyAllWindows() 120 121recognizer.train(images, np.array(labels)) 122 123return recognizer 124 125def get_name(image_path,recognizer): 126 127global x,choices 128 129#if recognizer== : 130 131# recognizer=train_recognizer() 132 133cascadePath = 'haarcascade_frontalface_default.xml' 134 135faceCascade = cv2.CascadeClassifier(cascadePath) 136 137#recognizer=train_recognizer() 138 139x1=testing 140 141global g 142 143print image_path 144 145image = cv2.imread(image_path) 146 147img = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) 148 149predict_image = np.array(img, uint8 ) 150 151faces = faceCascade.detectMultiScale( 152 153img, 154 155scaleFactor=1.3, 156 157minNeighbors=5, 158 159minSize=(30, 30), 160 161flags = http://cv2.cv.CV_HAAR_SCALE_IMAGE 162 163) 164 165for (x, y, w, h) in faces: 166 167f= image[y:y+w,x:x+h] 168 169cv2.imwrite( temp.jpg ,f) 170 171im= temp.jpg 172 173nbr_predicted, conf = recognizer.predict(predict_image[y: y + h, x: x + w]) 174 175predicted_name=g[nbr_predicted-1] 176 177print '{} is Correctly Recognized with confidence {}'.format(predicted_name, conf) 178 179if conf>=140: 180 181continue 182 183msg= Is this +predicted_name 184 185reply = buttonbox(msg, image=im, choices=[ Yes , No ]) 186 187if reply== Yes : 188 189reply=predicted_name 190 191directory=current_directory+ +reply 192 193if not os.path.exists(directory): 194 195os.makedirs(directory) 196 197random_name= .join(random.choice(string.ascii_uppercase + string.digits) for _ in range(7)) 198 199path=directory+ +random_name+ .jpg 200 201cv2.imwrite(path,f) 202 203else: 204 205msg = 'Who is this?' 206 207reply = buttonbox(msg, image=im, choices=choices) 208 209if reply == Add a name : 210 211name=enterbox(msg= Enter the name , title= Training , strip=True) 212 213print name 214 215choices+=[name] 216 217reply=name 218 219directory=current_directory+ +reply 220 221if not os.path.exists(directory): 222 223os.makedirs(directory) 224 225random_name= .join(random.choice(string.ascii_uppercase + string.digits) for _ in range(7)) 226 227path=directory+ +random_name+ .jpg 228 229print path 230 231cv2.imwrite(path,f) 232 233 234 235# calculate window position 236 237root = Tk() 238 239pos = int(root.winfo_screenwidth() * 0.5), int(root.winfo_screenheight() * 0.2) 240 241root.withdraw() 242 243WindowPosition = '+%d+%d' % pos 244 245 246 247# patch rootWindowPosition 248 249rootWindowPosition = WindowPosition 250 251def detect_faces(img): 252 253global choices,current_directory 254 255imagePath = img 256 257faceCascade = cv2.CascadeClassifier(cascPath) 258 259image = cv2.imread(imagePath) 260 261gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) 262 263faces = faceCascade.detectMultiScale( 264 265gray, 266 267scaleFactor=1.3, 268 269minNeighbors=5, 270 271minSize=(30, 30), 272 273flags = http://cv2.cv.CV_HAAR_SCALE_IMAGE 274 275) 276 277 278 279print 'Found {0} faces!'.format(len(faces)) 280 281m=0 282 283for (x, y, w, h) in faces: 284 285m+=1 286 287padding=0 288 289f= image[y-padding:y+w+padding,x-padding:x+h+padding] 290 291cv2.imwrite( temp.jpg ,f) 292 293im= temp.jpg 294 295msg = 'Who is this?' 296 297reply = buttonbox(msg, image=im, choices=choices) 298 299if reply == Add a name : 300 301name=enterbox(msg= Enter the name , title= Training , strip=True) 302 303print name 304 305choices+=[name] 306 307reply=name 308 309directory=current_directory+ +reply 310 311if not os.path.exists(directory): 312 313os.makedirs(directory) 314 315random_name= .join(random.choice(string.ascii_uppercase + string.digits) for _ in range(7)) 316 317path=directory+ +random_name+ .jpg 318 319print path 320 321cv2.imwrite(path,f) 322 323def new(img,recognizer): 324 325imagePath = current_directory+ +img 326 327print imagePath 328 329get_name(imagePath,recognizer) 330 331cascPath = haarcascade_frontalface_default.xml 332 333b=0 334 335os.system('change_name.py') 336 337for filename in os.listdir('.'): 338 339b+=1 340 341if b%10==0 or b==1: 342 343os.system('change_name.py') 344 345recognizer=train_recognizer() 346 347if filename.endswith( .jpg ) or filename.endswith( .png ): 348 349print filename 350 351imagePath=filename 352 353#detect_faces(imagePath) 354 355new(imagePath,recognizer) 356 357os.remove(filename) 358 359raw_input( Done with this photograph ) 我想進(jìn)一步修改它的搜索功能,其中會(huì)包含更多的搜索類型,,比如基于地理位置,,微笑的臉,傷心的臉等等,。(這樣我就可以在 Skylawns 上 搜索快樂的 Tanmay & 沮喪的 Akshay & 快樂的…)我還寫了很多腳本,,但那都是很久之前的事情了,我也懶得再去檢查這些代碼了,,我會(huì)列出部分代碼,。GitHub 鏈接:tanmay2893/Image-SortingGmail 郵件通知在那段時(shí)間,,我沒有智能手機(jī)。導(dǎo)致我常常錯(cuò)過來自于我所在的研究所的郵件(在我的研究所的郵件 ID),,我寫了一個(gè)腳本,,可以在我的筆記本上運(yùn)行,而且能給我的手機(jī)發(fā)信息,。我使用 python 的 IMAP 庫來獲取郵件,。我可以輸入一些重要的人的名字,這樣一來,,當(dāng)這些人給我發(fā)了郵件后,,我可以收到短信通知。對(duì)于短信,, 我使用了 way2sms.com(寫了一個(gè) python 腳本,,自動(dòng)登陸我的賬戶,然后發(fā)送 短信),。PNR(Passenger Name Record旅客訂座記錄,,下同) 狀態(tài)短訊鐵路方面不經(jīng)常發(fā)送 PNR 狀態(tài)消息。因此,,我寫了一個(gè)腳本,,可以從印度鐵路網(wǎng)站獲取 PNR 狀態(tài)。這是非常容易的,,因?yàn)槟莻€(gè)網(wǎng)站沒有驗(yàn)證碼,,即使有,也只是形同虛設(shè)的驗(yàn)證碼(在過去,,一些字母會(huì)被寫在看起來像圖片一樣的東西上面,因?yàn)樗麄優(yōu)檫@些字母使用了一個(gè) “check” 的背景圖),。我們可以輕松地從 HTML 網(wǎng)頁得到這些字母,。我不明白他們這樣做的目的是什么,難道僅僅是為了愚弄他們自己嗎,?不管怎么樣,,我使用短信息腳本來處理它,經(jīng)過一段時(shí)間間隔,,它會(huì)在我的筆記本上運(yùn)行一次,,就像是一個(gè)定時(shí)任務(wù),只要 PNR 狀態(tài)有更新,,它就會(huì)把更新信息發(fā)送給我,。YouTube 視頻下載器這個(gè)腳本會(huì)從 Youtube 頁面下載所有的 Youtube 視頻 以及他們所有的字幕文件(從Download and save subtitles 下載)。為了使下載速度更快一點(diǎn),,我使用了多線程,。還有一個(gè)功能是,即使你的電腦重啟了,仍然可以暫停和恢復(fù)播放下載的(視頻),。我原本想做一個(gè)UI的,,但是我太懶了… 一旦我的下載任務(wù)完成,我就不去關(guān)心 UI 的事情了,。板球比分通知器我猜想這個(gè)功能已經(jīng)在別的地方提到過了,。一個(gè)窗口通知器。(在右下角的通知區(qū)域,,它會(huì)告訴你實(shí)時(shí)比分以及評(píng)論信息),。如果你愿意的化,在某些時(shí)間段,,你也可以關(guān)掉它,。WhatsApp 消息這個(gè)并不太實(shí)用,我只是寫著玩玩,。因?yàn)?Whatsapp 有網(wǎng)頁版,,我使用 selenium 和 Python 下載我的所有聯(lián)系人的顯示圖片,并且,,一旦有人更新了他們的顯示圖片,,我將會(huì)知道。(如何做到的,?非常簡單,,在設(shè)定好時(shí)間間隔后,我會(huì)一遍又一遍的不停下載所有的頭像信息,,一旦照片的尺寸發(fā)生變化,,我將會(huì)知道他/她更新了顯示圖片)。然后我會(huì)給他/她發(fā)一個(gè)信息,,不錯(cuò)的頭像,。我僅僅使用了一次來測試它的可用性。Nalanda 下載器我們一般在這個(gè)叫 ‘Nalanda’ 的網(wǎng)站上下載一些教學(xué)課件以及其他的課程資料,, ‘Nalanda’ 在 BITS Pilani (Nalanda). 我自己懶得在考試前一天下載所有的課件,,所以,我寫了這個(gè)這個(gè)下載器,,它可以把每一門科的課件下載到相應(yīng)的文件夾,。1import mechanize,os,urllib2,urllib,requests,getpass,time 2 3start_time = time.time() 4 5from bs4 import BeautifulSoup 6 7br=mechanize.Browser() 8 9br.open( https://nalanda./login/index.php ) 10 11br.select_form(nr=0) 12 13 14 15name= 16 17while name== : 18 19 try: 20 21 print ******* 22 23 username=raw_input( Enter Your Nalanda Username: ) 24 25 password=getpass.getpass( Password: ) 26 27 br.form[ username ]=username 28 29 br.form[ password ]=password 30 31 res=br.submit() 32 33 response=res.read() 34 35 soup=BeautifulSoup(response) 36 37 name=str(soup.find( div ,attrs={ class : logininfo }).a.string)[:-2] 38 39 except: 40 41 print Wrong Password 42 43f=open( details.txt , w ) 44 45f.write(username+ n +password) 46 47f.close() 48 49print Welcome, +name 50 51print All the files will be downloaded in your Drive C in a folder named 'nalanda' 52 53#print soup.prettify() 54 55div=soup.find_all( div ,attrs={ class : box coursebox }) 56 57 58l=len(div) 59 60a=[] 61 62for i in range(l): 63 64 d=div[i] 65 66 s=str(d.div.h2.a.string) 67 68 s=s[:s.find( ( )] 69 70 c=(s,str(d.div.h2.a[ href ])) 71 72 path= c:nalanda +c[0] 73 74 if not os.path.exists(path): 75 76 os.makedirs(path) 77 78 a+=[c] 79 80#print a 81 82overall=[] 83 84for i in range(l): 85 86 response=br.open(a[i][1]) 87 88 page=response.read() 89 90 soup=BeautifulSoup(page) 91 92 li=soup.find_all( li ,attrs={ class : section main clearfix }) 93 94 x=len(li) 95 96 t=[] 97 98 folder=a[i][0] 99 100 print Downloading +folder+ files... 101 102 o=[] 103 104 for j in range(x): 105 106 g=li[j].ul 107 108 #print g 109 110 #raw_input( ) 111 112 if g!=None: 113 114 temp=http://[ class ].split( ) 115 116 #raw_input( ) 117 118 if temp[1]== resource : 119 120 #print yes 121 122 #print ******************** 123 124 o+=[j] 125 126 h=li[j].find( div ,attrs={ class : content }) 127 128 s=str(h.h3.string) 129 130 path= c:nalanda +folder 131 132 if path[-1]== : 133 134 path=path[:-1] 135 136 path+= +s 137 138 if not os.path.exists(path): 139 140 os.makedirs(path) 141 142 f=g.find_all( li ) 143 144 r=len(f) 145 146 z=[] 147 148 for e in range(r): 149 150 p=f[e].div.div.a 151 152 q=f[e].find( span ,attrs={ class : resourcelinkdetails }).contents 153 154 link=str(p[ href ]) 155 156 text=str(p.find( span ).contents[0]) 157 158 typ= 159 160 if str(q[0]).find( word )!=-1: 161 162 typ= .docx 163 164 elif str(q[0]).find( JPEG )!=-1: 165 166 typ= .jpg 167 168 else: 169 170 typ= .pdf 171 172 if typ!= .docx : 173 174 res=br.open(link) 175 176 soup=BeautifulSoup(res.read()) 177 178 if typ== .jpg : 179 180 di=soup.find( div ,attrs={ class : resourcecontent resourceimg }) 181 182 link=di.img[ src ] 183 184 else: 185 186 di=soup.find( div ,attrs={ class : resourcecontent resourcepdf }) 187 188 link=di.object[ data ] 189 190 try: 191 192 if not os.path.exists(path+ +text+typ): 193 194 br.retrieve(link,path+ +text+typ)[0] 195 196 except: 197 198 print Connectivity Issues 199 200 z+=[(link,text,typ)] 201 202 t+=[(s,z)] 203 204 if t==[]: 205 206 print No Documents in this subject 207 208 overall+=[o] 209 210 #raw_input( Press any button to resume ) 211 212#print overall 213 214print Time Taken to Download: +str(time.time()-start_time)+ seconds 215 216print Do you think you can download all files faster than this :P 217 218print Closing in 10 seconds 219 220time.sleep(10)
我自己的 DC++這個(gè)腳本并不是很有用,目前只有一些學(xué)生在用它,, 況且,,DC ++ 已經(jīng)提供了一些很酷的功能。我原本可以優(yōu)化我自己的版本,,但是,,由于我們已經(jīng)有了DC ++,,我并沒有這么做,,盡管我已經(jīng)使用 nodeJS 和 python 寫了一個(gè)基礎(chǔ)版本,。打開 DC++ , 進(jìn)入一個(gè)中心站點(diǎn),,然后連接,,我寫了一個(gè) python 腳本來做這件事。腳本會(huì)在 PC上創(chuàng)建一個(gè)服務(wù)器(可以通過修改 SimpleHTTPRequestHandler 來完成),。在服務(wù)器端(使用了NodeJS),,它會(huì)拿到 PC 的連接,共享給其他的用戶,。這個(gè)頁面顯示了所有的用戶和他們的鏈接,。因?yàn)槲医o Nick 加了一個(gè)超鏈接,所以在鏈接這一攔是空的,。所以,,當(dāng)用戶數(shù)量增加以后,這個(gè)頁面會(huì)列出所有的用戶列表,?;旧希@個(gè)頁面充當(dāng)了一個(gè)你和另外一個(gè)人聯(lián)系的中間人角色,。我還做了一個(gè)在所有用戶中搜索特定文件的功能,。這里是客戶端的 python 文件(這是一段很長的代碼,我上傳到了 Ideone)回復(fù)下方「關(guān)鍵詞」,,獲取優(yōu)質(zhì)資源
回復(fù)關(guān)鍵詞「 pybook03」,立即獲取主頁君與小伙伴一起翻譯的《Think Python 2e》電子版 回復(fù)關(guān)鍵詞「入門資料」,,立即獲取主頁君整理的 10 本 Python 入門書的電子版 回復(fù)關(guān)鍵詞「m」,,立即獲取Python精選優(yōu)質(zhì)文章合集 回復(fù)關(guān)鍵詞「book 數(shù)字」,將數(shù)字替換成 0 及以上數(shù)字,,有驚喜好禮哦~ 題圖:pexels,CC0 授權(quán),。 好文章,,我在看
|