網頁爬蟲--歷史上的今天
阿新 • • 發佈:2019-01-03
網頁爬蟲–歷史上的今天
上篇部落格中我們知道了,呼叫第三方的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> </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>
<a href="/d/20170807.htm" title="郎鹹平遭圍堵" target="_blank"><img
src="/i/dot/dd.gif">2017年8月7日,郎鹹平遭圍堵。</a>
<a href="/d/20170731.htm" title="布達佩斯游泳世錦賽落幕" target="_blank"><img
src="/i/dot/dd.gif">2017年7月31日,布達佩斯游泳世錦賽落幕。</a>
<a href="/d/20170730.htm" title="建軍90年大閱兵" target="_blank"><img
src="/i/dot/dd.gif">2017年7月30日,建軍90年大閱兵。</a>
<a href="/d/2017730.htm" title="委內瑞拉選舉引發暴亂" target="_blank"><img
src="/i/dot/dd.gif">2017年7月30日,委內瑞拉選舉引發暴亂。</a>
<a href="/d/20170728.htm" title="“租房落戶”新規在無錫實施" target="_blank"><img
src="/i/dot/dd.gif">2017年7月28日,無錫釋出全國首個“租購同權”新政。</a>
<a href="/d/20170726.htm" title="印度西孟加拉邦大吉嶺地區爆發大規模內亂"
target="_blank"><img src="/i/dot/dd.gif">2017年7月26日,印度西孟加拉邦大吉嶺地區爆發新的騷亂。</a>
<a href="/d/20170724.htm" title="中國禁賈斯汀演出" target="_blank"><img
src="/i/dot/dd.gif">2017年7月24日,中國拒絕加拿大男歌手賈斯汀·比伯來華演出。</a>
<a href="/d/2017724.htm" title="游泳世錦賽孫楊400自登頂" target="_blank"><img
src="/i/dot/dd.gif">2017年7月24日,游泳世錦賽孫楊400自登頂。</a>
<a href="/d/20170720.htm" title="科學家首次發現雙粲重子" target="_blank"><img
src="/i/dot/dd.gif">2017年7月20日,科學家首次發現雙粲重子。</a>
<a href="/d/2017720.htm" title="華人科學家發現“天使粒子”" target="_blank"><img
src="/i/dot/dd.gif">2017年7月20日,華人科學家發現“天使粒子”。</a>
<a href="/d/20170718.htm" title="中國正式向全世界釋出洋垃圾“禁令” " target="_blank"><img
src="/i/dot/dd.gif">2017年7月18日,中國正式向全世界釋出洋垃圾“禁令” 。</a>
<a href="/d/20170717.htm" title="世界首個3D列印軟體人工心臟誕生" target="_blank"><img
src="/i/dot/dd.gif">2017年7月17日,世界首個3D列印軟體人工心臟誕生:只能跳45分鐘。</a>
<a href="/d/20170715.htm" title="北京到新疆高速公路貫通" target="_blank"><img
src="/i/dot/dd.gif">2017年7月15日,北京到新疆高速公路大通道全線貫通。</a>
<a href="/d/20170707.htm" title="特朗普和普京首次正式會晤" target="_blank"><img
src="/i/dot/dd.gif">2017年7月7日,特朗普和普京首次正式會晤。</a>
<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