當前位置:
首頁 > 最新 > Python爬蟲的債市小試(二)

Python爬蟲的債市小試(二)

上一篇文發出後,小黃收到了許多大佬的鼓勵,以及關於代碼和研究層面的交流,在此感謝大家的支持。其中有些反饋說,上一篇提到的urllib+BeautifulSoup的Python組合在爬取一些複雜的網站會遇到困難,本篇打算以中債登網站公告更新監控為例,淺談一下Python爬蟲對複雜網頁的處理。

在日常使用瀏覽器打開網頁時,想看的內容往往是不會直接展示在我們面前的,需要我們輸入賬戶密碼登錄、操作下拉菜單、點擊按鈕、等待載入等一些列過程後才會出現。而對這類網頁進行Python爬蟲,使用上一篇中的urllib+BeautifulSoup的方法是難以完成的。(關於urllib+BeautifulSoup的使用方法,在Python爬蟲的債市小試(一)中進行了說明。)

對於這類複雜網頁的爬取,比較容易上手(也比較浪費內存)的做法是用selenium + phantomjs + BeautifulSoup(phantomjs是個瀏覽器,大家也可換成熟悉的Chrome、Firefox等)。其思路簡單粗暴卻有效,就是用Python代碼通過selenium去控制一個瀏覽器,直接在瀏覽器上模擬和複製人工訪問網頁的操作,從而實現Python與網頁間的一些複雜交互,甚至能用來繞過大部分的反爬蟲和驗證碼機制。

還是繼續舉個例子吧。17年底的時候,市場上很多人在關注18年的國債新發行計劃的發布,這個更新的公告可在中債登主頁業務操作發行與付息兌付國債發行計劃中找到。在等待新公告的日子裡,我們除了可以手工F5盯著網頁刷新外,還可以使用Python爬蟲,自動且實時對這個頁面進行持續監控(同理可實時監控最新的各類公告、統計數據、以及央行微播的微博證監會發布的微博等),並在有新內容更新的時候,第一時間自動彈出一個提示:

啊,不好意思放錯了,是這個提示:

從而,就能實現對最新信息的第一時間獲取和響應。

沿用上次的思路,來觀察一下這次網頁的特點。首先,打開網頁並依次點擊「國債」、「發行計劃」的按鈕後,可以看到這是我們想要監控到的內容:

通過瀏覽器檢查網頁後,可知這個內容的具體位置,是在iframe這個tag下面的一個名為a的tag里title屬性的一串文字(關於tag的說明,請翻閱上一篇):

如果直接套用上一篇的方法,在Python里用urllib+BeautifulSoup的組合來操作這個網頁的話:

Python解析到iframe下面的內容卻是這樣的:

上下對比可知,通過urllib+BeautifulSoup的方法,我們設想是能讀取到iframe這個tag下面的大量內容,並找到其中一個名為a的tag中的最新公告信息。然而事實上是,Python在iframe里什麼都讀取不到,更遑論點擊操作網頁上的按鈕讀取不同的公告信息了。

回到網頁直觀感受一下,上述的操作是得到這樣的結果:

那種感覺就像,當我開始學會做蛋餅,才發現你,不吃早餐。

大家觀察可以發現,這次的網址和上一篇的不一樣:我們對這次的這個中債登發行公告頁面內的各類點擊操作(如點選「企業債」「付息兌付與行權公告」),將使網頁內容發生相對應的變化,但其地址欄里的實際網址http://www.chinabond.com.cn/Channel/21000,卻不會隨著我們在這個頁面內的點擊操作而變更。事實上,這是一個通過js父頁面向iframe中子頁面通信以實現內容載入的網頁,其呈現的內容並不受網頁地址所控制。

因此,這裡要用到selenium + phantomjs + BeautifulSoup的方法,通過selenium 操作phantomjs瀏覽器,直接模擬瀏覽這個網頁,並進行相關操作,以實現「平時所見所點即當下所爬」。在這個例子中,主要用到selenium的三個功能,一個是get("網址"),就是讀取網頁;一個是click(),就是點擊按鈕,用來對上圖中「讀得到但操作不了」的那些按鈕進行點擊;一個是switch_to.frame("frame名"),就是把爬取的目標移到上圖中「完全讀不到但正是我們要監控的內容」這塊東西上面。剩下的就是用BeautifulSoup把這個最新的公告索引出來,具體方法與上一篇完全一致。

可以看出,其實這也就是我們平時自己查看網頁的順序操作,問題是不是又再度簡單化了?所以我又已經幫大家寫好了(看不全的代碼可左右滑動屏幕查看,我的代碼效率較低,供參考):

上述程序跑起來的時候,有新公告時Python會彈窗提醒:

沒的話,Python還是會世世生生為你站崗:

這樣,每當有什麼新消息,我們就能跑得比西方記者還快了。

這種跨frame的操作會在很多網頁上出現,比如網易雲音樂的網頁版播放頁面就是這樣的,大家可以拿來練手。

我們下一篇見。


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 Python 的精彩文章:

拿去!助你贏得百萬大獎的Python代碼已上線

TAG:Python |