我想使用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 的處理方法。需要兩個模組配合:
該爬蟲的簡單的流程:
定時訪問目標頁面
抓取當前目標頁面的資料,存入資料庫
資料處理模組簡單的流程:
定時訪問資料庫
資料庫中的資料滿足某個條件時執行自己設定的動作
抓取雪球的資料?巧了,剛看到一篇文章專門講這個的,推薦給大家:互連網金融爬蟲怎麼寫已關注的組合會收到調倉通知。
#技術宅都好暴力,看不到調倉就直接抓......#我在 @段曉晨的基礎上做了一點點最佳化,目前是這樣的。
測試前請把帳號密碼填上
更新內容:
增加了自動擷取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