如何使用 Python 抓取雪球網頁?

來源:互聯網
上載者:User
我想使用beautifulsoup或者其他的python包 抓取 雪球網頁上面的一些組合,因為雪球網的組合持倉變動的時候,雪球網不會給提示,比如說,我想抓取這個http://xueqiu.com/P/ZH010389 。基本的想法是用程式追蹤到他的持倉,然後有變化的時候,程式給我一個提示。

##簡而言之,要做的事情是:開啟這個介面,然後開啟這個介面的調倉記錄,然後記錄下他的當前倉位,對比以前的倉位。##

問題是:由於我對HTML不太瞭解,我開啟Chrome的開發人員工具的時候,不知道應該怎麼樣讓我的程式開啟他的調倉記錄。。。

這個問題可能比較小白。。。麻煩啦!!!

回複內容:

//好多人說現在關注就有提醒的……呃,題主提問的時候顯然沒那個功能。我寫這個只是自己在學習爬蟲過程中的練習。我不炒股也不上雪球……

//好多贊。容我安利一篇自己的回答如何入門 Python 爬蟲? - 段曉晨的回答

邊做邊調邊寫~
#start coding
首先要知道自己在爬什麼~樓主說找到HTML的代碼云云,思路其實是錯誤的。因為我們想要的內容不在原始的html裡面。但是肯定在瀏覽器和伺服器之間的通訊裡,我們只要找到這部分資料就好。
#我用的是Firefox的FireBug
選擇網路(Chrome中應該是Network),點擊調倉記錄,

可以看到瀏覽器和伺服器之間進行了一次通訊。我們截獲了一個網址。開啟看看。

看上去像是一堆亂,但是細心的話就會發現……


也就是說我們要的資料都在這裡了,所以只要先擷取這個頁面的內容然後在提取資料就好了~

import urllib.requesturl = 'http://xueqiu.com/cubes/rebalancing/history.json?cube_symbol=ZH010389&count=20&page=1'req = urllib.request.Request(url,headers=headers)html = urllib.request.urlopen(req).read().decode('utf-8')print(html)

現在關注一個組合,就會有持倉變動的提示了。不過我覺得這事情挺有意思的。比如可以把很多持倉的資料都抓下來,做一些綜合的分析,看看現在網站上被持有最多的股票是哪一支,某一天被調入最多的又是哪一支之類。

於是我決定來抓抓看,順便藉此說說我通常用程式做自動抓取的過程。

Step.1 分析頁面

要抓一個網頁,首先自然是要“研究”這個網頁。通常我會用兩種方式:

一個是 Chrome 的 Developer Tools。通過它裡面的 Network 功能可以看到頁面發出的所有網路請求,而大多數資料請求都會在 XHR 標籤下。點擊某一個請求,可以看到其具體資訊,以及伺服器的返回結果。很多網站在對於某些資料會有專門的請求介面,返回一組 json 或者 XML 格式的資料,供前台處理後顯示。


另一個就是直接查看網頁原始碼。通常瀏覽器的右鍵菜單裡都有這個功能。從頁面的 HTML 源碼裡直接尋找你要的資料,分析它格式,為抓取做準備。

對於雪球上的一個組合頁面 ,粗略地看了一下它發出的請求,並沒有如預想那樣直接找到某個資料介面。看原始碼,發現有這樣一段:

SNB.cubeInfo = {"id":10289,"name":"誓把老刀挑下位","symbol":"ZH010389" ...此處略過三千字... "created_date":"2014.11.25"}SNB.cubePieData = [{"name":"汽車","weight":100,"color":"#537299"}];

雪球網已經改了很多規則,以前的很多代碼估計都不能用了
我剛寫了一個雪球網的類比登入,fuck-login/012 xueqiu.com at master · xchaoinfo/fuck-login · GitHub
在此基礎上修改,可以達到題主的目的,而且可以做到更加簡單。
處理 cookies ,不需要每次都登入一次的方法,可以參考 fuck-login/001 zhihu at master · xchaoinfo/fuck-login · GitHub 的處理方法。需要兩個模組配合:

  • 爬蟲模組:單純負責抓取和儲存資料

  • 資料處理模組:處理爬蟲儲存的資料。如發現某個人某個持倉資料發生了變化,向你發出通知


該爬蟲的簡單的流程:

  1. 定時訪問目標頁面

  2. 抓取當前目標頁面的資料,存入資料庫

資料處理模組簡單的流程:

  1. 定時訪問資料庫

  2. 資料庫中的資料滿足某個條件時執行自己設定的動作

抓取雪球的資料?巧了,剛看到一篇文章專門講這個的,推薦給大家:互連網金融爬蟲怎麼寫已關注的組合會收到調倉通知。

#技術宅都好暴力,看不到調倉就直接抓......#我在 @段曉晨的基礎上做了一點點最佳化,目前是這樣的。

測試前請把帳號密碼填上

更新內容:
增加了自動擷取cookie
修改了一下顯示組合改變的代碼

import urllib.requestimport jsonimport http.cookiejar#設定cookieCookieJar = http.cookiejar.CookieJar()CookieProcessor = urllib.request.HTTPCookieProcessor(CookieJar)opener = urllib.request.build_opener(CookieProcessor)urllib.request.install_opener(opener)#登陸獲得cookieparams = urllib.parse.urlencode({'username':'*****','password':'*****'}).encode(encoding='UTF8')headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.2; WOW64; rv:38.0) Gecko/20100101 Firefox/38.0'}request = urllib.request.Request('http://xueqiu.com/user/login',headers=headers)httpf = opener.open(request, params)#獲得組合url = 'http://xueqiu.com/cubes/rebalancing/history.json?cube_symbol=ZH340739&count=20&page=1'req = urllib.request.Request(url,headers=headers)html = urllib.request.urlopen(req).read().decode('utf-8')data = json.loads(html)stockdata = data['list'][0]['rebalancing_histories']for i in range(len(stockdata)):print('股票名稱',end=':')print(stockdata[i]['stock_name'],end='   持倉變化')print(stockdata[i]['prev_weight'],end='-->')print(stockdata[i]['target_weight'])

首先需要三個庫:urllib2,cookielib,json
然後用firefox 開啟誓把老刀挑下位 並登陸,然後找到 cookie檔案,
最後調倉記錄的地址是:http://xueqiu.com/cubes/rebalancing/history.json?cube_symbol=ZH010389&count=20&page=1 用urllib2 和coolielib 偽造header,和cookie 訪問 就可以得到 json檔案格式的調倉記錄,然後用json 處理 就可以了 題主不知道關注後有推送提示麼 ......用shell

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.