java从网页抓取数据(爬虫开发出"蜘蛛”程序的是Gray网页吗?)
优采云 发布时间: 2021-10-22 10:11java从网页抓取数据(爬虫开发出"蜘蛛”程序的是Gray网页吗?)
爬虫
通常搜索引擎处理的对象是互联网页面。第一个问题是:如何设计一个高效的下载系统,将如此海量的网页数据传输到本地,并在本地形成互联网网页的镜像备份。网络爬虫扮演着这个角色,它们是搜索引擎系统中非常关键和基础的组件。
爬虫:其实就是通过相应的技术抓取页面上的具体信息。
网络爬虫
当“蜘蛛”程序出现时,现代意义上的搜索引擎才刚刚开始出现。它实际上是一种计算机“机器人”(Computer Robot),计算机“机器人”是指能够以人类无法达到的速度不间断地执行某项任务的某种软件程序。因为专门用来检索信息的“机器人”程序像蜘蛛一样在网络中四处爬行,反复不知疲倦。因此,搜索引擎的“机器人”程序被称为“蜘蛛”程序。
这种程序实际上是利用html文档之间的链接关系,抓取Web上的每个页面,抓取这些页面进入系统进行分析,并放入数据库中。第一个开发“蜘蛛”程序的是马修格雷。他在 1993 年开发了万维网漫游器。最初建立它是为了计算 Internet 上的服务器数量,后来发展为能够捕获 URL。现代搜索引擎的思想起源于Wanderer,后来很多人在此基础上改进了蜘蛛程序。
操作流程图
我们经常听到的爬虫可能是python爬虫,因为我之前没有接触过这种语言,所以感觉爬虫是一种神秘的技术。今天看了一篇博客,介绍了使用Jsoup包轻松开发爬虫。我注意到这是一个java包,所以我想自己做一个爬虫程序。这就是我今天的文章,也是从小白到大白的一个过程,因为之前没有写过类似的,所以还是有点成就感的。八卦直接上代码。
其实爬虫很简单,先新建一个java项目。
这是为了将捕获的信息保存在本地以提高效率
/**
*
* @Title: saveHtml
* @Description: 将抓取过来的数据保存到本地或者json文件
* @param 参数
* @return void 返回类型
* @author liangchu
* @date 2017-12-28 下午12:23:05
* @throws
*/
public static void saveHtml(String url) {
try {
// 这是将首页的信息存入到一个html文件中 为了后面分析html文件里面的信息做铺垫
File dest = new File("src/temp/reptile.html");
// 接收字节输入流
InputStream is;
// 字节输出流
FileOutputStream fos = new FileOutputStream(dest);
URL temp = new URL(url);
// 这个地方需要加入头部 避免大部分网站拒绝访问
// 这个地方是容易忽略的地方所以要注意
URLConnection uc = temp.openConnection();
// 因为现在很大一部分网站都加入了反爬虫机制 这里加入这个头信息
uc.addRequestProperty(
"User-Agent",
"Mozilla/5.0 "
+ "(iPad; U; CPU OS 4_3_3 like Mac OS X; en-us) "
+ "AppleWebKit/533.17.9"
+ " (KHTML, like Gecko) Version/5.0.2 Mobile/8J2 Safari/6533.18.5");
is = temp.openStream();
// 为字节输入流加入缓冲
BufferedInputStream bis = new BufferedInputStream(is);
// 为字节输出流加入缓冲
BufferedOutputStream bos = new BufferedOutputStream(fos);
int length;
byte[] bytes = new byte[1024 * 20];
while ((length = bis.read(bytes, 0, bytes.length)) != -1) {
fos.write(bytes, 0, length);
}
bos.close();
fos.close();
bis.close();
is.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
分析本地文件信息,提取有用信息。这部分很耗时
/*
* 解析本地的html文件获取对应的数据
*/
public static void getLocalHtml(String path) {
// 读取本地的html文件
File file = new File(path);
// 获取这个路径下的所有html文件
File[] files = file.listFiles();
List news = new ArrayList();
HttpServletResponse response = null;
HttpServletRequest request = null;
int tmp=1;
// 循环解析所有的html文件
try {
for (int i = 0; i < files.length; i++) {
// 首先先判断是不是文件
if (files[i].isFile()) {
// 获取文件名
String filename = files[i].getName();
// 开始解析文件
Document doc = Jsoup.parse(files[i], "UTF-8");
// 获取所有内容 获取新闻内容
Elements contents = doc.getElementsByClass("ConsTi");
for (Element element : contents) {
Elements e1 = element.getElementsByTag("a");
for (Element element2 : e1) {
// System.out.print(element2.attr("href"));
// 根据href获取新闻的详情信息
String newText = desGetUrl(element2.attr("href"));
// 获取新闻的标题
String newTitle = element2.text();
exportFile(newTitle, newText);
System.out.println("抓取成功。。。"+(tmp));
tmp++;
}
}
}
}
//excelExport(news, response, request);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
根据url的信息获取该url下的新闻详情信息
/**
*
* @Title: desGetUrl
* @Description: 根据url获取连接地址的详情信息
* @param @param url 参数
* @return void 返回类型
* @author liangchu
* @date 2017-12-28 下午1:57:45
* @throws
*/
public static String desGetUrl(String url) {
String newText="";
try {
Document doc = Jsoup
.connect(url)
.userAgent(
"Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0; MALC)")
.get();
// System.out.println(doc);
// 得到html下的所有东西
//Element content = doc.getElementById("article");
Elements contents = doc.getElementsByClass("article");
if(contents != null && contents.size() >0){
Element content = contents.get(0);
newText = content.text();
}
//System.out.println(content);
//return newText;
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return newText;
}
将新闻信息写入文件
/*
* 将新闻标题和内容写入文件
*/
public static void exportFile(String title,String content){
try {
File file = new File("F:/replite/xinwen.txt");
if (!file.getParentFile().exists()) {//判断路径是否存在,如果不存在,则创建上一级目录文件夹
file.getParentFile().mkdirs();
}
FileWriter fileWriter=new FileWriter(file, true);
fileWriter.write(title+"----------");
fileWriter.write(content+"\r\n");
fileWriter.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
主功能
public static void main(String[] args) {
String url = "http://news.sina.com.cn/hotnews/?q_kkhha";
// 解析本地html文件
getLocalHtml("src/temp");
}
数据.png
总结
在我做之前,我认为爬行很神秘。再做一遍后,发现其实是一样的。其实很多事情都是一样的。让我们不要被眼前的困难所迷惑。当你勇敢地迈出这一步时,你会发现其实你也可以做到。