0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

你用Python寫過(guò)哪些牛逼的程序/腳本?

馬哥Linux運(yùn)維 ? 來(lái)源:未知 ? 作者:李倩 ? 2018-03-20 14:30 ? 次閱讀

有網(wǎng)友在 Quora 上提問(wèn),「你用 Python 寫過(guò)最牛逼的程序/腳本是什么?」。本文摘編了3 個(gè)國(guó)外程序員的多個(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, 搜索電影或電視劇的名字,然后選擇正確的抓取器,下載字幕文件,解壓,剪切并粘貼到電影所在的文件夾,并且需把字幕文件重命名以匹配電影文件的名字。是不是覺(jué)得太無(wú)趣呢?對(duì)了,我之前寫了一個(gè)腳本,用來(lái)下載正確的電影或電視劇字幕文件,并且存儲(chǔ)到與電影文件所在位置。所有的操作步驟僅需一鍵就可以完成。懵逼了嗎?

請(qǐng)看這個(gè) Youtube 視頻:https://youtu.be/Q5YWEqgw9X8

源代碼存放在GitHub:subtitle-downloader

更新:目前,該腳本支持多個(gè)字幕文件同時(shí)下載。步驟:按住 Ctrl ,選擇你想要為其下載字幕的多個(gè)文件 , 最后執(zhí)行腳本即可

2. IMDb 查詢/電子表格生成器

我是一個(gè)電影迷,喜歡看電影。我總是會(huì)為該看哪一部電影而困惑,因?yàn)槲宜鸭舜罅康碾娪?。所以,我?yīng)該如何做才能消除這種困惑,選擇一部今晚看的電影?沒(méi)錯(cuò),就是IMDb。我打開http://imdb.com,輸入電影的名字,看排名,閱讀和評(píng)論,找出一部值得看的電影。

但是,我有太多電影了。誰(shuí)會(huì)想要在搜索框輸入所有的電影的名字呢? 我肯定不會(huì)這樣做,尤其是我相信“如果某些東西是重復(fù)性的,那么它應(yīng)該是可以自動(dòng)化的”。因此,我寫了一個(gè) python 腳本, 目的是為了使用 非官方的 IMDb API 來(lái)獲取數(shù)據(jù)。我選擇一個(gè)電影文件(文件夾),點(diǎn)擊右鍵,選擇‘發(fā)送到’,然后 點(diǎn)擊 IMDB.cmd (順便提一下,IMDB.cmd 這個(gè)文件就是我寫的 python 腳本),就是這樣。

我的瀏覽器會(huì)打開這部電影在IMDb網(wǎng)站上的準(zhǔn)確頁(yè)面。

僅僅只需點(diǎn)擊一個(gè)按鍵,就可以完成如上操作。如果你不能夠了解這個(gè)腳本到底有多酷,以及它可以為你節(jié)省多少時(shí)間,請(qǐng)看這個(gè) Youtube視頻:https://youtu.be/JANNcimQGyk

從現(xiàn)在開始,你再也不需要打開你的瀏覽器,等待加載IMDb的頁(yè)面,鍵入電影的名字。這個(gè)腳本會(huì)幫你完成所有的操作。跟往常一樣,源代碼放在了GitHub:imdb,并且附有操作說(shuō)明。當(dāng)然,由于這個(gè)腳本必須去掉文件或文件夾中的無(wú)意義的字符,比如“DVDRip, YIFY, BRrip”等,所以在運(yùn)行腳本的時(shí)候會(huì)有一定比例的錯(cuò)誤。但是經(jīng)過(guò)測(cè)試,這個(gè)腳本在我?guī)缀跛械碾娪拔募隙歼\(yùn)行的很好。

2014-04-01更新:

許多人在問(wè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ù)庫(kù)!一個(gè)電影愛(ài)好者還能夠要求更多嗎?:)

源代碼在GitHub:imdb

3. theoatmeal.com 連載漫畫下載器

我個(gè)人超級(jí)喜歡 Matthew Inman 的漫畫。它們?cè)诏偪窀阈Φ耐瑫r(shí),卻又發(fā)人深省。但是,我很厭煩重復(fù)點(diǎn)擊下一個(gè),然后才能閱讀每一個(gè)漫畫。另外,由于每一個(gè)漫畫都由多福圖片組成,所以手動(dòng)下載這些漫畫是非常困難的。

基于如上原因,我寫了一個(gè) python 腳本 ,用來(lái)從這個(gè)站點(diǎn)下載所有的漫畫。這個(gè)腳本利用 BeautifulSoup (http://www.crummy.com/software/B…) 解析 HTML 數(shù)據(jù), 所以在運(yùn)行腳本前,必須安裝 BeautifulSoup。 用于下載燕麥片(馬修.英曼的一部漫畫作品)的下載器已經(jīng)上傳到GitHub:theoatmeal.com-downloader 。(漫畫)下載完后的文件夾是這樣的 :D

4.someecards.com 下載器

成功地從http://www.theoatmeal.com下載了整部漫畫后,我在想是否我可以做同樣的事情 , 從另一個(gè)我喜歡的站點(diǎn)— 搞笑的,唯一的http://www.someecards.com. 下載一些東西呢?

somececards 的問(wèn)題是,圖片命名是完全隨機(jī)的,所有圖片的排放沒(méi)有特定的順序,并且一共有52 個(gè)大的類別, 每一個(gè)類別都有數(shù)以千計(jì)的圖片。

我知道,如果我的腳本是多線程的話,那將是非常完美的,因?yàn)橛写罅康臄?shù)據(jù)需要解析和下載,因此我給每一個(gè)類別中的每一頁(yè)都分配一個(gè)線程。這個(gè)腳本會(huì)從網(wǎng)站的每一個(gè)單獨(dú)的分類下載搞笑的電子賀卡,并且把每一個(gè)放到單獨(dú)的文件夾。現(xiàn)在,我擁有這個(gè)星球上最好笑的電子賀卡私人收藏。下載完成后,我的文件夾是這樣的:

沒(méi)錯(cuò),我的私人收藏總共包括:52個(gè)類別,5036個(gè)電子賀卡。 源代碼在這里:someecards.com-downloader

編輯:很多人問(wèn)我是否可以共享我下載的所有文件,(在這里,我要說(shuō))由于我的網(wǎng)絡(luò)不太穩(wěn)定,我沒(méi)辦法把我的收藏上傳到網(wǎng)絡(luò)硬盤,但是我已經(jīng)上傳一個(gè)種子文件,你們可以在這里下載:somecards.com Site Rip torrent

種下種子,傳播愛(ài):)

Akshit Khurana,4400+ 頂

感謝500多個(gè)朋友在Facebook上為我送出的生日祝福

有三個(gè)故事讓我的21歲生日變的難忘,這是最后一個(gè)故事。我傾向于在每一條祝福下親自評(píng)論,但是使用 python 來(lái)做更好。

# Thanking everyone who wished me on my birthdayimport requestsimport json# Aman's post timeAFTER = 1353233754TOKEN = ' 'def get_posts(): """Returns dictionary of id, first names of people who posted on my wall between start and end time""" query = ("SELECT post_id, actor_id, message FROM stream WHERE " "filter_key = 'others' AND source_id = me() AND " "created_time > 1353233754 LIMIT 200") payload = {'q': query, 'access_token': TOKEN} r = requests.get('https://graph.facebook.com/fql', params=payload) result = json.loads(r.text) return result['data']def commentall(wallposts): """Comments thank you on all posts""" #TODO convert to batch request later for wallpost in wallposts: r = requests.get('https://graph.facebook.com/%s' % wallpost['actor_id']) url = 'https://graph.facebook.com/%s/comments' % wallpost['post_id'] user = json.loads(r.text) message = 'Thanks %s :)' % user['first_name'] payload = {'access_token': TOKEN, 'message': message} s = requests.post(url, data=payload) print "Wall post %s done" % wallpost['post_id']if __name__ == '__main__': commentall(get_posts())

為了能夠順利運(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è)不是我最滿意的腳本,但是它簡(jiǎn)單,快捷,有趣。

當(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è)硬盤上)或者說(shuō),在我忘記這些代碼之前,我決定來(lái)回答這個(gè)問(wèn)題。

整理照片

當(dāng)我對(duì)圖像處理感興趣之后,我一直致力于研究機(jī)器學(xué)習(xí)。我寫這個(gè)有趣的腳本,目的是為了分類圖片,很像 Facebook 做的那樣(當(dāng)然這是一個(gè)不夠精確的算法)。 我使用了 OpenCV 的人臉檢測(cè)算法,“haarcascade_frontalface_default.xml”,它可以從一張照片中檢測(cè)到人臉。

你可能已經(jīng)察覺(jué)到這張照片的某些地方被錯(cuò)誤地識(shí)別為人臉。 我試圖通過(guò)修改一些參數(shù)(來(lái)修正這一問(wèn)題),但還是某些地方被錯(cuò)誤地識(shí)別為人臉,這是由相機(jī)的相對(duì)距離導(dǎo)致的。我會(huì)在下一階段解決這一問(wèn)題(訓(xùn)練步驟)。

這個(gè)訓(xùn)練算法需要一些訓(xùn)練素材,每個(gè)人需要至少需要100-120個(gè)訓(xùn)練素材(當(dāng)然多多益善)。 我太懶了,并沒(méi)有為每一個(gè)人挑選照片,并把它們復(fù)制粘帖到訓(xùn)練文件夾。所以,你可能已經(jīng)猜到,這個(gè)腳本會(huì)打開一個(gè)圖片,識(shí)別人臉,并顯示每一個(gè)人臉(腳本會(huì)根據(jù)處于當(dāng)前節(jié)點(diǎn)的訓(xùn)練素材給每一個(gè)人臉預(yù)測(cè)一個(gè)名字)。伴隨著每次你標(biāo)記的照片,Recognizer 會(huì)被更新,并且還會(huì)包含上一次的訓(xùn)練素材。 在訓(xùn)練過(guò)程中,你可以增加新的名字。我使用 python 庫(kù) tkinter 做了一個(gè) GUI。 因此,大多數(shù)時(shí)候,你必須初始化一小部分照片(給照片中的人臉命名),其他的工作都可以交給訓(xùn)練算法。 因此,我訓(xùn)練了 Recognizer ,然后讓它(Recognizer)去處理所有的圖片。

我使用圖片中包含的人的人名來(lái)命名圖片,(例如: Tanmay&*****&*****)。 因此,我可以遍歷整個(gè)文件夾,然后可以通過(guò)輸入人名的方法來(lái)搜索圖片。

初始狀態(tài)下,當(dāng)一個(gè)人臉還沒(méi)有訓(xùn)練素材時(shí)(素材庫(kù)中還沒(méi)有包括這個(gè)人臉的名字),需要詢問(wèn)他/她的名字。

我可以增加一個(gè)名字,像這個(gè)樣子:

當(dāng)訓(xùn)練了幾個(gè)素材后,它會(huì)像這個(gè)樣子:

最后一個(gè)是針對(duì)應(yīng)對(duì)那些垃圾隨機(jī)方塊而使用的變通解決方案。

帶名字的最終文件夾。

所以,現(xiàn)在尋找圖片變得相當(dāng)簡(jiǎn)單。順便提一下,很抱歉(我)放大了這些照片。

import cv2import sysimport os,random,string#choices=['Add a name']import oscurrent_directory=os.path.dirname(os.path.abspath(__file__))from Tkinter import Tkfrom easygui import *import numpy as npx= os.listdir(current_directory)new_x=[]testing=[]for i in x:if i.find('.')==-1:new_x+=[i]else:testing+=[i]x=new_xg=xchoices=['Add a name']+xy= range(1,len(x)+1)def get_images_and_labels():global current_directory,x,y,gif x==[]:return (False,False)image_paths=[]for i in g:path=current_directory+''+ifor filename in os.listdir(path):final_path=path+''+filenameimage_paths+=[final_path]# images will contains face imagesimages = []# labels will contains the label that is assigned to the imagelabels = []for image_path in image_paths:# Read the image and convert to grayscaleimg = cv2.imread(image_path,0)# Convert the image format into numpy arrayimage = np.array(img, 'uint8')# Get the label of the imagebackslash=image_path.rindex('')underscore=image_path.index('_',backslash)nbr = image_path[backslash+1:underscore]t=g.index(nbr)nbr=y[t]# If face is detected, append the face to images and the label to labelsimages.append(image)labels.append(nbr)#cv2.imshow("Adding faces to traning set...", image)#cv2.waitKey(50)# return the images list and labels listreturn images, labels# Perform the traniningdef train_recognizer():recognizer = cv2.createLBPHFaceRecognizer()images, labels = get_images_and_labels()if images==False:return Falsecv2.destroyAllWindows()recognizer.train(images, np.array(labels))return recognizerdef get_name(image_path,recognizer):global x,choices#if recognizer=='':# recognizer=train_recognizer()cascadePath = "haarcascade_frontalface_default.xml"faceCascade = cv2.CascadeClassifier(cascadePath)#recognizer=train_recognizer()x1=testingglobal gprint image_pathimage = cv2.imread(image_path)img = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)predict_image = np.array(img, 'uint8')faces = faceCascade.detectMultiScale(img,scaleFactor=1.3,minNeighbors=5,minSize=(30, 30),flags = http://cv2.cv.CV_HAAR_SCALE_IMAGE)for (x, y, w, h) in faces:f= image[y:y+w,x:x+h]cv2.imwrite('temp.jpg',f)im='temp.jpg'nbr_predicted, conf = recognizer.predict(predict_image[y: y + h, x: x + w])predicted_name=g[nbr_predicted-1]print "{} is Correctly Recognized with confidence {}".format(predicted_name, conf)if conf>=140:continuemsg='Is this '+predicted_namereply = buttonbox(msg, image=im, choices=['Yes','No'])if reply=='Yes':reply=predicted_namedirectory=current_directory+''+replyif not os.path.exists(directory):os.makedirs(directory)random_name=''.join(random.choice(string.ascii_uppercase + string.digits) for _ in range(7))path=directory+''+random_name+'.jpg'cv2.imwrite(path,f)else:msg = "Who is this?"reply = buttonbox(msg, image=im, choices=choices)if reply == 'Add a name':name=enterbox(msg='Enter the name', title='Training', strip=True)print namechoices+=[name]reply=namedirectory=current_directory+''+replyif not os.path.exists(directory):os.makedirs(directory)random_name=''.join(random.choice(string.ascii_uppercase + string.digits) for _ in range(7))path=directory+''+random_name+'.jpg'print pathcv2.imwrite(path,f)# calculate window positionroot = Tk()pos = int(root.winfo_screenwidth() * 0.5), int(root.winfo_screenheight() * 0.2)root.withdraw()WindowPosition = "+%d+%d" % pos# patch rootWindowPositionrootWindowPosition = WindowPositiondef detect_faces(img):global choices,current_directoryimagePath = imgfaceCascade = cv2.CascadeClassifier(cascPath)image = cv2.imread(imagePath)gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)faces = faceCascade.detectMultiScale(gray,scaleFactor=1.3,minNeighbors=5,minSize=(30, 30),flags = http://cv2.cv.CV_HAAR_SCALE_IMAGE)print "Found {0} faces!".format(len(faces))m=0for (x, y, w, h) in faces:m+=1padding=0f= image[y-padding:y+w+padding,x-padding:x+h+padding]cv2.imwrite('temp.jpg',f)im='temp.jpg'msg = "Who is this?"reply = buttonbox(msg, image=im, choices=choices)if reply == 'Add a name':name=enterbox(msg='Enter the name', title='Training', strip=True)print namechoices+=[name]reply=namedirectory=current_directory+''+replyif not os.path.exists(directory):os.makedirs(directory)random_name=''.join(random.choice(string.ascii_uppercase + string.digits) for _ in range(7))path=directory+''+random_name+'.jpg'print pathcv2.imwrite(path,f)def new(img,recognizer):imagePath = current_directory+''+imgprint imagePathget_name(imagePath,recognizer)cascPath = 'haarcascade_frontalface_default.xml'b=0os.system("change_name.py")for filename in os.listdir("."):b+=1if b%10==0 or b==1:os.system("change_name.py")recognizer=train_recognizer()if filename.endswith('.jpg') or filename.endswith('.png'):print filenameimagePath=filename#detect_faces(imagePath)new(imagePath,recognizer)os.remove(filename)raw_input('Done with this photograph')

我想進(jìn)一步修改它的搜索功能,其中會(huì)包含更多的搜索類型,比如基于地理位置,微笑的臉,傷心的臉等等。(這樣我就可以在 Skylawns 上 搜索快樂(lè)的 Tanmay & 沮喪的 Akshay & 快樂(lè)的…)

我還寫了很多腳本,但那都是很久之前的事情了,我也懶得再去檢查這些代碼了,我會(huì)列出部分代碼。

GitHub 鏈接:tanmay2893/Image-Sorting

Gmail 郵件通知

在那段時(shí)間,我沒(méi)有智能手機(jī)。 導(dǎo)致我常常錯(cuò)過(guò)來(lái)自于我所在的研究所的郵件(在我的研究所的郵件 ID),我寫了一個(gè)腳本,可以在我的筆記本上運(yùn)行,而且能給我的手機(jī)發(fā)信息。我使用 python 的 IMAP 庫(kù)來(lái)獲取郵件。我可以輸入一些重要的人的名字,這樣一來(lái),當(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)站沒(méi)有驗(yàn)證碼,即使有,也只是形同虛設(shè)的驗(yàn)證碼(在過(guò)去,一些字母會(huì)被寫在看起來(lái)像圖片一樣的東西上面,因?yàn)樗麄優(yōu)檫@些字母使用了一個(gè) “check” 的背景圖)。 我們可以輕松地從 HTML 網(wǎng)頁(yè)得到這些字母。我不明白他們這樣做的目的是什么,難道僅僅是為了愚弄他們自己?jiǎn)幔?不管怎么樣,我使用短信息腳本來(lái)處理它,經(jīng)過(guò)一段時(shí)間間隔,它會(huì)在我的筆記本上運(yùn)行一次,就像是一個(gè)定時(shí)任務(wù),只要 PNR 狀態(tài)有更新,它就會(huì)把更新信息發(fā)送給我。

YouTube 視頻下載器

這個(gè)腳本會(huì)從 Youtube 頁(yè)面下載所有的 Youtube 視頻 以及他們所有的字幕文件(從Download and save subtitles下載)。為了使下載速度更快一點(diǎn),我使用了多線程。還有一個(gè)功能是,即使你的電腦重啟了,仍然可以暫停和恢復(fù)播放下載的(視頻)。我原本想做一個(gè)UI的,但是我太懶了… 一旦我的下載任務(wù)完成,我就不去關(guān)心 UI 的事情了。

板球比分通知器

我猜想這個(gè)功能已經(jīng)在別的地方提到過(guò)了。一個(gè)窗口通知器。(在右下角的通知區(qū)域,它會(huì)告訴你實(shí)時(shí)比分以及評(píng)論信息)。如果你愿意的化,在某些時(shí)間段,你也可以關(guān)掉它。

WhatsApp 消息

這個(gè)并不太實(shí)用,我只是寫著玩玩。因?yàn)?Whatsapp 有網(wǎng)頁(yè)版,我使用 selenium 和 Python 下載我的所有聯(lián)系人的顯示圖片,并且,一旦有人更新了他們的顯示圖片,我將會(huì)知道。(如何做到的?非常簡(jiǎn)單,在設(shè)定好時(shí)間間隔后,我會(huì)一遍又一遍的不停下載所有的頭像信息,一旦照片的尺寸發(fā)生變化,我將會(huì)知道他/她更新了顯示圖片)。然后我會(huì)給他/她發(fā)一個(gè)信息,不錯(cuò)的頭像。我僅僅使用了一次來(lái)測(cè)試它的可用性。

Nalanda 下載器

我們一般在這個(gè)叫 ‘Nalanda’ 的網(wǎng)站上下載一些教學(xué)課件以及其他的課程資料, ‘Nalanda’ 在 BITS Pilani (Nalanda). 我自己懶得在考試前一天下載所有的課件,所以,我寫了這個(gè)這個(gè)下載器,它可以把每一門科的課件下載到相應(yīng)的文件夾。

代碼:

import mechanize,os,urllib2,urllib,requests,getpass,timestart_time = time.time()from bs4 import BeautifulSoupbr=mechanize.Browser()br.open('https://nalanda.bits-pilani.ac.in/login/index.php')br.select_form(nr=0) name=''while name=='': try: print '*******' username=raw_input('Enter Your Nalanda Username: ') password=getpass.getpass('Password: ') br.form['username']=username br.form['password']=password res=br.submit() response=res.read() soup=BeautifulSoup(response) name=str(soup.find('div',attrs={'class':'logininfo'}).a.string)[:-2] except: print 'Wrong Password'f=open('details.txt','w')f.write(username+'n'+password)f.close()print 'Welcome, '+nameprint 'All the files will be downloaded in your Drive C in a folder named "nalanda"'#print soup.prettify()div=soup.find_all('div',attrs={'class':'box coursebox'})l=len(div)a=[]for i in range(l): d=div[i] s=str(d.div.h2.a.string) s=s[:s.find('(')] c=(s,str(d.div.h2.a['href'])) path='c:nalanda'+c[0] if not os.path.exists(path): os.makedirs(path) a+=[c]#print aoverall=[]for i in range(l): response=br.open(a[i][1]) page=response.read() soup=BeautifulSoup(page) li=soup.find_all('li',attrs={'class':'section main clearfix'}) x=len(li) t=[] folder=a[i][0] print 'Downloading '+folder+' files...' o=[] for j in range(x): g=li[j].ul #print g #raw_input('') if g!=None: temp=http://g.li['class'].split(' ') #raw_input('') if temp[1]=='resource': #print 'yes' #print '********************' o+=[j] h=li[j].find('div',attrs={'class':'content'}) s=str(h.h3.string) path='c:nalanda'+folder if path[-1]==' ': path=path[:-1] path+=''+s if not os.path.exists(path): os.makedirs(path) f=g.find_all('li') r=len(f) z=[] for e in range(r): p=f[e].div.div.a q=f[e].find('span',attrs={'class':'resourcelinkdetails'}).contents link=str(p['href']) text=str(p.find('span').contents[0]) typ='' if str(q[0]).find('word')!=-1: typ='.docx' elif str(q[0]).find('JPEG')!=-1: typ='.jpg' else: typ='.pdf' if typ!='.docx': res=br.open(link) soup=BeautifulSoup(res.read()) if typ=='.jpg': di=soup.find('div',attrs={'class':'resourcecontent resourceimg'}) link=di.img['src'] else: di=soup.find('div',attrs={'class':'resourcecontent resourcepdf'}) link=di.object['data'] try: if not os.path.exists(path+''+text+typ): br.retrieve(link,path+''+text+typ)[0] except: print 'Connectivity Issues' z+=[(link,text,typ)] t+=[(s,z)] if t==[]: print 'No Documents in this subject' overall+=[o] #raw_input('Press any button to resume')#print overallprint 'Time Taken to Download: '+str(time.time()-start_time)+ ' seconds'print 'Do you think you can download all files faster than this :P'print 'Closing in 10 seconds'time.sleep(10)

我自己的 DC++

這個(gè)腳本并不是很有用,目前只有一些學(xué)生在用它, 況且,DC ++ 已經(jīng)提供了一些很酷的功能。我原本可以優(yōu)化我自己的版本,但是,由于我們已經(jīng)有了DC ++,我并沒(méi)有這么做,盡管我已經(jīng)使用 nodeJS 和 python 寫了一個(gè)基礎(chǔ)版本。

工作原理

打開 DC++ , 進(jìn)入一個(gè)中心站點(diǎn),然后連接,我寫了一個(gè) python 腳本來(lái)做這件事。 腳本會(huì)在 PC上創(chuàng)建一個(gè)服務(wù)器(可以通過(guò)修改 SimpleHTTPRequestHandler 來(lái)完成)。

在服務(wù)器端(使用了NodeJS),它會(huì)拿到 PC 的連接,共享給其他的用戶。

這個(gè)是主頁(yè)面:

這個(gè)頁(yè)面顯示了所有的用戶和他們的鏈接。因?yàn)槲医o Nick 加了一個(gè)超鏈接,所以在鏈接這一攔是空的。

所以,當(dāng)用戶數(shù)量增加以后,這個(gè)頁(yè)面會(huì)列出所有的用戶列表?;旧?,這個(gè)頁(yè)面充當(dāng)了一個(gè)你和另外一個(gè)人聯(lián)系的中間人角色。 我還做了一個(gè)在所有用戶中搜索特定文件的功能。

這里是客戶端的 python 文件(這是一段很長(zhǎng)的代碼,我上傳到了 Ideone)

所有這些代碼僅僅用于教育目的。

英文:Quora

http://python.jobbole.com/85986/

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • python
    +關(guān)注

    關(guān)注

    54

    文章

    4759

    瀏覽量

    84295
  • 腳本
    +關(guān)注

    關(guān)注

    1

    文章

    384

    瀏覽量

    14794

原文標(biāo)題:你用 Python 寫過(guò)哪些牛逼的程序/腳本?

文章出處:【微信號(hào):magedu-Linux,微信公眾號(hào):馬哥Linux運(yùn)維】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    基于Python腳本的R語(yǔ)言的函數(shù)

    本文介紹了采用創(chuàng)建一個(gè)Python腳本腳本模仿R風(fēng)格的函數(shù)的方法來(lái)方便地進(jìn)行統(tǒng)計(jì)。 是R語(yǔ)言還是
    的頭像 發(fā)表于 10-12 09:33 ?2052次閱讀
    基于<b class='flag-5'>Python</b><b class='flag-5'>腳本</b>的R語(yǔ)言的函數(shù)

    10個(gè)殺手級(jí)的Python自動(dòng)化腳本

    今天浩道跟大家分享10個(gè)日常工作中用到的python自動(dòng)化腳本。讓感受一番python簡(jiǎn)單強(qiáng)大之處!
    發(fā)表于 11-28 11:07 ?659次閱讀

    如何在bash shell腳本中使用變量

    如果使用編程語(yǔ)言編寫過(guò)程序,那么一定接觸過(guò)變量。而在 bash 腳本的編寫時(shí),變量也是一個(gè)很重要的概念。今天我們分享一下如何在 bash 腳本中使用變量。
    發(fā)表于 12-02 16:32 ?1968次閱讀
    如何在bash shell<b class='flag-5'>腳本</b>中使用變量

    13個(gè)用于日常編程的高級(jí)Python腳本

    今天浩道跟大家分享13個(gè)用于日常編程的高級(jí)python腳本。讓不會(huì)寫腳本的也能感受到其魅力!
    發(fā)表于 12-09 11:47 ?596次閱讀

    ,這是什么軟件制作的,求解答

    ,這是什么軟件制作的,求解答
    發(fā)表于 11-29 10:09

    [分享](1.19最新版)史上最的云手機(jī)手游神器 免root關(guān)機(jī)托管coc輔助

    `[分享(1.19最新版)史上最的云手機(jī)手游神器 免root關(guān)機(jī)托管coc輔助經(jīng)過(guò)測(cè)試,完美支持所有安卓機(jī),免root輔助,還可以24h關(guān)機(jī)托管運(yùn)行超給力!!coc部落沖突輔助、陰陽(yáng)師輔助
    發(fā)表于 02-09 14:41

    如何在 IIS 中執(zhí)行 Python 腳本

    如何在 IIS 中執(zhí)行 Python 腳本 Python 是一種解釋腳本語(yǔ)言,概念類似 Microsoft Visual Basic Scripting Edition (VBSc
    發(fā)表于 02-23 15:13 ?1235次閱讀

    matlab函數(shù)總結(jié)

    matlab函數(shù)總結(jié),想大家會(huì)因?yàn)镸ATLAB函數(shù)不懂吧!自己看看吧!
    發(fā)表于 11-06 17:18 ?0次下載

    Python爬蟲8個(gè)常用的爬蟲技巧分析總結(jié)

    python也差不多一年多了,python應(yīng)用最多的場(chǎng)景還是web快速開發(fā)、爬蟲、自動(dòng)化運(yùn)維:寫過(guò)簡(jiǎn)單網(wǎng)站、寫過(guò)自動(dòng)發(fā)帖
    的頭像 發(fā)表于 08-18 11:45 ?5064次閱讀

    Python寫過(guò)程序/腳本是什么?

    從現(xiàn)在開始,再也不需要打開的瀏覽器,等待加載IMDb的頁(yè)面,鍵入電影的名字。這個(gè)腳本會(huì)幫你完成所有的操作。跟往常一樣,源代碼放在了GitHub:imdb ,并且附有操作說(shuō)明。當(dāng)然,由于這個(gè)
    的頭像 發(fā)表于 10-22 14:25 ?3164次閱讀

    怎樣成為一名程序

    作為程序員,身邊總是有的前輩、后輩或者同輩。的人總是讓人羨慕。比如自己苦搞一天的 BUG ,頭發(fā)快抓掉完了,人家掃上兩眼,改一行代碼
    的頭像 發(fā)表于 01-10 14:39 ?1764次閱讀

    如何使html網(wǎng)頁(yè)與python腳本進(jìn)行通信

    現(xiàn)在運(yùn)行python腳本并轉(zhuǎn)到http://localhost/或http://localhost/并開始按下按鈕,您應(yīng)該會(huì)在python腳本上看到輸入。
    的頭像 發(fā)表于 11-04 10:12 ?7808次閱讀

    程序員是怎么樣

    長(zhǎng)期臥底各大程序員圈,總結(jié)出現(xiàn)實(shí)中那些程序員的主要表現(xiàn)癥狀,如下:
    的頭像 發(fā)表于 12-01 11:51 ?2960次閱讀

    ChatGPT編寫各種腳本

    的還是屬于程序編寫方面,ChatGPT在各個(gè)編程語(yǔ)言上面都挺在行的(嘗試了下Python, Perl, Tcl都挺不錯(cuò)的),可以說(shuō)是一個(gè)各個(gè)語(yǔ)言都很了解的
    的頭像 發(fā)表于 01-13 10:11 ?7304次閱讀

    python寫驗(yàn)證環(huán)境cocotb

    本文介紹了cocotb的安裝、python tb文件的寫法、xrun仿真cocotb的腳本等,我們來(lái)看看體驗(yàn)如何。
    的頭像 發(fā)表于 07-24 09:38 ?399次閱讀
    <b class='flag-5'>用</b><b class='flag-5'>python</b>寫驗(yàn)證環(huán)境cocotb