1. 程式人生 > >網頁爬蟲--歷史上的今天

網頁爬蟲--歷史上的今天

網頁爬蟲–歷史上的今天

上篇部落格中我們知道了,呼叫第三方的API獲得我們想要的資料,如果我們要的資料沒有現成的API怎麼辦?那就需要我們去網站上爬資料了。下面就教大家怎麼去網頁上爬我們需要的資料。

一.使用Java JDK中的工具自己實現HTTP和HTTPS請求

寫一個HttpUtils 工具類:

package org.sunming.util;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import
java.net.ConnectException; import java.net.HttpURLConnection; import java.net.URL; import org.sm.util.data.MyX509TrustManager; import javax.net.ssl.HttpsURLConnection; import javax.net.ssl.SSLContext; import javax.net.ssl.SSLSocketFactory; import javax.net.ssl.TrustManager; import org.slf4j.Logger; import
org.slf4j.LoggerFactory; import net.sf.json.JSONObject; /** * 2017-8-19 * * @author sunming */ public class HttpUtils { private static Logger log = LoggerFactory.getLogger(HttpUtils.class); /** * 發起https請求並獲取結果 * * @param requestUrl * 請求地址 * @param requestMethod * 請求方式(GET、POST) * @param
outputStr * 提交的資料 * @return JSONObject(通過JSONObject.get(key)的方式獲取json物件的屬性值) */
public static JSONObject httpsRequest(String requestUrl, String requestMethod, String outputStr) { JSONObject jsonObject = null; StringBuffer buffer = new StringBuffer(); try { // 建立SSLContext物件,並使用我們指定的信任管理器初始化 TrustManager[] tm = { new MyX509TrustManager() }; SSLContext sslContext = SSLContext.getInstance("SSL", "SunJSSE"); sslContext.init(null, tm, new java.security.SecureRandom()); // 從上述SSLContext物件中得到SSLSocketFactory物件 SSLSocketFactory ssf = sslContext.getSocketFactory(); URL url = new URL(requestUrl); HttpsURLConnection httpsUrlConn = (HttpsURLConnection) url.openConnection(); httpsUrlConn.setSSLSocketFactory(ssf); httpsUrlConn.setDoOutput(true); httpsUrlConn.setDoInput(true); httpsUrlConn.setUseCaches(false); // 設定請求方式(GET/POST) httpsUrlConn.setRequestMethod(requestMethod); if ("GET".equalsIgnoreCase(requestMethod)) { httpsUrlConn.connect(); } // 當有資料需要提交時 if (null != outputStr) { OutputStream outputStream = httpsUrlConn.getOutputStream(); // 注意編碼格式,防止中文亂碼 outputStream.write(outputStr.getBytes("UTF-8")); outputStream.close(); } // 將返回的輸入流轉換成字串 InputStream inputStream = httpsUrlConn.getInputStream(); InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "utf-8"); BufferedReader bufferedReader = new BufferedReader(inputStreamReader); String str = null; while ((str = bufferedReader.readLine()) != null) { buffer.append(str); } bufferedReader.close(); inputStreamReader.close(); // 釋放資源 inputStream.close(); inputStream = null; httpsUrlConn.disconnect(); jsonObject = JSONObject.fromObject(buffer.toString()); } catch (ConnectException ce) { log.error("Weixin server connection timed out."); } catch (Exception e) { log.error("https request error:{}", e); } return jsonObject; } public static String httpRequest(String requestUrl, String requestMethod, String outputStr) { StringBuffer buffer = null; try { // 建立連線 URL url = new URL(requestUrl); HttpURLConnection httpUrlConn = (HttpURLConnection) url.openConnection(); httpUrlConn.setDoInput(true); httpUrlConn.setDoInput(true); // 設定請求方式(GET/POST) httpUrlConn.setRequestMethod(requestMethod); if ("GET".equalsIgnoreCase(requestMethod)) { httpUrlConn.connect(); } // 當有資料需要提交時 if (null != outputStr) { OutputStream outputStream = httpUrlConn.getOutputStream(); // 注意編碼格式,防止中文亂碼 outputStream.write(outputStr.getBytes("UTF-8")); outputStream.close(); } // 獲取輸入流 InputStream inputStream = httpUrlConn.getInputStream(); InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "utf-8"); BufferedReader bufferedReader = new BufferedReader(inputStreamReader); // 讀取返回結果 buffer = new StringBuffer(); String str = null; while ((str = bufferedReader.readLine()) != null) { buffer.append(str); } // 釋放資源 bufferedReader.close(); inputStreamReader.close(); inputStream.close(); httpUrlConn.disconnect(); } catch (Exception e) { e.printStackTrace(); } return buffer.toString(); } }

工具類即支援GET請求,也支援POST請求,只需要掉用請求的時候傳入一個請求方式就可以。

其中HTTPS請求涉及到證書的問題,所以我們需要一個證書信任管理器,這個管理器類需要自己定義,只需要實現X509TrustManager介面。

package org.sunming.util;

import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;

import javax.net.ssl.X509TrustManager;

public class MyX509TrustManager implements X509TrustManager {

    @Override
    public void checkClientTrusted(X509Certificate[] arg0, String arg1) throws CertificateException {
    // TODO Auto-generated method stub

    }

    @Override
    public void checkServerTrusted(X509Certificate[] arg0, String arg1) throws CertificateException {
    // TODO Auto-generated method stub

    }

    @Override
    public X509Certificate[] getAcceptedIssuers() {
    // TODO Auto-generated method stub
    return null;
    }

}

二.選擇合適的網頁爬去資料

網頁上的資料很多但是我們需要的只是紅框裡面的資料怎麼得到呢?

先獲取網頁的原始碼

String url = "http://www.lssdjt.com/";
String html = HttpUtils.httpRequest(url, "GET", null);
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=7" />
<meta name="keywords"
    content="歷史上的今天官網,歷史上的今天,歷史上今天,歷史今天,口述歷史,歷史故事,歷史人物,今天是什麼日子,歷史上的今天發生了什麼" />
<meta name="description"
    content="歷史上的今天官網(唯一指定網址:http://www.LSSDJT.com),充分挖掘歷史老照片資源,以口述形式,適當運用音訊渲染方式,以時間為線索,梳理歷史上每一天所發生的大事件,給當下帶來借鑑與感悟。《歷史今天》讓照片講述故事,讓歷史照亮現實,讓今天看清方向。檢視歷史上每天發生的重大事情,增長知識,開拓眼界,提高人文素養。" />
<title>歷史上的今天官網</title>
<LINK href="favicon.ico" type="image/x-icon" rel="shortcut icon">
<link href="/i/2014/css/index.css" type="text/css" rel="stylesheet" />
<!--[if lte ie 8]><script>eval(function(ps, w) {  var ca=[],c=w._IE_UPG={},i,l,p;  for(i=0,l=ps.length;i<l;i++){    p=ps[i];    c['_'+p]=w[p];    ca.push(p+'=_IE_UPG._'+p)  }  return 'var '+ca.join(',');}('document self top parent alert setInterval clearInterval setTimeout clearTimeout'.split(' '), window));</script><![endif]-->
</head>
<body>
    <div class="mini_wrap mb5 clearfix">
        <div class="mini w730">
            <ul class="l">
                <li class="minilogo"><a href="http://www.lssdjt.com/?back"
                    target="_self">歷史今天官網</a></li>
                <li><a href="http://www.lssdjt.com/jieri/" target="_blank">節日大全</a></li>
                <li><a href="http://www.lssdjt.com/wnl/" target="_blank">萬年曆</a></li>
                <li>&nbsp;&nbsp;&nbsp;&nbsp;</li>
                <li>
                    <!-- Baidu Button BEGIN -->
                    <div id="bdshare" class="bdshare_t bds_tools get-codes-bdshare">
                        <span class="bds_more">分享到:</span><a class="bds_qzone"></a><a
                            class="bds_tsina"></a><a class="bds_tqq"></a><a
                            class="bds_renren"></a><a class="bds_t163"></a><a
                            class="shareCount"></a>
                    </div> <script type="text/javascript" id="bdshare_js"
                        data="type=tools&uid=6860001"></script> <script
                        type="text/javascript" id="bdshell_js"></script> <script
                        type="text/javascript">
                            document.getElementById("bdshell_js").src = "http://bdimg.share.baidu.com/static/js/shell_v2.js?cdnversion="
                                    + Math.ceil(new Date() / 3600000)
                        </script> <!-- Baidu Button END -->
                </li>
            </ul>
            <ul class="r">
                <a href="http://www.lssdjt.com/code/else.htm" target="_blank"><font
                    color="red">chorme外掛</font></a>
                <li class="setting"><a href="javascript:void(0);"
                    id="setting-trigger">換膚</a></li>
            </ul>
            <p id="skin-box" class="clearfix"></p>
        </div>
    </div>
    <div class="w730 clearfix">
        <ul class="mb5 clearfix">
            <li class="l w210" id="websiteLogo"><a href="/"><img
                    src="/i/2014/img/logo.gif" alt="把 歷史上的今天官網,唯一指定網址:LSSDJT.COM 設為首頁"
                    border="0" /></a></li>
            <li class="r" id="top_banner"><img
                src="/i/images/banner_top.png" /></li>
        </ul>
        <ul class="nav mb5 clearfix">
            <div class="info">2017年08月19日 丁酉年六月廿八</div>
        </ul>
    </div>
    <div class="w730 mb5 clearfix">
        <div class="box">
            <p class="img-focus"></p>
            <div id="slideshow">
                <p class="paging"></p>
                <p class="preview"></p>
                <div class="current">
                    <p>
                        <a href="/d/19910819.htm" target="_blank"><img
                            src="http://img.lssdjt.com/200905/17/12212853973.jpg"
                            alt="蘇聯“八·一九”事件" /></a>
                    </p>
                    <span><a href="/d/19910819.htm" target="_blank">1991年8月19日
                            蘇聯“八·一九”事件</a></span>
                </div>
                <div>
                    <p>
                        <a href="/d/19150819.htm" target="_blank"><img
                            src="http://img.lssdjt.com/200905/17/75214420292.jpg"
                            alt="“好萊塢第一夫人”英格麗·褒曼出生" /></a>
                    </p>
                    <span><a href="/d/19150819.htm" target="_blank">1915年8月19日
                            “好萊塢第一夫人”英格麗·褒曼出生</a></span>
                </div>
                <div>
                    <p>
                        <a href="/d/19460819.htm" target="_blank"><img
                            src="http://img.lssdjt.com/201010/2/6B14447546.jpg"
                            alt="美國第42任總統比爾·克林頓出生" /></a>
                    </p>
                    <span><a href="/d/19460819.htm" target="_blank">1946年8月19日
                            美國第42任總統比爾·克林頓出生</a></span>
                </div>
                <div>
                    <p>
                        <a href="/d/19780819.htm" target="_blank"><img
                            src="http://img.lssdjt.com/201108/19/FE113431639.jpg"
                            alt="紅衛兵組織在歷史舞臺消失" /></a>
                    </p>
                    <span><a href="/d/19780819.htm" target="_blank">1978年8月19日
                            紅衛兵組織在歷史舞臺消失</a></span>
                </div>
                <div>
                    <p>
                        <a href="/d/18830819.htm" target="_blank"><img
                            src="http://img.lssdjt.com/201608/22235625394.jpg"
                            alt="“時尚女王”香奈兒誕生" /></a>
                    </p>
                    <span><a href="/d/18830819.htm" target="_blank">1883年8月19日
                            “時尚女王”香奈兒誕生</a></span>
                </div>
                <div>
                    <p>
                        <a href="/d/1942819.htm" target="_blank"><img
                            src="http://img.lssdjt.com/200905/17/8D213858943.jpg"
                            alt="斯大林格勒大會戰開始" /></a>
                    </p>
                    <span><a href="/d/1942819.htm" target="_blank">1942年8月19日
                            斯大林格勒大會戰開始</a></span>
                </div>
            </div>
        </div>
        <div class="box mt5 p5 clearfix">
            <ul class="l">
                <img src="/i/dot/dd.gif">《歷史上的今天》官網,
                <font color=red>老牌新址</font>:http://www.LSSDJT.com “拼音首字母”請認準!。
                <a rel="nofollow" href="#" target="_self"
                    onclick="javascript:clect()">收藏到QQ書籤</a>
            </ul>
            <ul class="r">
                <a href="/a/about/course.htm" style="color: red;" target="_blank"><img
                    src="/i/dot/fx.gif">走近官網!</a>
            </ul>
        </div>
        <div class="box mt5 clearfix">
            <ul class="p5">
                <a href="/d/20170808.htm" title="8·8九寨溝地震" target="_blank"><img
                    src="/i/dot/dd.gif">2017年8月8日,8·8九寨溝地震。</a>&nbsp;&nbsp;&nbsp;
                <a href="/d/20170807.htm" title="郎鹹平遭圍堵" target="_blank"><img
                    src="/i/dot/dd.gif">2017年8月7日,郎鹹平遭圍堵。</a>&nbsp;&nbsp;&nbsp;
                <a href="/d/20170731.htm" title="布達佩斯游泳世錦賽落幕" target="_blank"><img
                    src="/i/dot/dd.gif">2017年7月31日,布達佩斯游泳世錦賽落幕。</a>&nbsp;&nbsp;&nbsp;
                <a href="/d/20170730.htm" title="建軍90年大閱兵" target="_blank"><img
                    src="/i/dot/dd.gif">2017年7月30日,建軍90年大閱兵。</a>&nbsp;&nbsp;&nbsp;
                <a href="/d/2017730.htm" title="委內瑞拉選舉引發暴亂" target="_blank"><img
                    src="/i/dot/dd.gif">2017年7月30日,委內瑞拉選舉引發暴亂。</a>&nbsp;&nbsp;&nbsp;
                <a href="/d/20170728.htm" title="“租房落戶”新規在無錫實施" target="_blank"><img
                    src="/i/dot/dd.gif">2017年7月28日,無錫釋出全國首個“租購同權”新政。</a>&nbsp;&nbsp;&nbsp;
                <a href="/d/20170726.htm" title="印度西孟加拉邦大吉嶺地區爆發大規模內亂"
                    target="_blank"><img src="/i/dot/dd.gif">2017年7月26日,印度西孟加拉邦大吉嶺地區爆發新的騷亂。</a>&nbsp;&nbsp;&nbsp;
                <a href="/d/20170724.htm" title="中國禁賈斯汀演出" target="_blank"><img
                    src="/i/dot/dd.gif">2017年7月24日,中國拒絕加拿大男歌手賈斯汀·比伯來華演出。</a>&nbsp;&nbsp;&nbsp;
                <a href="/d/2017724.htm" title="游泳世錦賽孫楊400自登頂" target="_blank"><img
                    src="/i/dot/dd.gif">2017年7月24日,游泳世錦賽孫楊400自登頂。</a>&nbsp;&nbsp;&nbsp;
                <a href="/d/20170720.htm" title="科學家首次發現雙粲重子" target="_blank"><img
                    src="/i/dot/dd.gif">2017年7月20日,科學家首次發現雙粲重子。</a>&nbsp;&nbsp;&nbsp;
                <a href="/d/2017720.htm" title="華人科學家發現“天使粒子”" target="_blank"><img
                    src="/i/dot/dd.gif">2017年7月20日,華人科學家發現“天使粒子”。</a>&nbsp;&nbsp;&nbsp;
                <a href="/d/20170718.htm" title="中國正式向全世界釋出洋垃圾“禁令” " target="_blank"><img
                    src="/i/dot/dd.gif">2017年7月18日,中國正式向全世界釋出洋垃圾“禁令” 。</a>&nbsp;&nbsp;&nbsp;
                <a href="/d/20170717.htm" title="世界首個3D列印軟體人工心臟誕生" target="_blank"><img
                    src="/i/dot/dd.gif">2017年7月17日,世界首個3D列印軟體人工心臟誕生:只能跳45分鐘。</a>&nbsp;&nbsp;&nbsp;
                <a href="/d/20170715.htm" title="北京到新疆高速公路貫通" target="_blank"><img
                    src="/i/dot/dd.gif">2017年7月15日,北京到新疆高速公路大通道全線貫通。</a>&nbsp;&nbsp;&nbsp;
                <a href="/d/20170707.htm" title="特朗普和普京首次正式會晤" target="_blank"><img
                    src="/i/dot/dd.gif">2017年7月7日,特朗普和普京首次正式會晤。</a>&nbsp;&nbsp;&nbsp;
                <span class="r"><a href="/a/year/2017.htm" target="_blank"><img
                        src="/i/dot/dd.gif">2017年曆史上發生了什麼?</a></span>
            </ul>
        </div>
    </div>
    <div class="w730 mt5 clearfix">
        <div class="l w515">
            <div class="box">
                <div class="hd">
                    <h4>
                        <b>今天是2017年08月19日 (農曆六月廿八)</b>
                    </h4>
                </div>
                <div class="main">
                    <ul class="list clearfix">
                        <li class="gong st3"><a
                            href="http://www.lssdjt.com/d/140819.htm" class="screenshot"
                            rel="http://img.lssdjt.com/201212/30/0D161915810.jpg"
                            title="羅馬帝國屋大維逝世" target="_blank"><em>14年08月19日</em> <i>羅馬帝國屋大維逝世</i></a></li>
                        <li class="gong st3"><a
                            href="http://www.lssdjt.com/d/16620819.htm" class="screenshot"
                            rel="http://img.lssdjt.com/201010/2/8814812296.jpg"
                            title="法國著名物理學家、近代概率論的奠基者帕斯卡逝世" target="_blank"><em>1662年08月19日</em>
                                <i>法國著名物理學家、近代概率論的奠基者帕斯卡逝世</i></a></li>
                        <li class="gong"><a
                            href="http://www.lssdjt.com/d/17270819.htm" class="screenshot"
                            rel="http://img.lssdjt.com/201010/2/0C135551655.jpg"
                            title="黑爾斯觀察到煤在密封容器內加熱會產生 “易燃氣體”" target="_blank"><em>1727年08月19日</em>
                                <i>黑爾斯觀察到煤在密封容器內加熱會產生 “易燃氣體”</i></a></li>
                        <li class="gong"><a
                            href="http://www.lssdjt.com/d/18610819.htm" class="screenshot"
                            rel="http://img.lssdjt.com/201108/19/4F114326405.jpg"
                            title="大成國起義軍主力受重挫" target="_blank"><em>1861年08月19日</em> <i>大成國起義軍主力受重挫</i></a></li>
                        <li class="gong"><a
                            href="http://www.lssdjt.com/d/18660819.htm" class="screenshot"
                            rel="http://img.lssdjt.com/201010/2/C613351485.jpg"
                            title="左宗棠在福建設立清政府規模最大的新式造船廠" target="_blank"><em>1866年08月19日</em>
                                <i>左宗棠在福建設立清政府規模最大的新式造船廠</i></a></li>
                        <li class="gong st4"><a
                            href="http://www.lssdjt.com/d/18810819.htm" class="screenshot"
                            rel="http://img.lssdjt.com/201108/19/EE114157368.jpg"
                            title="羅馬尼亞作曲家埃乃斯庫誕生" target="_blank"><em>1881年08月19日</em> <i>羅馬尼亞作曲家埃乃斯庫誕生</i></a></li>
                        <li class="gong st4"><a
                            href="http://www.lssdjt.com/d/18830819.htm" class="screenshot"
                            rel="http://img.lssdjt.com/201608/22235625394.jpg"
                            title="“時尚女王”香奈兒誕生" target="_blank"><em>1883年08月19日</em> <i>“時尚女王”香奈兒誕生</i></a></li>
                        <li class="gong st4"><a
                            href="http://www.lssdjt.com/d/19030819.htm" class="screenshot"
                            rel="http://img.lssdjt.com/201010/2/8914259919.jpg"
                            title="中國森林經理學的開拓者之一邵均出生" target="_blank"><em>1903年08月19日</em>
                                <i>中國森林經理學的開拓者之一邵均出生</i></a></li>
                        <li class="gong"><a
                            href="http://www.lssdjt.com/d/19040819.htm" class="screenshot"
                            rel="http://img.lssdjt.com/201108/19/8B114623826.jpg"
                            title="日軍向俄軍堅守的旅順港要塞發起第一次進攻" target="_blank"><em>1904年08月19日</em>
                                <i>日軍向俄軍堅守的旅順港要塞發起第一次進攻</i></a></li>
                        <li class="gong"&g