1、寫在前面
最近看新聞說聖城家園(SCG)倒了,以前BT天堂倒了,暴風影音也不行了,能夠說看個電影愈來愈費力,國內大廠如企鵝和愛奇藝最近也出現一些幺蛾子,雖然目前版權意識雖然愈來愈強,可是不少資源在這些主流視頻網站上面依然沒有,我平時看電影又習慣下載下來再看,因此每次看電影找資源就很麻煩,花了點時間,因而就有了這個程序。
c++
2、目的
輸入一部電影的名字,幫我到BT之家上面看看有沒有,若是有就把下載連接複製給我。工具
3、設計思路
原本想的是直接爬取首頁最近發佈的電影,而後取判斷有沒有,後來想了一下,爲何不直接使用網站的搜索功能呢?網站
4、開始爬蟲url
4.1.分析網站設計
打開網站搜索一個結果,發如今網址裏面直接修改連接的內容就能到達搜索頁面,那這樣就更簡單。
3d
先讓用戶輸入一部電影的名字,直接生成連接。code
# 要求輸入電影名 inputname = input('\n' + '請輸入您要搜索的電影:') # 連接是用網站的搜索功能 url = "http://www.6btbtt.com/search-index-keyword-" + inputname + ".htm"
接下來再看搜索結果是什麼樣的,使用審查元素看看,就會看到搜索結果裏面電影名字和連接會在一個a標籤裏面,類型爲subject_link thread-old read
視頻
至此網站就分析完成了xml
4.2.開始爬取過程htm
剛纔已經獲得了電影名和網站,那麼下面直接得到搜索結果頁面的內容就行,用requests獲取內容,獲取後順便用beautifulsoup解析一下,解析後的東西就是有格式的,這樣才能進行下一步操做。
# 獲取網頁內容並用beautifulsoup解析一下 soup = BeautifulSoup(requests.get(url).text,'lxml') # 給出找到第一個結果,網站搜索結果就是把最新的排在前面,因此一個結果就夠了 movies = soup.find('a','subject_link thread-old')
然而如今咱們是獲得一段內容,它不光包含電影標題和連接,還包含其餘的東西,咱們要作的就是把電影標題和連接分別提取出來。
# 直接輸出電影和連接 try: link = movies.get('href') name = movies.text ####這裏用的是text,由於標籤下面還有標籤,是string沒法獲取文本內容 print('\n' + name) print(link + '\n') except: print("沒有找到這部電影或程序發生未知錯誤")
這裏用try和except來捕捉程序反饋,就是說假如獲取的內容有問題,那程序不崩潰,就執行其餘的或者進行下一步操做
至此,咱們已經獲得了電影和連接了,爬蟲過程也算結束了。
4.3判斷爬取結果和用戶輸入
因爲電影標題出來包含真正的電影名還包含清晰度、年代、格式等等這些信息,一般是這樣的
[BT下載][小丑][BD- MKV/2.12GB][英語中英字幕][1080P][DC年度精彩大片藍光版]
這些咱們都不要,在把它分割出來,單獨取出電影名字,分割方法就是前面是 「下載][」 後面是「][」,取中間文本就能夠。
# 這是用於從網頁的電影標題裏面分割出真正的電影名 def get_str_btw(s,f,b): par = s.partition(f) return (par[2].partition(b))[0][:] try: mname = (get_str_btw(name,"下載][","][")) except: print("沒法匹配搜索結果")
單獨取出電影名字後進行比對,這裏只是簡單地進行文字匹配,原本應該能夠多爬取幾個結果,而後模糊搜索進行匹配的。
# 判斷輸入的和獲取到的電影名字是否匹配 if mname == inputname: print("電影有啦!連接已複製!祝您觀影愉快!" + '\n') pyperclip.copy(link) else: print("我給您找到了這個!")
最後再加上一個讓程序運行完等一下的命令
# 程序執行完不要立刻關閉窗口 os.system("pause")
至此,這個程序就完成了。
運行截圖
五:注意事項
5.1.導入模塊的時候若是發現不能導入,多是缺乏c++運行庫,去下載官方工具安裝就行;
5.2網站裏面看似相同的元素標籤可能不一樣,好比那個熱門電影和新電影標籤不同,一開始遍歷爬取的時候發現老是報錯;
5.3必定要用tryexcept來避免出現意外;
程序可能沒有意義,但生命不息,折騰不止。