如何在神箭手上快速開發爬蟲——第一課 簡單的文章爬蟲【糗事百科】

註:

1、本課完整的爬蟲代碼可以在神箭手示例代碼中查看:示例代碼

2、如何在神箭手上運行代碼,請查看文檔:開發採集爬蟲

3、更詳細的爬蟲開發教程,請查看文檔:神箭手開發文檔

各位爬蟲開發者,你們好。我是神箭手官方御用(聽上去很高端的樣子)爬蟲開發導師游牧,我來跟大家講講如何在神箭手上快速開發爬蟲。今天我們先從一個簡單的例子開始!

大家都知道,現在爬蟲工程師的工資都很高(不要問我怎麼從拉勾上知道的( ̄▽ ̄)」),我想各位學開發的小夥伴已經都開始摩拳擦掌進入這個大坑了哇,特別是現在人工智慧已經成為未來的發展方向,而爬蟲爬取的大量數據為人工智慧提供了最重要的數據來源,可謂是大數據和人工智慧開發中的重中之重啊啊啊啊啊

好了,廢話不多說,進入正題。

第一步:

我們先來看下今天要爬取的網站-糗事百科(qiushibaike.com/):

第二步:

看著頁面結構很簡單,我們首先來分析下爬蟲的三大件

1、入口頁,從哪個網頁開始爬;

2、列表頁,包含內容頁鏈接的網頁(文章類的一般表示文章列表頁);

3、內容頁,包含要爬取數據的網頁;

OK,我們這次要爬取的是糗事百科裡的這些段子,所以內容頁很容易發現,就是這樣的網頁:qiushibaike.com/article

然後列表頁,滑鼠滑到下面,可以看到所有列表頁的翻頁:

滑鼠點擊這些分類按鈕可以查看鏈接是類似這樣的:qiushibaike.com/8hr/pag。這些頁面中包含有內容頁鏈接,所以就是我們需要的列表頁。

入口頁很簡單 就是首頁啦:qiushibaike.com/

在神箭手上開發爬蟲使用的是上手最簡單的腳本語言:javascript。這裡我就不詳細介紹它的基礎語法了,會的人都知道用起來很簡單方便,不會的可以自動百度最多半天就會啦~

好,發現了爬取糗事百科的三大件,我們需要在爬蟲代碼中註明這些頁面的正則,方便爬蟲根據正則自動匹配網頁中的鏈接,然後分別處理和提取數據:

var configs = {n domains: ["qiushibaike.com"],// 網站域名,設置域名後只處理這些域名下的網頁n scanUrls: ["http://www.qiushibaike.com/"],// 入口頁鏈接,分別從這些鏈接開始爬取n contentUrlRegexes: [/http://www.qiushibaike.com/article/d+/],// 內容頁url的正則,符合這些正則的頁面會被當作內容頁處理n helperUrlRegexes: [/http://www.qiushibaike.com/(8hr/page/d+.*)?/],// 列表頁url的正則,符合這些正則的頁面會被當作列表頁處理n fields: [ // 從內容頁中抽取需要的數據 n {n ******************n }n ]n};n

第三步:

然後就是定義從內容頁網頁源碼中抽取需要的數據了,最常用的抽取方式是XPath(不了解的可以自動百度)。當然神箭手還支持JSONPath和正則方式抽取數據(同樣不了解的可以自動百度)。

我們此次用xpath來抽取這些數據:標題、內容、作者和發布時間。建議在開發的時候使用chrome的插件 xpath helper來驗證xpath是否書寫正確(插件下載地址:shenjianshou.cn/index.p

教大家一個簡單的快速生成xpath的方法,用chrome瀏覽器,右鍵點擊要抽取的數據,點擊「檢查」,在下方的開發者工具中,右鍵選擇要抽取的頁面元素,點擊「copy」->「copy xpath」,粘貼出來就能看到快速生成的xpath了。

但是這樣生成的xpath有的太過複雜或者兼容行不好,可以做下精簡和優化~

好,拿到這四個抽取項的xpath後,我們將爬蟲代碼完善:

var configs = {n domains: ["qiushibaike.com"],// 網站域名,設置域名後只處理這些域名下的網頁n scanUrls: ["http://www.qiushibaike.com/"],// 入口頁鏈接,分別從這些鏈接開始爬取n contentUrlRegexes: [/http://www.qiushibaike.com/article/d+/],// 內容頁url的正則,符合這些正則的頁面會被當作內容頁處理n helperUrlRegexes: [/http://www.qiushibaike.com/(8hr/page/d+.*)?/],// 列表頁url的正則,符合這些正則的頁面會被當作列表頁處理n fields: [ // 從內容頁中抽取需要的數據 n {n name: "article_title",n alias: "文章標題",n selector: "//*[@id=single-next-link]//div[contains(@class,content)]/text()[1]",// 默認使用xpath抽取n required: true // required為true表示該項數據不能為空n },n {n name: "article_content",n alias: "文章內容",n selector: "//*[@id=single-next-link]",n required: truen },n {n name: "article_author",n alias: "作者",n selector: "//div[contains(@class,author)]//h2"n },n {n name: "article_publish_time",n alias: "文章發布日期",n selector: "//div[contains(@class,author)]//h2"n }n ]n};nn// 啟動爬蟲nvar crawler = new Crawler(configs);ncrawler.start();n

第四步:

其實以上代碼就可以正常運行了,並且很快就會出數據了(是不是很簡單,我都說過了神箭手開發爬蟲只需要5分鐘!)。但是我們有時候需要對爬取的數據進行下處理,比如把時間轉化成時間戳之類的,或者要做個小改動啥的(偽原創之類的你們都懂的)。

神箭手提供了很多豐富的回調函數,可以全方面360度隨意修改爬取的數據(很爽吧)。

以上面的代碼為例,因為糗事百科是沒有標題的,但是如果我們要把數據發布到網站或者進行分析之類的是需要文章標題的,那就需要我們根據內容生成一個標題;同時也可以把抽取的時間轉化成時間戳:

/*n 回調函數afterExtractField:對抽取出來的數據進行處理n*/nconfigs.afterExtractField = function(fieldName, data, page){n if(fieldName=="article_title"){n if(data.length>10){n data=data.substring(0,10)+"..."; // 因為糗事百科的文章沒有標題,所以取文章的前10個字作為標題n }n }else if(fieldName=="article_publish_time"){n data = Date.parse(new Date())/1000+""; // 發布日期轉換成時間戳n // 使用神箭手進行數據發布時,默認處理的時間戳是10位。如非特殊,請轉換成10位時間戳n }n return data;n};n

好,到這裡為止,糗事百科的這個爬蟲就寫好啦,完整的代碼在這裡:shenjianshou.cn/index.p

我們把代碼拷貝到神箭手新建的爬蟲應用中,點擊「啟動爬蟲」,就可以看到數據源源不斷的出現啦:


推薦閱讀:

TAG:爬虫计算机网络 | 爬虫 | 大数据 |