使用Python編寫(xiě)簡(jiǎn)單網(wǎng)絡(luò)爬蟲(chóng)抓取視頻下載資源
我第一次接觸爬蟲(chóng)這東西是在今年的5月份,當(dāng)時(shí)寫(xiě)了一個(gè)博客搜索引擎,所用到的爬蟲(chóng)也挺智能的,起碼比電影來(lái)了這個(gè)站用到的爬蟲(chóng)水平高多了!
回到用Python寫(xiě)爬蟲(chóng)的話題。
Python一直是我主要使用的腳本語(yǔ)言,沒(méi)有之一。Python的語(yǔ)言簡(jiǎn)潔靈活,標(biāo)準(zhǔn)庫(kù)功能強(qiáng)大,平??梢杂米饔?jì)算器,文本編碼轉(zhuǎn)換,圖片處理,批量下載,批量處理文本等??傊液芟矚g,也越用越上手,這么好用的一個(gè)工具,一般人我不告訴他。。。
因?yàn)槠鋸?qiáng)大的字符串處理能力,以及urllib2,cookielib,re,threading這些模塊的存在,用Python來(lái)寫(xiě)爬蟲(chóng)就簡(jiǎn)直易于反掌了。簡(jiǎn)單到什么程度呢。我當(dāng)時(shí)跟某同學(xué)說(shuō),我寫(xiě)電影來(lái)了用到的幾個(gè)爬蟲(chóng)以及數(shù)據(jù)整理的一堆零零散散的腳本代碼行數(shù)總共不超過(guò)1000行,寫(xiě)電影來(lái)了這個(gè)網(wǎng)站也只有150來(lái)行代碼。因?yàn)榕老x(chóng)的代碼在另外一臺(tái)64位的黑蘋(píng)果上,所以就不列出來(lái),只列一下VPS上網(wǎng)站的代碼,tornadoweb框架寫(xiě)的 
[xiaoxia@307232 movie_site]$ wc -l *.py template/*
156 msite.py
92 template/base.html
79 template/category.html
94 template/id.html
47 template/index.html
77 template/search.html
下面直接show一下爬蟲(chóng)的編寫(xiě)流程。以下內(nèi)容僅供交流學(xué)習(xí)使用,沒(méi)有別的意思。
以某灣的最新視頻下載資源為例,其網(wǎng)址是
http://某piratebay.se/browse/200
因?yàn)樵摼W(wǎng)頁(yè)里有大量廣告,只貼一下正文部分內(nèi)容:

對(duì)于一個(gè)python爬蟲(chóng),下載這個(gè)頁(yè)面的源代碼,一行代碼足以。這里用到urllib2庫(kù)。
>>> import urllib2
>>> html = urllib2.urlopen('http://某piratebay.se/browse/200').read()
>>> print 'size is', len(html)
size is 52977
當(dāng)然,也可以用os模塊里的system函數(shù)調(diào)用wget命令來(lái)下載網(wǎng)頁(yè)內(nèi)容,對(duì)于掌握了wget或者curl工具的同學(xué)是很方便的。
使用Firebug觀察網(wǎng)頁(yè)結(jié)構(gòu),可以知道正文部分html是一個(gè)table。每一個(gè)資源就是一個(gè)tr標(biāo)簽。

而對(duì)于每一個(gè)資源,需要提取的信息有:
1、視頻分類(lèi)
2、資源名稱(chēng)
3、資源鏈接
4、資源大小
5、上傳時(shí)間
就這么多就夠了,如果有需要,還可以增加。
首先提取一段tr標(biāo)簽里的代碼來(lái)觀察一下。
<tr>
<td class="vertTh">
<center>
<a href="/browse/200" title="此目錄中更多">視頻</a><br />
(<a href="/browse/205" title="此目錄中更多">電視</a>)
</center>
</td>
<td>
<div class="detName"> <a href="/torrent/7782194/The_Walking_Dead_Season_3_Episodes_1-3_HDTV-x264" class="detLink" title="細(xì)節(jié) The Walking Dead Season 3 Episodes 1-3 HDTV-x264">The Walking Dead Season 3 Episodes 1-3 HDTV-x264</a>
</div>
<a href="magnet:?xt=urn:btih:4f63d58e51c1a4a997c6f099b2b529bdbba72741&dn=The+Walking+Dead+Season+3+Episodes+1-3+HDTV-x264&tr=udp%3A%2F%2Ftracker.openbittorrent.com%3A80&tr=udp%3A%2F%2Ftracker.publicbt.com%3A80&tr=udp%3A%2F%2Ftracker.istole.it%3A6969&tr=udp%3A%2F%2Ftracker.ccc.de%3A80" title="Download this torrent using magnet"><img src="http://static.某piratebay.se/img/icon-magnet.gif" alt="Magnet link" /></a> <a href="http://torrents.某piratebay.se/7782194/The_Walking_Dead_Season_3_Episodes_1-3_HDTV-x264.7782194.TPB.torrent" title="下載種子"><img src="http://static.某piratebay.se/img/dl.gif" class="dl" alt="下載" /></a><img src="http://static.某piratebay.se/img/11x11p.png" /><img src="http://static.某piratebay.se/img/11x11p.png" />
<font class="detDesc">已上傳 <b>3 分鐘前</b>, 大小 2 GiB, 上傳者 <a class="detDesc" href="/user/paridha/" title="瀏覽 paridha">paridha</a></font>
</td>
<td align="right">0</td>
<td align="right">0</td>
</tr>
下面用正則表達(dá)式來(lái)提取html代碼中的內(nèi)容。對(duì)正則表達(dá)式不了解的同學(xué),可以去 http://docs.python.org/2/library/re.html 了解一下。
為何要用正則表達(dá)式而不用其他一些解析HTML或者DOM樹(shù)的工具是有原因的。我之前試過(guò)用BeautifulSoup3來(lái)提取內(nèi)容,后來(lái)發(fā)覺(jué)速度實(shí)在是慢死了啊,一秒鐘能夠處理100個(gè)內(nèi)容,已經(jīng)是我電腦的極限了。。。而換了正則表達(dá)式,編譯后處理內(nèi)容,速度上直接把它秒殺了!
提取這么多內(nèi)容,我的正則表達(dá)式要如何寫(xiě)呢?
根據(jù)我以往的經(jīng)驗(yàn),“.*?”或者“.+?”這個(gè)東西是很好使的。不過(guò)也要注意一些小問(wèn)題,實(shí)際用到的時(shí)候就會(huì)知道 
對(duì)于上面的tr標(biāo)簽代碼,我首先需要讓我的表達(dá)式匹配到的符號(hào)是
<tr>
表示內(nèi)容的開(kāi)始,當(dāng)然也可以是別的,只要不要錯(cuò)過(guò)需要的內(nèi)容即可。然后我要匹配的內(nèi)容是下面這個(gè),獲取視頻分類(lèi)。
(<a href="/browse/205" title="此目錄中更多">電視</a>)
接著我要匹配資源鏈接了,
<a href="..." class="detLink" title="...">...</a>
再到其他資源信息,
font class="detDesc">已上傳 <b>3 分鐘前</b>, 大小 2 GiB, 上傳者
最后匹配
</tr>
大功告成!
當(dāng)然,最后的匹配可以不需要在正則表達(dá)式里表示出來(lái),只要開(kāi)始位置定位正確了,后面獲取信息的位置也就正確了。
對(duì)正則表達(dá)式比較了解的朋友,可能知道怎么寫(xiě)了。我Show一下我寫(xiě)的表達(dá)式處理過(guò)程,

就這么簡(jiǎn)單,結(jié)果出來(lái)了,自我感覺(jué)挺歡喜的。
當(dāng)然,這樣設(shè)計(jì)的爬蟲(chóng)是有針對(duì)性的,定向爬取某一個(gè)站點(diǎn)的內(nèi)容。也沒(méi)有任何一個(gè)爬蟲(chóng)不會(huì)對(duì)收集到的鏈接進(jìn)行篩選。通??梢允褂肂FS(寬度優(yōu)先搜索算法)來(lái)爬取一個(gè)網(wǎng)站的所有頁(yè)面鏈接。
完整的Python爬蟲(chóng)代碼,爬取某灣最新的10頁(yè)視頻資源:
# coding: utf8
import urllib2
import re
import pymongo
db = pymongo.Connection().test
url = 'http://某piratebay.se/browse/200/%d/3'
find_re = re.compile(r'<tr>.+?\(.+?">(.+?)</a>.+?class="detLink".+?">(.+?)</a>.+?<a href="(magnet:.+?)" .+?已上傳 <b>(.+?)</b>, 大小 (.+?),', re.DOTALL)
# 定向爬去10頁(yè)最新的視頻資源
for i in range(0, 10):
u = url % (i)
# 下載數(shù)據(jù)
html = urllib2.urlopen(u).read()
# 找到資源信息
for x in find_re.findall(html):
values = dict(
category = x[0],
name = x[1],
magnet = x[2],
time = x[3],
size = x[4]
)
# 保存到數(shù)據(jù)庫(kù)
db.priate.save(values)
print 'Done!'
以上代碼僅供思路展示,實(shí)際運(yùn)行使用到mongodb數(shù)據(jù)庫(kù),同時(shí)可能因?yàn)闊o(wú)法訪問(wèn)某灣網(wǎng)站而無(wú)法得到正常結(jié)果。
所以說(shuō),電影來(lái)了網(wǎng)站用到的爬蟲(chóng)不難寫(xiě),難的是獲得數(shù)據(jù)后如何整理獲取有用信息。例如,如何匹配一個(gè)影片信息跟一個(gè)資源,如何在影片信息庫(kù)和視頻鏈接之間建立關(guān)聯(lián),這些都需要不斷嘗試各種方法,最后選出比較靠譜的。
曾有某同學(xué)發(fā)郵件想花錢(qián)也要得到我的爬蟲(chóng)的源代碼。
要是我真的給了,我的爬蟲(chóng)就幾百來(lái)行代碼,一張A4紙,他不會(huì)說(shuō),坑爹啊?。。 ?/p>
都說(shuō)現(xiàn)在是信息爆炸的時(shí)代,所以比的還是誰(shuí)的數(shù)據(jù)挖掘能力強(qiáng) 
好吧,那么問(wèn)題來(lái)了學(xué)習(xí)挖掘機(jī)(數(shù)據(jù))技術(shù)到底哪家強(qiáng)?


- 使用python實(shí)現(xiàn)抓取騰訊視頻所有電影的爬蟲(chóng)
- python爬蟲(chóng)(入門(mén)教程、視頻教程)
- 基于python實(shí)現(xiàn)的抓取騰訊視頻所有電影的爬蟲(chóng)
- 以視頻爬取實(shí)例講解Python爬蟲(chóng)神器Beautiful Soup用法
- Python爬蟲(chóng)實(shí)現(xiàn)驗(yàn)證碼登錄代碼實(shí)例
- python爬蟲(chóng)之自動(dòng)登錄與驗(yàn)證碼識(shí)別
- Python爬蟲(chóng)模擬登錄帶驗(yàn)證碼網(wǎng)站
- Python爬蟲(chóng)爬取ts碎片視頻+驗(yàn)證碼登錄功能
相關(guān)文章
python實(shí)現(xiàn)MySQL?數(shù)據(jù)庫(kù)表格創(chuàng)建?數(shù)據(jù)插入及獲取插入ID操作教程
這篇文章主要為大家介紹了python實(shí)現(xiàn)MySQL?數(shù)據(jù)庫(kù)表格創(chuàng)建?數(shù)據(jù)插入及獲取插入ID操作教程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-11-11
Python 獲取命令行參數(shù)內(nèi)容及參數(shù)個(gè)數(shù)的實(shí)例
今天小編就為大家分享一篇Python 獲取命令行參數(shù)內(nèi)容及參數(shù)個(gè)數(shù)的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-12-12
pytorch加載訓(xùn)練好的模型用來(lái)測(cè)試或者處理方式
這篇文章主要介紹了pytorch加載訓(xùn)練好的模型用來(lái)測(cè)試或者處理方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-09-09
django之用戶、用戶組及權(quán)限設(shè)置方式
這篇文章主要介紹了django之用戶、用戶組及權(quán)限設(shè)置方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-05-05
編寫(xiě)python代碼實(shí)現(xiàn)簡(jiǎn)單抽獎(jiǎng)器
這篇文章主要介紹了編寫(xiě)python代碼實(shí)現(xiàn)簡(jiǎn)單抽獎(jiǎng)器,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-10-10
Django?ORM數(shù)據(jù)庫(kù)操作Python化藝術(shù)探索
這篇文章主要介紹了Django?ORM數(shù)據(jù)庫(kù)操作Python化藝術(shù)探索,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-11-11

