之前接觸scrapy本來是想也許scrapy能夠讓我的爬蟲更快,但是也許是我沒有掌握scrapy的要領,所以爬蟲運行起來並沒有我想象的那么快,看這篇文章就是之前使用scrapy的寫得爬蟲。然后昨天我又看到了pyspider,說實話本來只是想看看,但是沒想到一看就讓我喜歡上了pyspider。
先給大家看一下pyspider的后台截圖:
pyspider是國人寫的一款開源爬蟲框架,個人覺得這個框架用起來很方便,至於如何方便可以繼續看下去。
作者博客:http://blog.binux.me/
這篇文章是我照着作者的這篇文章所做,爬取得是豆瓣電影,我也照着爬豆瓣電影,但是原文章有些地方不再適用,這里我會有些改正,以適應網頁所發生的變化。
安裝pyspider
安裝pyspider:pip install pyspider
目測pyspider只支持32位系統,因為安裝pyspider前需要先安裝一個依賴庫:pycurl,而pycurl只支持32位系統,雖然我也在csdn找到別人重新編譯過的pycurl,能夠在64位安裝,然后pyspider也確實安裝上去了,但是並不完美!!這里說一下,不完美處就是無法進行調試!!調試很重要吧?
抱着對pyspider的喜愛,我就果斷的重裝系統了!
如果你是32位系統,就這樣安裝:
pip install pycurl pip install pyspider
- 1
- 2
如果你是64位系統,且不是強迫症,能夠接受不完美的事物,就這樣安裝:
下載重新編譯過的pycurl,然后安裝。
然后cmd輸入:pip install pyspider
第一個pyspider爬蟲
- 打開cmd,輸入pyspider,然后打開瀏覽器輸入:http://localhost:5000, 然后就可以進入pyspider的后台了。
第一次打開后台是一片空白的。(點開瀏覽器后cmd不要關了!)
- 點擊Create,隨便輸入一個名字(當然名字還是不要亂取)。
- 點擊確定之后就進入一個腳本編輯器了
創建項目的時候也自動創建了一個腳本,這里我們只需要改動腳本OK。我們要爬豆瓣的所有電影,選擇http://movie.douban.com/tag/為起始點,也就是從這里開始爬。
- 首先是改動
on_start
@every(minutes=24 * 60) def on_start(self): self.crawl('http://movie.douban.com/tag/', callback=self.index_page)
- 1
- 2
- 3
這里沒什么講的,改個網址而已,callback就是調用下一個函數開始這個起始網頁。
5. 改動index_page函數
我們先來看一下啟示網頁張怎樣?
有按類型分類,也有按國家/地區分類,還有按年代分類。我們可以選擇按國家/地區分類,也可以選擇按年代分類,最好不選擇按類型分類,因為同一部電影既可能是愛情片、又可能是動作片(感覺怪怪的)。我這里選擇按年代分類。
先看一下index_page
我是怎么改的。
@config(age=10 * 24 * 60 * 60) def index_page(self, response): for each in response.doc('#content>div>div.article> table:nth-child(9)>tbody>tr>td>a').items(): a=each.attr.href.replace('www','movie') self.crawl(a,callback=self.list_page)
- 1
- 2
- 3
- 4
- 5
可以看到我們是從response.doc之中選擇tag的,然后 #content>div>div.article> table:nth-child(9)>tbody>tr>td>a
熟悉css selector的朋友可能會很熟悉這種東西,然而我是第一次接觸,所以講不出個所以然來。其實css selector跟正則表達式、xpath一樣,也是一種內容選擇的方法,然后也很好理解這是什么意思。
這是分隔符,熟悉css selector的朋友可以不用看下面的部分
我們先看一下
http://movie.douban.com/tag/
我們要選擇的是2013、2012到1989這部分內容,那么我們右鍵選擇2013然后審查元素
然后在鏈接中右鍵選擇copy css path得到一個然后復制到文本中,我們選多幾個tag的css path,查看一下規律 可以看到選中的幾個tag的css path不同點就在我紅線標出的地方,那么我們把他們的不同之處去掉,只留下相同的部分,也就是最下面的一行,把他復制下來,放到
for each in response.doc('#content>div>div.article> table:nth-child(9)>tbody>tr>td>a').items()
- 1
括號里面,告訴爬蟲,我們要爬的部分在這個path下!
這就是一個得到css path的方法,就連我這個第一次接觸css selector的人都可以找到
下面回歸
接着是
a=each.attr.href.replace('www','movie') self.crawl(a,callback=self.list_page)
- 1
- 2
我們先把符合上面css path規則的部分進行了替換,把www替換為了movie。為什么這樣做呢?我們分別打開
http://www.douban.com/tag/2013/?focus=movie
和
http://movie.douban.com/tag/2013/?focus=movie
來看。
可以看到www的是沒有翻頁的!!!而movie的是有翻頁的!!!我們要遍歷所有電影,當然要有翻頁了!!!所以這就是替換的原因所在!
self.crawl(a,callback=self.list_page)
- 1
這段代碼就是把得到的類似http://movie.douban.com/tag/2013?focus=movie的網頁交給了下一個函數去解析了!
- 改動list_page函數
@config(age=10*24*60*60) def list_page(self,response): #獲得電影詳細內容鏈接並交給下一個函數處理 for each in response.doc('td > .pl2 > a').items(): self.crawl(each.attr.href,callback=self.detail_page) #翻頁,然后繼續由list_page函數處理 for each in response.doc('.next > a').items(): self.crawl(each.attr.href,callback=self.list_page)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
這里的css path我是有pyspider自帶的css selector helper得到的。說到這里就再講一下pyspider自帶的css selector helper怎么用(當然這不是萬能的,要不然上面我也不會用瀏覽器的審查元素進行獲取css path)
我們先點擊腳本編輯器的中間上方的run
選擇follows,看到這樣的
點擊箭頭繼續。
順便說一下,如果點擊箭頭follows就沒有鏈接了,那么說明你上一個函數的css path沒有選對!回去修改!!
到這里再選一個鏈接的箭頭繼續。回到web下。
我們改動list_page的任務有兩個,一個是選擇一個電影的詳細內容的鏈接交給下一個函數處理,還有一個就是翻頁繼續由list_page函數處理。
選擇enable css selector path然后點擊一個電影鏈接,就會發現所有的電影鏈接都被紅框框給框起來了!
我們把鼠標選擇到圖中一處,然后點擊網頁中間上方的箭頭,也就是圖中標出的地方,然后就把網頁詳細內容鏈接的css path添加進來了!
同理可以把翻頁的css path得到。
8.改動detail_page函數
@config(priority=2) def detail_page(self, response): return { "url": response.url, "title":response.doc('* > * > div#wrapper > div#content > h1 > span').text(), "rate":response.doc('.rating_num').text(), "導演":response.doc('#info > span:nth-child(1) > span.attrs > a').text() }
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
這個就簡單了,已經到了電影詳細內容網頁,就看你要什么內容,然后利用css selector helper進行選擇就可以了!我這里只返回了url、電影標題、評分和導演四項!
到這里,爬蟲基本上寫完了,點擊save,返回dashboard,把爬蟲的狀態改成Running或者debug,然后再點擊右方的run,爬蟲就啟動了!!
另外這里還有很多的demo哦!http://demo.pyspider.org/