互聯網金融爬蟲怎麼寫-第二課 雪球網股票爬蟲(正則表達式入門)

系列教程:

互聯網金融爬蟲怎麼寫-第一課 p2p網貸爬蟲(XPath入門)

上一節課我們一起通過一個p2p網貸爬蟲,深入瞭解了一下XPath以及其在最終實際使用中的寫法。可以毫不誇張的說,對於寫簡單爬蟲來說,最最重要的,就是使用好XPath,以及這一課要講的正則表達式。

正則表達式,又稱正規表示法常規表示法(英語:Regular Expression,在代碼中常簡寫爲regex、regexp或RE)

正 則表達式幾乎出現在每一個編程語言中,有着極其廣泛的應用,比如做網頁的時候,判斷用戶輸入的是否是郵箱這樣的正則。正則表達式本身寫法基本在各個語言中 都是一致的,不過調用方法可能略有不同,在我們教的爬蟲中,正則表達式主要應用在界定列表url和內容url的格式上,就是什麼url是列表url,什麼 url是內容url,什麼url直接丟棄掉。這樣做主要是爲了提高整個爬蟲的爬取效率,防止爬蟲在無關的url花費太長的時間,當然如果希望全網爬的話, 也可以不做設定。

對 於手裏有點閒錢的人來說,可能最常見的投資品就是股票了,雖然中國股票市場那叫一個變幻詭譎,妖獸頻出。但依舊相對其他流通性差,投資門檻高的投資產品來 說,有着國家信用背書的股市依然是不二的投資選擇。股票的數據很多地方都有,我們今天就通過雪球的行情中心,爬一下當天各個上市公司的股票價格吧。


打開雪球行情中心:


哇,突然覺得這是我們教程最高大上的一次。首先,這個頁面就可以作爲一個不錯的入口Url,因爲有着挺多的連接,不過從效率來講,雖然爬蟲本身可以幫我們去做很多事情,但是最好還是直接找到列表url會更快一些。我們繼續往裏找,可以看到這樣一個界面:

https://xueqiu.com/hq#exchange=CN&plate=1_1_0&firstName=1&secondName=1_1&type=sha&page=1



原諒我實在不懂股市,姑且就認爲這個就是所有股票價格的列表,磚家勿噴~

好了,我們看下這個下一頁規律

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的結構,發自內心想說:


好了,我們先根據這個連接來提取一下正則表達式,首先我們選中其中一個url,然後原封不動的寫出來:

https://xueqiu.com/hq#exchange=CN&plate=1_1_0&firstName=1&secondName=1_1&type=sha&page=2  


首先我們需要先把正則裏面需要轉義的字符進行轉移,由於正則表達式中.代表 任意字符,?代表指定字符出現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的正則表達式寫出來了。

同樣的方法,我們寫出內容頁的正則表達式:

https?://xueqiu\\.com/S/SH\\d{6}  


這裏的{6}表示有6位,當位數確定或者範圍確定時,可以使用花括號的形式來表示。再次申明,由於本身股票知識匱乏,暫且認爲所有代碼都是6位的。


寫到這裏感覺已經離大功告成不遠了,然而,當我們測試就可以發現,所有頁面的url實際上都是由js生成的,通過ajax請求來的。前功盡棄啊,不過還好咱們還學到了東西。不要灰心,黎明就在最黑暗的時間之後。我們下一課就給大家講一講碰到這些個ajax請求該怎麼辦。

對爬蟲感興趣的童鞋可以加qq羣討論:342953471。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章