成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

基于Java的同花順股票數(shù)據(jù)爬蟲

EasonTyler / 2587人閱讀

摘要:?jiǎn)栴}來源今天與同學(xué)聊天,得知他有個(gè)任務(wù)是抓取同花順網(wǎng)站上的股票數(shù)據(jù),有點(diǎn)興趣,便做了相關(guān)實(shí)驗(yàn)。由于時(shí)間關(guān)系,以上代碼只是把數(shù)據(jù)所在的網(wǎng)頁抓取到本地,沒有進(jìn)行解析。

問題來源

今天與同學(xué)聊天,得知他有個(gè)任務(wù)是抓取同花順網(wǎng)站上的股票數(shù)據(jù),有點(diǎn)興趣,便做了相關(guān)實(shí)驗(yàn)。

介紹

網(wǎng)站地址:http://q.10jqka.com.cn/

網(wǎng)站界面:

爬取內(nèi)容:圖中全部股票專欄表格中的數(shù)據(jù)

觀察

瀏覽器:Firefox

觀察現(xiàn)象:網(wǎng)頁中每次只展示一頁的數(shù)據(jù),一頁20條數(shù)據(jù)。通常來說,為了減輕瀏覽器的存儲(chǔ)壓力,后臺(tái)服務(wù)器一般只給前臺(tái)發(fā)送一頁的數(shù)據(jù),數(shù)據(jù)的獲取需要前端發(fā)送請(qǐng)求

尋找請(qǐng)求:為了獲取某一頁數(shù)據(jù)對(duì)應(yīng)的請(qǐng)求,點(diǎn)擊F12鍵,調(diào)出瀏覽器工具控制臺(tái),并點(diǎn)擊到網(wǎng)絡(luò)專欄,同時(shí)清空界面中的所有請(qǐng)求,頁面如下:

點(diǎn)擊頁,發(fā)現(xiàn)請(qǐng)求,該請(qǐng)求方法為GET,返回類型為html,界面如下:

探索請(qǐng)求:發(fā)現(xiàn)該請(qǐng)求的返回類型為html,為了進(jìn)一步探索該請(qǐng)求,將該請(qǐng)求的地址復(fù)制到瀏覽器地址欄中,打開頁面,發(fā)現(xiàn)這與主網(wǎng)站上的數(shù)據(jù)一致,可認(rèn)為該請(qǐng)求可獲取到股票數(shù)據(jù)。

尋找關(guān)系:通常來說,某一頁與請(qǐng)求的地址會(huì)有特定的聯(lián)系。剛剛我們請(qǐng)求的地址為:http://q.10jqka.com.cn/index/...,發(fā)現(xiàn)其中的4正好為我們所點(diǎn)擊的頁數(shù),這個(gè)時(shí)候頁數(shù)和請(qǐng)求地址的規(guī)律尋找出來了

實(shí)驗(yàn)

語言:Java

工具:htmlunit,

    
            net.sourceforge.htmlunit
            htmlunit
            2.35.0
    

基本思想:瀏覽器模擬點(diǎn)擊

源碼如下:

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.net.URL;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.gargoylesoftware.htmlunit.BrowserVersion;
import com.gargoylesoftware.htmlunit.HttpMethod;
import com.gargoylesoftware.htmlunit.NicelyResynchronizingAjaxController;
import com.gargoylesoftware.htmlunit.Page;
import com.gargoylesoftware.htmlunit.WebClient;
import com.gargoylesoftware.htmlunit.WebRequest;
import com.gargoylesoftware.htmlunit.html.HtmlAnchor;
import com.gargoylesoftware.htmlunit.html.HtmlButton;
import com.gargoylesoftware.htmlunit.html.HtmlPage;
import com.gargoylesoftware.htmlunit.html.HtmlPasswordInput;
import com.gargoylesoftware.htmlunit.html.HtmlTextInput;

public class HtmlUtil {
    WebClient webClient;
    //初始化
    public HtmlUtil(){
        webClient = new WebClient(BrowserVersion.CHROME);//新建一個(gè)模擬谷歌Chrome瀏覽器的瀏覽器客戶端對(duì)象
        webClient.getOptions().setThrowExceptionOnScriptError(false);//當(dāng)JS執(zhí)行出錯(cuò)的時(shí)候是否拋出異常, 這里選擇不需要
        webClient.getOptions().setThrowExceptionOnFailingStatusCode(false);//當(dāng)HTTP的狀態(tài)非200時(shí)是否拋出異常, 這里選擇不需要
        webClient.getOptions().setActiveXNative(false);
        webClient.getOptions().setCssEnabled(false);//是否啟用CSS, 因?yàn)椴恍枰宫F(xiàn)頁面, 所以不需要啟用
        webClient.getOptions().setJavaScriptEnabled(true); //很重要,啟用JS。有些網(wǎng)站要開啟!
        webClient.setAjaxController(new NicelyResynchronizingAjaxController());//很重要,設(shè)置支持AJAX
        webClient.getOptions().setTimeout(30000);
    }
    //獲取某個(gè)url的web客戶端
    public String htmlUnitUrl(String url, WebClient webClient) {  
        try {  
            WebRequest request = new WebRequest(new URL(url), HttpMethod.GET);  
            Map additionalHeaders = new HashMap();  
            additionalHeaders  
                    .put("User-Agent",  
                            "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.104 Safari/537.36");  
            additionalHeaders.put("Accept-Language", "zh-CN,zh;q=0.8");  
            additionalHeaders.put("Accept", "*/*");  
                        request.setAdditionalHeaders(additionalHeaders);  
            // 獲取某網(wǎng)站頁面  
            Page page = webClient.getPage(request);  
            return page.getWebResponse().getContentAsString();  
        } catch (Exception e) {  
           
        }  
        return null;  
    }  
    //爬取某網(wǎng)頁
    public void work(String url) {
        try {
            HtmlPage page = webClient.getPage(url);//打開網(wǎng)頁
            int pageCount = 177;
            for(int i=1;i<=pageCount;i++) {
                //當(dāng)訪問速度過快時(shí),后臺(tái)瀏覽器會(huì)禁止,在這里可加入適當(dāng)延遲的代碼
                /**
                *延遲執(zhí)行的代碼
                */
                
                String content = htmlUnitUrl("http://q.10jqka.com.cn/index/index/board/all/field/zdf/order/desc/page/"+i+"/ajax/1/",webClient);
                if(content.contains("Nginx forbidden."))
                    return;
                else {
                     writeFile("F://測(cè)試//"+i+".html",content);
                    }
            }
           
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    public static void main(String[] args){
        HtmlUtil demo=new HtmlUtil();
        String url = "http://q.10jqka.com.cn/";
        demo.work(url);
    }
    /**
     * 保存抓取的html到本地
     * @param path
     * @param content
     */
    public static boolean writeFile(String path,String content) {
    
         File file = new File(path);
         boolean isSuccess = true;
         System.out.println(path);
         // if file doesnt exists, then create it
         if (!file.exists()) {
            try {
                isSuccess = file.createNewFile();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
                isSuccess = false;
            }
         }else {
             file.delete();
         }
        FileWriter fw;
        try {
            fw = new FileWriter(file.getAbsoluteFile());
            BufferedWriter bw = new BufferedWriter(fw);
            bw.write(content);
            bw.close();
            System.out.println("寫入成功.");
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            System.out.println("寫入失敗.");
            isSuccess = false;
        }
        return isSuccess;
    }
}
總結(jié)

因?yàn)樾拇媾d趣,便做了相關(guān)的實(shí)驗(yàn),為了方便,其中的部分代碼還借鑒了網(wǎng)上的源碼。由于時(shí)間關(guān)系,以上代碼只是把數(shù)據(jù)所在的網(wǎng)頁抓取到本地,沒有進(jìn)行解析。

大家晚安~

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/74954.html

相關(guān)文章

  • 量化交易之股票數(shù)據(jù)獲取——同花軟件

    摘要:將另存為格式時(shí),文件將工作表中的單元格所顯示的文本和數(shù)值以逗號(hào)分離進(jìn)行保存。方法此處使用模塊的函數(shù)讀取文件,函數(shù)以字典形式返回,字典的鍵則是這個(gè)單元格的標(biāo)題即列頭,每一個(gè)單元格內(nèi)容放在字典的值內(nèi)。 前言 數(shù)據(jù)是進(jìn)行量化交易的基礎(chǔ)和關(guān)鍵,目前國內(nèi)做量化產(chǎn)品的金融機(jī)構(gòu)大部分是從券商獲取高頻實(shí)時(shí)行情數(shù)據(jù)的,另外很多金融網(wǎng)站也提供了數(shù)據(jù)接口,可以調(diào)用接口方式獲取,也可以用爬蟲的方式獲取。文本講...

    Chaz 評(píng)論0 收藏0
  • 首次公開,整理12年積累博客收藏夾,零距離展示《收藏夾吃灰》系列博客

    摘要:時(shí)間永遠(yuǎn)都過得那么快,一晃從年注冊(cè),到現(xiàn)在已經(jīng)過去了年那些被我藏在收藏夾吃灰的文章,已經(jīng)太多了,是時(shí)候把他們整理一下了。那是因?yàn)槭詹貖A太亂,橡皮擦給設(shè)置私密了,不收拾不好看呀。 ...

    Harriet666 評(píng)論0 收藏0
  • AI Challenger開賽,千萬量級(jí)數(shù)據(jù)開放,AI高手將上演巔峰對(duì)決

    摘要:月日,各項(xiàng)競(jìng)賽的排名將決定最終的成績(jī)排名。選手通過訓(xùn)練模型,對(duì)虛擬股票走勢(shì)進(jìn)行預(yù)測(cè)。冠軍將獲得萬元人民幣的獎(jiǎng)勵(lì)。 showImg(https://segmentfault.com/img/bVUzA7?w=477&h=317); 2017年9月4日,AI challenger全球AI挑戰(zhàn)賽正式開賽,來自世界各地的AI高手,將展開為期三個(gè)多月的比拼,獲勝團(tuán)隊(duì)將分享總額超過200萬人民幣的...

    Ali_ 評(píng)論0 收藏0
  • 計(jì)算機(jī)秋招必備!杭州互聯(lián)網(wǎng)大廠企業(yè)整理清單!

    摘要:截至年月日零時(shí),杭州市常住人口為萬人。年,杭州市實(shí)現(xiàn)地區(qū)生產(chǎn)總值億元。阿里巴巴對(duì)杭州的影響巨大,一線的七個(gè)企業(yè)中,有四個(gè)企業(yè)都是阿里巴巴大集團(tuán)下的。 歡迎持續(xù)關(guān)注我...

    morgan 評(píng)論0 收藏1

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<