皮爺不知道你們有多少人是喜歡看美劇?html
反正皮爺是個美劇迷,不能說狂,可是看美劇的時間也有差很少10年了。硬生生的把好多部劇都追到了完結。linux
最先之前,網上資源還不是很嚴的時候,找個美劇是十分簡單的。但是最近幾年,網絡資源愈來愈嚴格,尋找美劇確實不容易,並且,新出的美劇,好比《生活大爆炸》S12E11集,若是剛出來,你下載是徹底沒問題的。但是,好比你最近很忙,過了幾周,你想起來你還有3集《生活大爆炸》沒有看,心中暗自竊喜,一會兒看3集,是很爽的事兒。當你打開網頁,複製網頁資源連接到迅雷裏,迅雷過一下子給你彈出個提示:「網絡資源已經下架」。你是否是很蛋疼?這種狀況通常就發生在新出的美劇,隔了幾周以後,就會有這種資源下架的問題。程序員
還有一種狀況比較煩惱,就是,若是你同時追着不少劇,你是否是天天都得查看這個劇是否是更新了?或者這個劇通常是週二更新,可是你想看熟肉(熟肉就是有中文字幕的意思)資源,但是熟肉資源並非週二更新以後馬上更新,最快也得週三,但也有可能週四週五。那麼這三天,你是誰不也得每天網站看一遍是否更新啊?若是你有15部美劇更新,那麼你是否是得天天還少打開5個網頁來查看呢?瀏覽網頁會不會須要費時間?一週瀏覽這種網頁的時間會不會不少?其實你只是須要一個下載地址而已,並不須要看其餘無關的消息。正則表達式
那麼今天,既然皮爺會用Python,會寫爬蟲,並且這種天天追美劇的工做,實際上是一種機械的重複勞動,不值得投入大量時間重複浪費在檢查美劇是否更新上。因此,皮爺用Scrapy寫了一個爬蟲,將本身追的美劇,天天按期的用代碼掃描如下,而後將結果發送到皮爺的郵箱裏。而後天天只要檢查本身郵箱裏面是否有美劇的更新就能夠了。數據庫
這樣搞起來,是否是很方便??是否是很省時間???啊哈哈哈哈。彆着急,今天這篇文章講的只是爬蟲相關部分,還有一篇文章,專門講皮爺怎麼講這個爬蟲放到網上,而後讓你們本身填寫配置信息,而後供你們使用,到時候只須要填寫,你要接受美劇更新信息的郵箱,還有你要追的美劇就能夠了。到時候會放到 https://peekpa.tech 網站裏面。小程序
首先,皮爺如今一直在用的一個美劇網站:bash
http://www.ttmeiju.vip/服務器
就是『每天美劇』,這裏更新的比較快。苦於以前的人人美劇被強制關停了,如今的人人影視又老是打一槍換個地方,而電影天堂的跟新又太慢,因此,皮爺就一直在這個網站追美劇。不過有一點,這個網站的美劇熟肉和生肉資源都有,並且隨着美劇資源註解被收攏,可能有些片子就沒有熟肉資源,可是這是個聯繫聽力學習英語的好機會啊。微信
廢話很少說,咱們就先拿《生活大爆炸》這個美劇來分析吧。網絡
進入到《生活大爆炸》的頁面:
http://www.ttmeiju.vip/meiju/The.Big.Bang.Theory.html
能夠看到關鍵信息有這麼幾點:
咱們一條一條來分析:
像這種信息類的網頁,他的URL不可能太特別,應該是個別規整的。爲了分析出規則,咱們在拿幾個美劇的URL對比一下:
http://www.ttmeiju.vip/meiju/Supergirl.html
http://www.ttmeiju.vip/meiju/The.Blacklist.html
http://www.ttmeiju.vip/meiju/S.W.A.T.html
上面不難看出,URL前面的格式都同樣,是http://www.ttmeiju.vip/meiju/
,而後跟着就是美劇的英文名字,中間空格用.
來鏈接,最後再加一個html
就能夠了。
爲何要知道這個?目的就是若是我同事追着好幾個美劇,那麼我只須要把英文名字告訴爬蟲就能夠了,而後爬蟲會根據URL的規則,來訪問對應的網頁,從而爬取美劇信息。
這個地方,在網頁裏面,是一個class=seedlink
的 div
標籤裏面的東西。
爲何要知道這個?這裏面,最主要的東西我我的認爲是更新日
,狀態
還有更新日期
這幾個變量。咱們能夠根據更新日期來判斷個人爬蟲是否須要繼續尋找下面的下載連接。若是當前爬蟲運行的時候,發現上回運行時間要晚於更新日期,那麼此次爬取就能夠直接放棄,由於沒有更新。
因此這裏的變量咱們得要獲取。用來判斷爬蟲是否爬取當前頁面。
由於一部美劇,可能有好幾季,那麼若是他更新了,出了最新的集,咱們是否是得按照季來爬取?
並且,當你點擊這幾個標籤的時候,
你就會發現上面的URL其實悄悄的發生了變化。就是在原來的 .html
以前,多了一個/
加數字,這個數字就是當前的季數。因此,若是想要複雜一點,爬取指定季的美劇,那麼咱們就得想辦法得到當前是哪一季,對不對?
這個也很簡單啊,這個美劇打開的網頁,首先默認顯示的是當前季,只不過在URL裏面沒有加當前季的數字而已,想要獲取數字,只須要在一個h3
的標籤,class=curseason
裏面的文本信息就好。
可是這裏,咱們拿到的文本信息好比是下面的:
text = "第12季"複製代碼
咱們想要獲取數字,只須要用正則表達式取一下就能夠:
seacon_num = re.findall("\d{1,3}",text)[0]複製代碼
這裏咱們主要是去取數字,長度爲1位,2位或者3位的數字。通常來講,一部美劇的季數,最多也就不可能超過三位數了。
這個咱們能夠看到每一集美劇中間都有幾個按鈕,他們分別是不一樣的下載方式。
這裏咱們看到,主要有這麼幾點:
OK,有了這五點,咱們就就能夠寫爬蟲來爬取數據了。爬蟲寫起來沒什麼難度,關鍵是下載地址那塊,這裏要把對應的文件地址都整理好。每個圖標都對應的是一個下載連接,以下圖:
這裏,咱們的代碼就是整合成這樣:
tbody_list = soup.find_all(name="tbody", attrs={"id":"seedlist"})if len(tbody_list) != 0: tr_list = tbody_list[0].find_all(name="tr") for item in tr_list: td_list = item.find_all(name="td") item_time = td_list[-1].text.strip() item_time_cur = datetime.datetime.strptime(item_time, "%Y-%m-%d") diff_day = (item_time_cur - play_last_update_day).days if diff_day >= 0 or play_last_update_day is "": item_name = td_list[1].text.strip() name_list = item_name.split(" ") title_ch = name_list[0] s_and_e_list = re.findall("S\d{2}E\d{2}", item_name) video_clarity = re.findall("\d{3,4}p", item_name) video_season_episode = s_and_e_list[0] video_season = video_season_episode[1:3] video_episode = video_season_episode[4:6] item_download_td = td_list[2] item_download_url = item_download_td.find_all(name="a") item_download_ed2k = str() item_download_magnet = str() item_download_bt = str() item_download_baidu = str() for download_item in item_download_url: if "magnet:" in download_item['href']: item_download_magnet = download_item['href'] if "ed2k:" in download_item['href']: item_download_ed2k = download_item['href'] if ".torrent" in download_item['href']: item_download_bt = download_item['href'] if "pan.baidu" in download_item['href']: item_download_baidu = download_item['href'] item_size = td_list[-4].text.strip() item_subscribe = td_list[-3].text.strip()複製代碼
最後,只須要生成一個Scrapy Item
,而後 yield
出來就能夠了:
class TtmjVideoItem(scrapy.Item): video_title_ch = scrapy.Field() video_title_en = scrapy.Field() video_title_total = scrapy.Field() video_season = scrapy.Field() video_episode = scrapy.Field() video_season_episode = scrapy.Field() video_clarity = scrapy.Field() video_size = scrapy.Field() video_has_subscribe = scrapy.Field() video_publish_time = scrapy.Field() video_create_time = scrapy.Field() video_download_magnet = scrapy.Field() video_download_ed2k = scrapy.Field() video_download_baidu = scrapy.Field() video_download_bt = scrapy.Field()複製代碼
這裏穿插一下,在雲服務器部署 MongoDB 的操做,在皮爺本身的公衆號『皮爺擼碼』裏面就有專門的詳細的手把手的教學文章,讓你從小白到王者,征服部署MongoDB到雲服務器上的騷操做,具體參考如下文章:
這些都是每一個人必須掌握的騷操做。
以前的步驟,咱們經過 yield TtmjVideoItem
已經把這個 Item 交到了咱們的pipeline裏面。
在 Pipeline
裏面,咱們須要在 def process_item(self, item, spider):
函數裏面執行存入數據庫的操做,同時,在 def close_spider(self, spider):
函數裏面,執行發送操做,由於這個時候,咱們的爬蟲即將關閉,咱們此時的數據就是現成的,因此選擇在這個時候發送 Email 來會比較好。
發送 Email 這裏我就很少說了,由於在以前的文章裏面已經說過了,感興趣的能夠關注微信公衆號『皮爺擼碼』,查看往期精選,關於 Email 的文章,請查看這篇:
『基於雲服務的網站種子採集器,還能發送到郵箱,你不來考慮一下?』
這篇文章裏面有很詳細的配置說明。皮爺在這裏,把發送的郵件,封裝成了 html
格式的文本。這樣作就是方便在郵件裏面,直接點擊連接就能夠下載了。
Scrapy爬蟲都是能夠部署到雲服務器上的。 爲啥要這麼搞? 由於這樣很方便啊,你能夠利用linux的固定執行命令,天天定點執行你的Scrapy爬蟲就能夠了,並且,還很省心,再也不須要天天爲了看電影而打開 IDE 或者 終端,去輸入運行 Python 程序的命令。簡單的一步到位,今後解放雙手,何樂而不爲呢。
關於部署 Scrapy 爬蟲到雲服務器上的文章,皮爺以前也很詳細的寫過,詳情能夠參考如下文章,這篇文章也在皮爺的公衆號裏面,查看『皮爺擼碼』公衆號的文章歷史裏面就有:
『【壓歲錢來買服務器玩雲爬蟲】把Scrapy爬蟲一步一步經過Scrapyd部署到騰訊雲上(阿里雲同理)』
最後,給你們看一下皮爺的成果,在皮爺郵箱裏面:
打開以後,郵件長這個樣子:
若是想下載的話,就直接點擊連接就能夠了。這樣就不須要再天天抽時間去網站上看是否更新了,是否有熟肉資源啥的。天天爬蟲定點執行,就會將沒有更新的資源通通發送到你的郵箱裏。你天天只須要作,打開郵箱,點擊下載就能夠了。
『代碼改變生活,這話不假』
獲取文章代碼,只須要關注『皮爺擼碼』,回覆『代碼』,便可找到你想要的代碼。這麼硬核的公衆號,我本身從心裏喜歡。
這篇文章還有個『下』篇,下回在寫,主要就是怎樣將這個爬蟲部署到:https://peekpa.tech
上,而後服務更多的同窗。固然了,皮爺也有一個想法,就是結合小程序來作美劇的追劇。這個點子很不錯,憑藉『六十四卦』小程序的經驗,我以爲這個軟件不難。之後給你們搞出來。
『皮爺擼碼』是個很硬核的公衆號,我寫了不少爬蟲的文章,我會慢慢分享給你們,並且和你們說一點,若是寫爬蟲寫的好,是真的能賺到錢的,由於如今是信息時代,網絡信息紛繁複雜,天天咱們耳朵聽的,眼睛看到的信息就成千上萬,古代都說學富五車,其實遠遠沒有咱們如今面臨的信息量大。如何高效的處理信息,抓住重點,避免重複閱讀或者重複操做而浪費時間,這個是很須要技術的。並且,如今社會,對於我的而言什麼最值錢?固然是時間。你天天刷抖音,逛微博,看點知乎,覺得知道了些常識,就認爲本身學習了東西,其實不是的。寫爬蟲的目的其實有一部分就是能夠過濾信息,節省時間。因此,身爲一個程序員,我是從心裏真真切切的感受到,寫代碼是一件頗有意思的事兒。
後續皮爺還會有更多的東西給你們分享,點子有不少,並且都頗有意思,很具備實戰性。很少說了,若是以爲皮爺這裏乾貨不少,那就麻煩轉發,分享,點擊個好看唄。皮爺謝謝你們了。
關注『皮爺擼碼』,你,不吃虧。