我第一次接觸爬蟲這東西是在今年的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標籤裡的代碼來觀察一下。
視頻
(電視)
The Walking Dead Season 3 Episodes 1-3 HDTV-x264
已上傳 3 分鐘前, 大小 2 GiB, 上傳者 paridha
0
0
下面用Regex來提取html代碼中的內容。對Regex不瞭解的同學,可以去 http://docs.python.org/2/library/re.html 瞭解一下。
為何要用Regex而不用其他一些解析HTML或者DOM樹的工具是有原因的。我之前試過用BeautifulSoup3來提取內容,後來發覺速度實在是慢死了啊,一秒鐘能夠處理100個內容,已經是我電腦的極限了。。。而換了Regex,編譯後處理內容,速度上直接把它秒殺了!
提取這麼多內容,我的Regex要如何寫呢?
根據我以往的經驗,“.*?”或者“.+?”這個東西是很好使的。不過也要注意一些小問題,實際用到的時候就會知道
對於上面的tr標籤代碼,我首先需要讓我的運算式匹配到的符號是
表示內容的開始,當然也可以是別的,只要不要錯過需要的內容即可。然後我要匹配的內容是下面這個,擷取視頻分類。
(電視)
接著我要匹配資源連結了,
...
再到其他資源資訊,
font class="detDesc">已上傳 3 分鐘前, 大小 2 GiB, 上傳者
最後匹配
大功告成!
當然,最後的匹配可以不需要在Regex裡表示出來,只要開始位置定位正確了,後面擷取資訊的位置也就正確了。
對Regex比較瞭解的朋友,可能知道怎麼寫了。我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'.+?\(.+?">(.+?).+?class="detLink".+?">(.+?).+?(.+?), 大小 (.+?),', 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紙,他不會說,坑爹啊!!!……
都說現在是資訊爆炸的時代,所以比的還是誰的資料採礦能力強
好吧,那麼問題來了學習挖掘機(資料)技術到底哪家強?