標籤:爬蟲 網頁抓取 互連網金額 資料爬取
系列教程:
互連網金融爬蟲怎麼寫-第一課 p2p網貸爬蟲(XPath入門)
上一節課我們一起通過一個p2p網貸爬蟲,深入瞭解了一下XPath以及其在最終實際使用中的寫法。可以毫不誇張的說,對於寫簡單爬蟲來說,最最重要的,就是使用好XPath,以及這一課要講的Regex。
Regex,又稱正規標記法、常規標記法(英語:Regular Expression,在代碼中常簡寫為regex、regexp或RE)
Regex幾乎出現在每一個程式設計語言中,有著極其廣泛的應用,比如做網頁的時候,判斷使用者輸入的是否是郵箱這樣的正則。Regex本身寫法基本在各個語言中都是一致的,不過調用方法可能略有不同,在我們教的爬蟲中,Regex主要應用在界定列表url和內容url的格式上,就是什麼url是列表url,什麼url是內容url,什麼url直接丟棄掉。這樣做主要是為了提高整個爬蟲的爬取效率,防止爬蟲在無關的url花費太長的時間,當然如果希望全網爬的話,也可以不做設定。
對於手裡有點閑錢的人來說,可能最常見的投資品就是股票了,雖然中國股票市場那叫一個變幻詭譎,妖獸頻出。但依舊相對其他流通性差,投資門檻高的投資產品來說,有著國家信用背書的股市依然是不二的投資選擇。股票的資料很多地方都有,我們今天就通過雪球的行情中心,爬一下當天各個上市公司的股票價格吧。
開啟雪球行情中心:
650) this.width=650;" src="http://img.blog.csdn.net/20160521104249820?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" height="300" width="500" />
哇,突然覺得這是我們教程最高大上的一次。首先,這個頁面就可以作為一個不錯的入口Url,因為有著挺多的串連,不過從效率來講,雖然爬蟲本身可以幫我們去做很多事情,但是最好還是直接找到列表url會更快一些。我們繼續往裡找,可以看到這樣一個介面:
https://xueqiu.com/hq#exchange=CN&plate=1_1_0&firstName=1&secondName=1_1&type=sha&page=1
650) this.width=650;" src="http://img.blog.csdn.net/20160521104754447?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" height="300" width="500" />
原諒我實在不懂股市,姑且就認為這個就是所有股票價格的列表,磚家勿噴~
好了,我們看下這個下一頁規律
https://xueqiu.com/hq#exchange=CN&plate=1_1_0&firstName=1&secondName=1_1&type=sha&page=2
https://xueqiu.com/hq#exchange=CN&plate=1_1_0&firstName=1&secondName=1_1&type=sha&page=3
看著這種url的結構,發自內心想說:
650) this.width=650;" src="http://img.blog.csdn.net/20160521105111573?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" />
好了,我們先根據這個串連來提取一下Regex,首先我們選中其中一個url,然後原封不動的寫出來:
https://xueqiu.com/hq#exchange=CN&plate=1_1_0&firstName=1&secondName=1_1&type=sha&page=2
首先我們需要先把正則裡面需要轉義的字元進行轉移,由於Regex中.代表任一字元,?代表指定字元出現0次或者1次,因此如果我們想匹配這兩個字元本身的時候一定要記得將他們轉義,當然正則中還有很多其他字元需要轉移,不過這兩個字元是url中最常見的,也是大家最容易弄錯的地方。
經過轉義之後的字串是這樣的:
https://xueqiu\\.com/hq#exchange=CN&plate=1_1_0&firstName=1&secondName=1_1&type=sha&page=2
可以看到,這個url裡面並沒有?只有一個點,因此我們將點進行轉移,而之所以要有兩個轉義符\\,是因為這一段文字需要寫進字串中,而字串本身是需要對\進行轉義的。轉義完成之後,就看一下不同url的共性,不同的url之間的共性是除了page後面的數字不一樣,其他都是一樣的,那沒我們只需要對page後面的數字改寫成正則的形式,正則中提供了一些比較好用的替換符號,如\w代表數字和字母 \d代表數字,這兩個是很常用的,另外也可以通過[0-5]這種形式來表示一個區間。這裡我們其實就是一個1到多位的數字,因此將數字改寫成\d+,同時注意轉義符在字串中要再次轉義,得到下面的字串:
https://xueqiu\\.com/hq#exchange=CN&plate=1_1_0&firstName=1&secondName=1_1&type=sha&page=\\d+
最後,一個經驗性的東西值得注意,一般來說https的網站都會支援http,甚至有的串連會寫成http,因此這裡為了程式的健壯性,最好將這段正則修改一下相容http的格式,修改的方式是我們允許s存在或者不存在,正則中提供了三個字元表示字元出現數量的區間,分別是?表示0或1次,+表示1或多次,*表示0或多次。這裡很明顯的,我們應該使用?:
https?://xueqiu\\.com/hq#exchange=CN&plate=1_1_0&firstName=1&secondName=1_1&type=sha&page=\\d+
注意這個問號是正則自己的問號,並不需要轉義。
這樣我們就把列表頁的url的Regex寫出來了。
同樣的方法,我們寫出內容頁的Regex:
https?://xueqiu\\.com/S/SH\\d{6}
這裡的{6}表示有6位,當位元確定或者範圍確定時,可以使用花括弧的形式來表示。再次申明,由於本身股票知識匱乏,暫且認為所有代碼都是6位的。
寫到這裡感覺已經離大功告成不遠了,然而,當我們測試就可以發現,所有頁面的url實際上都是由js產生的,通過ajax請求來的。前功盡棄啊,不過還好咱們還學到了東西。不要灰心,黎明就在最黑暗的時間之後。我們下一課就給大家講一講碰到這些個ajax請求該怎麼辦。
對爬蟲感興趣的童鞋可以加qq群討論:342953471。
互連網金融爬蟲怎麼寫-第二課 雪球網股票爬蟲(Regex入門)