標籤:
我第一次接觸爬蟲這東西是在今年的5月份,當時寫了一個部落格搜尋引擎。所用到的爬蟲也挺智能的,起碼比電影來了這個站用到的爬蟲水平高多了!
回到用Python寫爬蟲的話題。
Python一直是我主要使用的指令碼語言,沒有之中的一個。
Python的語言簡潔靈活,標準庫功能強大。尋常能夠用作計算機,文本編碼轉換,圖片處理,批量下載,批量處理文本等。總之我非常喜歡,也越用越上手,這麼好用的一個工具,一般人我不告訴他。。
。很多其它網路編程教程請上網維教程網
由於其強大的字串處理能力,以及urllib2,cookielib,re,threading這些模組的存在。用Python來寫爬蟲就簡直易於反掌了。簡單到什麼程度呢。
我當時跟某同學說。我寫電影來了用到的幾個爬蟲以及資料整理的一堆零零散散的指令碼程式碼數總共不超過1000行,寫電影來了這個網站也僅僅有150來行代碼。由於爬蟲的代碼在另外一台64位的黑蘋果上,所以就不列出來,僅僅列一下VPS上網站的代碼。tornadoweb架構寫的
[[email protected] 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一下爬蟲的編寫流程。
以下內容僅供交流學習使用,沒有別的意思。
以某灣的最新視頻下載資源為例,其網址是
http://某piratebay.se/browse/200
由於該網頁裡有大量廣告,僅僅貼一下本文部分內容:
對於一個python爬蟲,下載這個頁面的源碼,一行代碼足以。
這裡用到urllib2庫。
>>> import urllib2>>> html = urllib2.urlopen('http://某piratebay.se/browse/200').read()>>> print 'size is', len(html)size is 52977
當然,也能夠用os模組裡的system函數調用wget命令來下載網頁內容。對於掌握了wget或者curl工具的同學是非常方便的。
使用Firebug觀察網頁結構,能夠知道本文部分html是一個table。
每個資源就是一個tr標籤。
而對於每個資源。須要提取的資訊有:
1、視頻分類
2、資源名稱
3、資源連結
4、資源大小
5、上傳時間
就這麼多就夠了,假設有須要。還能夠添加。
首先提取一段tr標籤裡的代碼來觀察一下。
<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="細節 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="//static.某piratebay.se/img/icon-magnet.gif" alt="Magnet link" /></a> <a href="//torrents.某piratebay.se/7782194/The_Walking_Dead_Season_3_Episodes_1-3_HDTV-x264.7782194.TPB.torrent" title="下載種子"><img src="//static.某piratebay.se/img/dl.gif" class="dl" alt="下載" /></a><img src="//static.某piratebay.se/img/11x11p.png" /><img src="//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>
以下用正則表達式來提取html代碼中的內容。對正則表達式不瞭解的同學。能夠去 http://docs.python.org/2/library/re.html 瞭解一下。
為何要用正則表達式而不用其它一些解析HTML或者DOM樹的工具是有原因的。我之前試過用BeautifulSoup3來提取內容,後來發覺速度實在是慢死了啊。一秒鐘可以處理100個內容。已經是我電腦的極限了。
。。而換了正則表達式,編譯後處理內容,速度上直接把它秒殺了!
提取這麼多內容,我的正則表達式要怎樣寫呢?
依據我以往的經驗,“.*?”或者“.+?”這個東西是非常好使的。只是也要注意一些小問題,實際用到的時候就會知道
對於上面的tr標籤代碼。我首先須要讓我的運算式匹配到的符號是
<tr>
表示內容的開始,當然也能夠是別的,僅僅要不要錯過須要的內容就可以。
然後我要匹配的內容是以下這個,擷取視頻分類。
(<a href="/browse/205" title="此檔案夾中很多其它">電視</a>)
接著我要匹配資源連結了,
<a href="..." class="detLink" title="...">...</a>
再到其它資源資訊,
font class="detDesc">已上傳 <b>3 分鐘前</b>, 大小 2 GiB, 上傳者
最後匹配
</tr>
大功告成。
當然。最後的匹配能夠不須要在正則表達式裡表示出來,僅僅要開始位置定位正確了,後面擷取資訊的位置也就正確了。
對正則表達式比較瞭解的朋友。可能知道怎麼寫了。我Show一下我寫的運算式處理過程,
就這麼簡單。結果出來了,自我感覺挺歡喜的。
當然,這樣設計的爬蟲是有針對性的,定向爬取某一個網站的內容。也沒有不論什麼一個爬蟲不會對收集到的連結進行篩選。
通常能夠使用BFS(寬度優先搜尋演算法)來爬取一個網站的全部頁面連結。
完整的Python爬蟲代碼,爬取某灣最新的10頁視頻資源:
# coding: utf8import urllib2import reimport pymongodb = pymongo.Connection().testurl = '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頁最新的視頻資源for i in range(0, 10): u = url % (i) # 下載資料 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] ) # 儲存到資料庫 db.priate.save(values)print 'Done!'
以上代碼僅供思路展示。實際執行使用到mongodb資料庫,同一時候可能由於無法訪問某灣網站而無法得到正常結果。
所以說,電影來了網站用到的爬蟲不難寫,難的是獲得資料後怎樣整理擷取實用資訊。比如。怎樣匹配一個影片資訊跟一個資源。怎樣在影片資訊庫和視頻連結之間建立關聯,這些都須要不斷嘗試各種方法。最後選出比較靠譜的。
曾有某同學發郵件想花錢也要得到我的爬蟲的源碼。
要是我真的給了,我的爬蟲就幾百來行代碼。一張A4紙。他不會說,坑爹啊。!!
……
都說如今是資訊爆炸的時代,所以比的還是誰的資料採礦能力強
好吧。那麼問題來了學習挖掘機(資料)技術究竟哪家強?
出自:http://www.wangwenzl.cn
使用Python編寫簡單網路爬蟲抓取視頻下載資源