Python如何利用Selenium或者PhantomJS爬取動態(tài)網(wǎng)頁內(nèi)容
問題描述
想用python做股票量化交易,第一步就是獲取股票的歷史數(shù)據(jù)。訪問http://data.eastmoney.com/sto...網(wǎng)頁,將網(wǎng)頁源碼打開后看不見表格中的數(shù)據(jù),據(jù)說是利用ajax技術(shù)加載的。在網(wǎng)上看見可以利用selenium和phantomJS來獲取這些動態(tài)網(wǎng)頁內(nèi)容,但是不知道如何獲取完整源碼。請高手指點(diǎn)迷津
問題解答
回答1:事實(shí)上,我剛才試了一下,頁面不是用xhr加載的,在頁面的源代碼中已經(jīng)有了,然后調(diào)用了一個類把數(shù)據(jù)加載為一個table。比如,首頁的數(shù)據(jù):
然后,提取就直接使用re提取就可以了,得到文本以后json解析就好了。先寫到這里。+++++++++++++++++++++++++++++++++++++++++
然后,就是這個網(wǎng)站不使用xhr加載數(shù)據(jù)而是使用的js來加載json數(shù)據(jù),動態(tài)解析來顯示。具體分析需要用到j(luò)s的知識,如果你了解也可以自己嘗試解析。
我嘗試了一下。
from urllib.parse import quoteimport timeimport requestsurl = 'http://datainterface.eastmoney.com/EM_DataCenter/JS.aspx?type=FD&sty=TSTC&st={sortType}&sr={sortRule}&p={page}&ps={pageSize}&js=var {jsname}=(x){param}'params = { 'sortType': 1, 'sortRule': 1, 'page': 2, 'pageSize': 50, 'jsname': 'Aafdafgq', # 這里使用的是隨機(jī)字符串,8位 'param': '&mkt=0&rt='}params['param'] += str(int(time.time()/30)) # 當(dāng)前時間url = url.format(**params)url = quote(url, safe=':=/?&()')req = requests.get(url)req.text
用這個組合 好處是簡單暴力,壞處是效率較低。相當(dāng)于打開一個你看不到的瀏覽器加載頁面,再把運(yùn)算好的結(jié)果讀取。新人學(xué)爬蟲的話 推薦 python網(wǎng)絡(luò)數(shù)據(jù)采集 這本動物書。你需要的說明在采集動態(tài)頁面那章。這書很薄 很實(shí)用。
回答3:我對js和json都不太了解,剛剛爬蟲入門。經(jīng)過你的提示,我再查看了一下源碼,發(fā)現(xiàn)在defjson里面有這些數(shù)據(jù),不明白是怎樣把json里的數(shù)據(jù)顯示到tbody里面的。我用pandas的read_html可以抓到這些數(shù)據(jù),但是最后兩列會丟失。看來我得先去看看js和json
相關(guān)文章:
1. javascript - 奇怪的Symbol的問題2. python - 為什么在main()函數(shù)里result 會變成那樣?3. javascript - Web微信聊天輸入框解決方案4. angular.js - angular ng-class里面的引號問題5. docker - 如何修改運(yùn)行中容器的配置6. html - vue項(xiàng)目中用到了elementUI問題7. 網(wǎng)頁爬蟲 - 用Python3的requests庫模擬登陸B(tài)ilibili總是提示驗(yàn)證碼錯誤怎么辦?8. javascript - react 中綁定事件和阻止事件冒泡9. javascript - es6將類數(shù)組轉(zhuǎn)化成數(shù)組的問題10. javascript - 有沒有什么好的圖片懶加載的插件,需要包含監(jiān)聽頁面滾動高度,然后再加載的功能
