摘要:問題來源今天與同學(xué)聊天,得知他有個任務(wù)是抓取同花順網(wǎng)站上的股票數(shù)據(jù),有點興趣,便做了相關(guān)實驗。由于時間關(guān)系,以上代碼只是把數(shù)據(jù)所在的網(wǎng)頁抓取到本地,沒有進行解析。
問題來源
今天與同學(xué)聊天,得知他有個任務(wù)是抓取同花順網(wǎng)站上的股票數(shù)據(jù),有點興趣,便做了相關(guān)實驗。
介紹網(wǎng)站地址:http://q.10jqka.com.cn/
網(wǎng)站界面:
爬取內(nèi)容:圖中全部股票專欄表格中的數(shù)據(jù)
觀察瀏覽器:Firefox
觀察現(xiàn)象:網(wǎng)頁中每次只展示一頁的數(shù)據(jù),一頁20條數(shù)據(jù)。通常來說,為了減輕瀏覽器的存儲壓力,后臺服務(wù)器一般只給前臺發(fā)送一頁的數(shù)據(jù),數(shù)據(jù)的獲取需要前端發(fā)送請求
尋找請求:為了獲取某一頁數(shù)據(jù)對應(yīng)的請求,點擊F12鍵,調(diào)出瀏覽器工具控制臺,并點擊到網(wǎng)絡(luò)專欄,同時清空界面中的所有請求,頁面如下:
點擊頁,發(fā)現(xiàn)請求,該請求方法為GET,返回類型為html,界面如下:
探索請求:發(fā)現(xiàn)該請求的返回類型為html,為了進一步探索該請求,將該請求的地址復(fù)制到瀏覽器地址欄中,打開頁面,發(fā)現(xiàn)這與主網(wǎng)站上的數(shù)據(jù)一致,可認為該請求可獲取到股票數(shù)據(jù)。
尋找關(guān)系:通常來說,某一頁與請求的地址會有特定的聯(lián)系。剛剛我們請求的地址為:http://q.10jqka.com.cn/index/...,發(fā)現(xiàn)其中的4正好為我們所點擊的頁數(shù),這個時候頁數(shù)和請求地址的規(guī)律尋找出來了
實驗語言:Java
工具:htmlunit,
net.sourceforge.htmlunit htmlunit 2.35.0
基本思想:瀏覽器模擬點擊
源碼如下:
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);//新建一個模擬谷歌Chrome瀏覽器的瀏覽器客戶端對象 webClient.getOptions().setThrowExceptionOnScriptError(false);//當JS執(zhí)行出錯的時候是否拋出異常, 這里選擇不需要 webClient.getOptions().setThrowExceptionOnFailingStatusCode(false);//當HTTP的狀態(tài)非200時是否拋出異常, 這里選擇不需要 webClient.getOptions().setActiveXNative(false); webClient.getOptions().setCssEnabled(false);//是否啟用CSS, 因為不需要展現(xiàn)頁面, 所以不需要啟用 webClient.getOptions().setJavaScriptEnabled(true); //很重要,啟用JS。有些網(wǎng)站要開啟! webClient.setAjaxController(new NicelyResynchronizingAjaxController());//很重要,設(shè)置支持AJAX webClient.getOptions().setTimeout(30000); } //獲取某個url的web客戶端 public String htmlUnitUrl(String url, WebClient webClient) { try { WebRequest request = new WebRequest(new URL(url), HttpMethod.GET); Map總結(jié)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++) { //當訪問速度過快時,后臺瀏覽器會禁止,在這里可加入適當延遲的代碼 /** *延遲執(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://測試//"+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; } }
因為心存興趣,便做了相關(guān)的實驗,為了方便,其中的部分代碼還借鑒了網(wǎng)上的源碼。由于時間關(guān)系,以上代碼只是把數(shù)據(jù)所在的網(wǎng)頁抓取到本地,沒有進行解析。
大家晚安~
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/74954.html
摘要:將另存為格式時,文件將工作表中的單元格所顯示的文本和數(shù)值以逗號分離進行保存。方法此處使用模塊的函數(shù)讀取文件,函數(shù)以字典形式返回,字典的鍵則是這個單元格的標題即列頭,每一個單元格內(nèi)容放在字典的值內(nèi)。 前言 數(shù)據(jù)是進行量化交易的基礎(chǔ)和關(guān)鍵,目前國內(nèi)做量化產(chǎn)品的金融機構(gòu)大部分是從券商獲取高頻實時行情數(shù)據(jù)的,另外很多金融網(wǎng)站也提供了數(shù)據(jù)接口,可以調(diào)用接口方式獲取,也可以用爬蟲的方式獲取。文本講...
摘要:時間永遠都過得那么快,一晃從年注冊,到現(xiàn)在已經(jīng)過去了年那些被我藏在收藏夾吃灰的文章,已經(jīng)太多了,是時候把他們整理一下了。那是因為收藏夾太亂,橡皮擦給設(shè)置私密了,不收拾不好看呀。 ...
摘要:月日,各項競賽的排名將決定最終的成績排名。選手通過訓(xùn)練模型,對虛擬股票走勢進行預(yù)測。冠軍將獲得萬元人民幣的獎勵。 showImg(https://segmentfault.com/img/bVUzA7?w=477&h=317); 2017年9月4日,AI challenger全球AI挑戰(zhàn)賽正式開賽,來自世界各地的AI高手,將展開為期三個多月的比拼,獲勝團隊將分享總額超過200萬人民幣的...
摘要:截至年月日零時,杭州市常住人口為萬人。年,杭州市實現(xiàn)地區(qū)生產(chǎn)總值億元。阿里巴巴對杭州的影響巨大,一線的七個企業(yè)中,有四個企業(yè)都是阿里巴巴大集團下的。 歡迎持續(xù)關(guān)注我...
閱讀 2796·2023-04-25 14:41
閱讀 2404·2021-11-23 09:51
閱讀 3690·2021-11-17 17:08
閱讀 1682·2021-10-18 13:31
閱讀 5569·2021-09-22 15:27
閱讀 923·2019-08-30 15:54
閱讀 2235·2019-08-30 13:16
閱讀 743·2019-08-29 17:04