Java也能做爬蟲。
現在提到爬蟲人第一個想到的就是python,其實使用Java編寫爬蟲也是很好的選擇,
下面給大家展示一個使用Java基礎語言編寫的爬取小說的案例:
實現功能:
爬取目標網站全本小說
代碼編寫環境
JDK:1.8.0_191
Eclipse:2019-03 (4.11.0)
素材:
網站:http://www.shicimingju.com
小說:三國演義
案例實現用到的技術:
正則表達式
Java網絡通信:URL
IO流
Map—HashMap
字符串操作
異常處理
代碼思路
根據小說存放位置創建file對象
根據網頁結構編寫正則,創建pattern對象
編寫循環,創建向所有小說章節頁面發起網絡請求的url對象
網絡流BufferReader
創建輸入流
循環讀取請求得到的內容,使用正則匹配其中的內容
將讀取到的內容寫入本地文件,知道循環結束
注意代碼中的異常處理
運行效果
第117章開始下載。。。。。。。。。。。。。。。。。
鄧士載偷度陰平 諸葛瞻戰死綿竹_《三國演義》_詩詞名句網
第117章結束下載。。。。。。。。。。。。。。。。。
第118章開始下載。。。。。。。。。。。。。。。。。
哭祖廟一王死孝 入西川二士爭功_《三國演義》_詩詞名句網
第118章結束下載。。。。。。。。。。。。。。。。。
第119章開始下載。。。。。。。。。。。。。。。。。
假投降巧計成虛話 再受禪依樣畫葫蘆_《三國演義》_詩詞名句網
第119章結束下載。。。。。。。。。。。。。。。。。
第120章開始下載。。。。。。。。。。。。。。。。。
薦杜預老將獻新謀 降孫皓三分歸一統_《三國演義》_詩詞名句網
第120章結束下載。。。。。。。。。。。。。。。。。
案例代碼:
package com.qianfeng.text;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.URL;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class GetText {
/**
* 1、根據小說存放位置創建file對象
2、根據網頁結構編寫正則,創建pattern對象
3、編寫循環,創建向所有小說章節頁面發起網絡請求的url對象
4、網絡流BufferReader
5、創建輸入流
6、循環讀取請求得到的內容,使用正則匹配其中的內容
7、將讀取到的內容寫入本地文件,知道循環結束
8、注意代碼中的異常處理
* @param args
*/
public static void main(String[] args) {
// 1、根據小說存放位置創建file對象
File file = new File("D:\\File\\three_guo.txt");
// 2、根據網頁結構編寫正則,創建pattern對象
String regex_content = "<p.*?>(.*?)</p>";
String regex_title = "<title>(.*?)</title>";
Pattern p_content = Pattern.compile(regex_content);
Pattern p_title = Pattern.compile(regex_title);
Matcher m_content;
Matcher m_title;
// 3、編寫循環,創建向所有小說章節頁面發起網絡請求的url對象
for (int i = 1; i <= 120; i++) {
System.out.println("第" + i + "章開始下載。。。");
try {
// 創建每一個頁面的url對象
URL url = new URL("http://www.shicimingju.com/book/sanguoyanyi/" + i + ".html");
// 創建網絡讀取流
BufferedReader reader = new BufferedReader(new InputStreamReader(url.openStream(),"utf8"));
// 4、讀取網絡內容網絡流BufferReader
String str = null;
// 5、創建輸入流
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file,true)));
while ((str = reader.readLine()) != null) {
m_title = p_title.matcher(str.toString());
m_content = p_content.matcher(str.toString());
// 獲取小說標題並寫入本地文件
Boolean isEx = m_title.find();
if (isEx) {
String title = m_title.group();
// 清洗得到的數據
title = title.replace("<title>", "").replace("</title>", "");
System.out.println(title);
writer.write("第" + i + "章:" + title + "\n");
}
while (m_content.find()) {
String content = m_content.group();
// 清洗得到的數據
content = content.replace("<p>", "").replace("</p>", "").replace(" ", "").replace("?", "");
// 把小說內容寫入文件
writer.write(content + "\n");
}
}
System.out.println("第" + i + "章下載完成.........");
writer.write("\n\n");
writer.close();
reader.close();
} catch (Exception e) {
System.out.println("下載失敗");
e.printStackTrace();
}
}
}
}