|
事情的起因是,我做survey的時(shí)候搜到了這兩本書(shū):Computational Social Network Analysis和Computational Social Network,感覺(jué)都蠻不錯(cuò)的,想下載下來(lái)看看,但是點(diǎn)開(kāi)網(wǎng)頁(yè)發(fā)現(xiàn)這個(gè)只能分章節(jié)下載,暈,我可沒(méi)時(shí)間一章一章下載,想起了迅 雷的下載全部鏈接,試試看,果真可以把他們一網(wǎng)打盡,但是,sadly,迅雷下載的時(shí)候,文件名沒(méi)辦法跟章節(jié)名對(duì)應(yīng)起來(lái),暈,我可沒(méi)時(shí)間一章一章去改名 字,怎么辦呢?由于做過(guò)網(wǎng)站,我看著它那“整潔”的頁(yè)面就笑了,因?yàn)檫@種規(guī)整的頁(yè)面是有規(guī)律可循的,雖然下載PDF的每個(gè)鏈接都含有用HASH隨機(jī)生成的 數(shù)字碼,但是HTML+CSS的排版是規(guī)整的,就可以用正則等方法來(lái)把title和PDF都挖出來(lái)并且一一對(duì)應(yīng)上。想到下一步是要用到網(wǎng)頁(yè)分析、抓取、下 載的技術(shù)的,所以,今天就把這個(gè)技術(shù)給拿下吧。由于python似乎是我知道的這方面的“利器”,有比較好的原生和社區(qū)支持,簡(jiǎn)單明了以及良好的跨平臺(tái) 性,所以就用python來(lái)做這個(gè)工作了。 S1.目標(biāo)
S2.方法概述有多少種方法可以用的呢? 1.自己寫(xiě) urllib2+urlparse+re 最原始的辦法,其中urllib2是python的web庫(kù)、urlparse能處理url、re是正則庫(kù),這種方法寫(xiě)起來(lái)比較繁瑣,但也比較“實(shí)在”,具體可以參考[4]. urllib2+beautifulsoup 這里的得力干將是beautifulsoup[5],beautifulsoup可以非常有效的解析HTML頁(yè)面,就可以免去自己用re去寫(xiě)繁瑣的正則等。我比較喜歡這種方法,在下面具體講解部分會(huì)詳解。 Mechanize+BeautifulSoup Mechanize是對(duì)于urllib2的部分功能的替換,使得除了http以外其他任何連接也都能被打開(kāi),也更加動(dòng)態(tài)可配置,具體參考[6]. PycURL,據(jù)說(shuō)速度非???,具體方法可以參考[1][2]. 2.公開(kāi)庫(kù) Scrapy 這個(gè)暫且未嘗試,這種公開(kāi)的庫(kù)的有點(diǎn)應(yīng)該就是速度快、更強(qiáng)大,好像是可以并行的,所以以后有時(shí)間再?lài)L試下。 其他更多的開(kāi)源庫(kù)參考[3]. S3.具體講解假設(shè)你已經(jīng)把python安裝好了(我用的版本是python2.7),現(xiàn)在我們用urllib2+BeautifulSoup的方法來(lái)抓取 springerlink網(wǎng)站上的Computational Social Network Analysis和Computational Social Network,也就是上面提到的,這兩本書(shū)。 BeautifulSoup的安裝,我是在Windows下安裝的,官網(wǎng)上沒(méi)有window下安裝的教程,我是憑感覺(jué) 裝上的。它有一個(gè)setup.py,我就用"python.exe setup.py install"運(yùn)行了,但提示"error: package directory 'bs4' does not exist",原來(lái)是默認(rèn)python執(zhí)行路徑不在當(dāng)前目錄,而是在C盤(pán)下面的用戶(hù)目錄中,所以把bs4文件移動(dòng)過(guò)去就好了。跑完好,生成一個(gè)build 文件夾,我知道它肯定要放到Python文件下的LIB文件夾里面去,所以就把下面的bs4移到LIB中去,就可以了。以后要用,直接import即可。 如果是linux用戶(hù)裝起來(lái)應(yīng)該會(huì)更順利些。 用urllib2抓取網(wǎng)頁(yè)/下載文件,urllib中最關(guān)鍵的可能就是urlopen這個(gè)函數(shù)了,返回的就是這個(gè)webpage/文件對(duì)象,可以用read等方法將其讀出來(lái)。urlopen這個(gè)函數(shù)的參數(shù)可以是url也可以是Request,如下:
這里要注意的一點(diǎn)是headers={‘User-Agent’:'Magic Browser'},這個(gè)最好加上,否則的話(huà),由于內(nèi)部信息默認(rèn)顯示為機(jī)器代理,可能被服務(wù)器403 Forbidden拒絕訪問(wèn),在抓取springelink.com上數(shù)據(jù)的時(shí)候不加上一定會(huì)被403斃掉的。 用BeautifulSoup處理解析網(wǎng)頁(yè),import后,一切從soup = BeautifulSoup(webpage.read( ))開(kāi)始,你可以用python的終端自己玩玩這個(gè)產(chǎn)生的soup對(duì)象。我這里就說(shuō)下一種我比較喜歡的用法,詳細(xì)具體的API參考[9].我喜歡用嵌套的 方式來(lái)提取內(nèi)容,什么意思呢,其實(shí)我認(rèn)為大多數(shù)解析定位問(wèn)題,其實(shí)就是下面這樣一個(gè)問(wèn)題: 假設(shè)有一個(gè)頁(yè)面如下:
并且你已經(jīng)用soup = BeautifulSoup()初始過(guò)了,現(xiàn)在你要根據(jù) ->
->
這樣的結(jié)構(gòu)把下面所有的鏈接抽取出來(lái),怎么做呢?比較簡(jiǎn)單的做法,就是一層一層向下分析,具體如下:
除了鏈接以外,其他內(nèi)容也是通過(guò)類(lèi)似的方法解析得到。(PS,我發(fā)現(xiàn)我若干個(gè)小時(shí)前自己還沒(méi)解決這個(gè)問(wèn)題的時(shí)候在SO上發(fā)的一個(gè)問(wèn)題已經(jīng)有人回答了,真好,那時(shí)候其實(shí)是困在了對(duì)list對(duì)象直接用find_all出錯(cuò)) S4.Ending好吧,最后看看我們的戰(zhàn)利品:
聲明1,其實(shí)有一個(gè)2M多的文件下載失敗了,今天網(wǎng)絡(luò)確實(shí)有點(diǎn)慢,其實(shí)用chrome下載它也差點(diǎn)失敗了,因此,其實(shí)還是有可改進(jìn)的地方。當(dāng)然,可改進(jìn)地方多了,多線(xiàn)程啥的,暫不討論了。 聲明2,由于是用T學(xué)校的網(wǎng)來(lái)下的,并且沒(méi)有復(fù)制擴(kuò)散內(nèi)容,所以沒(méi)有侵權(quán)! 最后感嘆下,最近多以看論文為主,好久沒(méi)學(xué)“技術(shù)”了,今天用了一些時(shí)間搞搞這種敏捷學(xué)習(xí),重新體驗(yàn)?zāi)欠N多線(xiàn)程、開(kāi)N個(gè)窗口、各種任務(wù)并發(fā)的感覺(jué),真舒服,哈哈:-D Reference[2] http://pycurl./ [3] http://en./wiki/Web_crawler#Open-source_crawlers [4] http:///2009/02/14/python-web-crawler-in-less-than-50-lines/ [5] http://www./software/BeautifulSoup/ [6] http://wwwsearch./mechanize/ [7] http:/// [8] https://github.com/scrapy/dirbot [9] http://www./software/BeautifulSoup/bs4/doc/ 源代碼下載:code (from http:///article/?id=961) |
|
|