package com.tjt;
import java.io.IOException;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import com.tjt.utils.FileUtilIO;
//爬虫类
public class TestSpider {
//需求1:通过一个定的技术,从http://news.sohu.com/爬取这个网站上的文章
//需求2:获取文章的标题,获取文章的内容,最终保存到本地(以文章标题作为文件的名称,文章内容作为文件内容,后缀名为txt的文件) 标题.txt
public static void main(String[] args) throws IOException {
//jsoup是一个java后台解析html代码的一个工具(也可以模拟浏览器发送网络请求)
//1.用jsoup的方式模拟浏览器发送一个请求
Document document = Jsoup.connect("http://news.sohu.com/").get();
//2.获取class属性为list16的div
Elements divs = document.select(".list16");
//3.得到每个div
for (Element div : divs) {
Elements as = div.select("a");
for (Element a : as) {
String title = a.attr("title");
title.replace("|", "").replace(" | ", "").replace("\\", "").replace(":", "").replace("*", "").replace("\"", "").replace("?", "").replace("<", "").replace(">", "");
//a标签的href属性值的连接,就是文章详情的链接地址,因此我们必须现获取文章href的值(是一个网址),这个网址
//就是进入文章详情的网址,想要获取文章内容,必须得访问文章详情的网址
String url = a.attr("href");
// //www.sohu.com/a/384139596_114941
if(!url.startsWith("http")) {
// http://www.sohu.com/a/384139596_114941
url="http:"+url;
}
System.out.println(url);
System.out.println(title);
//再次利用jsoup来模拟浏览器发送请求
Document document2 = Jsoup.connect(url).get();
// System.out.println(document2);
//获取标签为article的所有的元素
Elements articles = document2.select("article");
for (Element element : articles) {
//获取所有的文章内容
String content = element.text();
// System.out.println(content);
//把文章内容和标题,分别写入到本地文件(以文章标题作为文件标题,文章内容作为文件内容)
FileUtilIO.writeFile("e:/a/1711F/"+title+".txt", content, "utf-8");
}
}
}
}
}
package com.tjt.utils;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
public class FileUtilIO {
/**
* @Title: writeFile
* @Description: 按照指定的编码把内容写入指定的文件中
* @param path
* @param content
* @param charset
* @throws IOException
* @return: void
*/
public static void writeFile(String path, String content, String charset) throws IOException {
// 创建写入的文件
File file = new File(path);
// 判断父目录是否存在
if (!file.getParentFile().exists()) {
// 创建父目录
file.getParentFile().mkdirs();
}
// 创建输出流对象
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file), charset));
if(content!=null) {
bw.write(content);
}
bw.flush();
bw.close();
}
/**
* @Title: readFile
* @Description: 读取文件内容
* @param file
* @param charset
* @return
* @throws IOException
* @return: String
*/
public static String readFile(File file, String charset) throws IOException {
// 创建输出流对象
BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(file), charset));
// 定义缓冲对象
StringBuffer sb = new StringBuffer();
// 定义读取每行的结果
String content = null;
// 循环读取
while ((content = br.readLine()) != null) {
// 加入缓冲对象
sb.append(content);
}
// 关闭流
br.close();
// 返回结果
return sb.toString();
}
}