從上一篇文章的評論中看出似乎很多童鞋都比較關注爬蟲的源代碼。所有本文就使用Python編寫簡單網路爬蟲抓取影片下載資源做了很詳細的記錄,幾乎每一步都介紹給大家,希望對大家能有所幫助
#我第一次接觸爬蟲這東西是在今年的5月份,當時寫了一個博客搜尋引擎,所用到的爬蟲也挺智能的,起碼比電影來了這個站用到的爬蟲水平高多了!
回到用Python寫爬蟲的話題。
Python一直是我主要使用的腳本語言,沒有之一。 Python的語言簡潔靈活,標準函式庫功能強大,平常可以當計算器,文字編碼轉換,圖片處理,批次下載,批次處理文字等。總之我很喜歡,也越用越上手,這麼好用的一個工具,一般人我不告訴他。 。 。
因為其強大的字串處理能力,以及urllib2,cookielib,re,threading這些模組的存在,用Python來寫爬蟲就簡直易於反掌了。簡單到什麼程度呢。我當時跟某同學說,我寫電影來了用到的幾個爬蟲以及數據整理的一堆零零散散的腳本代碼行數總共不超過1000行,寫電影來了這個網站也只有150來行代碼。因為爬蟲的程式碼在另外一台64位元的黑蘋果上,所以就不列出來,只列一下VPS上網站的程式碼,tornadoweb框架寫的
[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一下爬蟲的編寫流程。 以下內容僅供交流學習使用,沒有其他的意思。
以某灣的最新影片下載資源為例,其網址是
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> <p 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> </p> <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" / alt="Python編寫簡單網頁爬蟲抓取視頻" ><img src="//static.某piratebay.se/img/11x11p.png" / alt="Python編寫簡單網頁爬蟲抓取視頻" > <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標籤程式碼,我首先需要讓我的表達式匹配到的符號是
表示內容的開始,當然也可以是別的,只要不要錯過需要的內容即可。然後我要配對的內容是下面這個,取得影片分類。
(電視)
接著我要匹配資源連結了,
再到其他資源訊息,
font class="detDesc">已上傳3 分鐘前, 大小2 GiB, 上傳者
#最後符合
#
大功告成!
當然,最後的符合可以不需要在正規表示式裡表示出來,只要開始位置定位正確了,後面取得資訊的位置也就正確了。
對正規表示式比較了解的朋友,可能知道怎麼寫了。我Show一下我寫的表達式處理過程,
就这么简单,结果出来了,自我感觉挺欢喜的。
当然,这样设计的爬虫是有针对性的,定向爬取某一个站点的内容。也没有任何一个爬虫不会对收集到的链接进行筛选。通常可以使用BFS(宽度优先搜索算法)来爬取一个网站的所有页面链接。
完整的Python爬虫代码,爬取某湾最新的10页视频资源:
# 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页最新的视频资源 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纸,他不会说,坑爹啊!!!……
都说现在是信息爆炸的时代,所以比的还是谁的数据挖掘能力强
好吧,那么问题来了学习挖掘机(数据)技术到底哪家强?
相关推荐:
以上是Python編寫簡單網頁爬蟲抓取視頻的詳細內容。更多資訊請關注PHP中文網其他相關文章!