爬虫

通常搜索引擎处理的对象是互联网网页。首先面临的问题是:如何能够设计出高效的下载系统,以将如此海量的网页数据传送到本地,在本地形成互联网网页的镜像备份。网络爬虫即起此作用,它是搜索引擎系统中很关键也很基础的构件。

爬虫:实际上就是通过相应的技术,抓取页面上特定的信息。

网络爬虫

当"蜘蛛"程序出现时,现代意义上的搜索引擎才初露端倪。它实际上是一种电脑"机器人"(Computer Robot),电脑"机器人"是指某个能以人类无法达到的速度不间断地执行某项任务的软件程序。由于专门用于检索信息的"机器人"程序就象蜘蛛一样在网络间爬来爬去,反反复复,不知疲倦。所以,搜索引擎的"机器人"程序就被称为"蜘蛛"程序。

这种程序实际是利用html文档之间的链接关系,在Web上一个网页一个网页的爬取(crawl),将这些网页抓到系统来进行分析,并放入数据库中。第一个开发出"蜘蛛"程序的是Matthew Gray,他于1993年开发了World Wide Web Wanderer,它最初建立时是为了统计互联网上的服务器数量,到后来发展到能够捕获网址。现代搜索引擎的思路就来源于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

总结

刚开始没有做过之前觉得爬虫很神秘,自己真正做一遍之后发现其实也不过如此,其实很多东西都是一样,我们不要被眼前的困难所迷惑。当勇敢迈出这一步后,就会发现其实自己也可以这样。

java爬虫新浪微博_java爬虫(爬新浪新闻) 如何从零开始相关推荐

  1. java 爬虫(爬新浪新闻) 如何从零开始 - 简书

    本文由 简悦 SimpRead 转码, 原文地址 bbs.huaweicloud.com 这篇文章能够快速教你爬取新浪新闻.希望这篇文章对您有所帮助!如果您有想学习的知识或建议,可以给作者留言~ 如何 ...

  2. 爬虫实战操作(2)—— 新浪新闻内容细节

    本文实现获取新浪新闻内容的各种细节,标题.时间.来源.内文.编辑者.评论数. import requests from bs4 import BeautifulSoup res=requests.ge ...

  3. PHP获取东方头条接口的新闻,新浪新闻API接口

    头条 http://api.sina.cn/sinago/list.json?channel=news_toutiao 推荐 http://api.sina.cn/sinago/list.json?c ...

  4. 从入门到入土:Python爬虫学习|实例练手|爬取新浪新闻搜索指定内容|Xpath定位标签爬取|代码注释详解

    此博客仅用于记录个人学习进度,学识浅薄,若有错误观点欢迎评论区指出.欢迎各位前来交流.(部分材料来源网络,若有侵权,立即删除) 本人博客所有文章纯属学习之用,不涉及商业利益.不合适引用,自当删除! 若 ...

  5. python爬虫scrapy爬取新闻标题及链接_18Python爬虫---CrawlSpider自动爬取新浪新闻网页标题和链接...

    一.爬取新浪新闻思路 1.创建scrapy项目 2.分析新浪新闻网站静态页面代码 3.编写对应的xpath公式 4.写代码 二.项目代码 步骤1.创建scrapy项目 scrapy startproj ...

  6. 19Python爬虫--爬取新浪新闻标题并保存到数据库

    一.爬取新浪新闻思路 1.创建scrapy项目 2.分析新浪新闻网站静态页面代码 3.编写对应的xpath公式 4.写代码 二.项目代码 步骤1.创建scrapy项目 创建爬虫文件 scrapy st ...

  7. 网络爬虫-----python爬取新浪新闻

    思路:先爬取首页,然后通过正则筛选出所有文章url,然后通过循环分别爬取这些url到本地 #python新闻爬虫实战 import urllib.request import re url = 'ht ...

  8. python爬虫-使用BeautifulSoup爬取新浪新闻标题

    ** python爬虫-使用BeautifulSoup爬取新浪新闻标题 ** 最近在学习爬虫的技巧,首先学习的是较为简单的BeautifulSoup,应用于新浪新闻上. import requests ...

  9. Python网络爬虫爬取新浪新闻

    笔者最近由于需要研究互联网新闻,于是基于邱老师的网络爬虫实战,写了一个爬取新浪新闻的爬虫,爬取的信息有: 新闻标题 来源url 发布时间 正文 编辑者 与邱老师的爬虫相比有以下几点不同: 没有爬取新闻 ...

  10. Python爬虫爬取新浪新闻内容

    首先感谢丘祐玮老师在网易云课堂的Python网络爬虫实战课程,接下来也都是根据课程内容而写.一来算是自己的学习笔记,二来分享给大家参考之用. 课程视频大概是在16年11月录制的,现在是18年2月.其中 ...

最新文章

  1. 协程:Greenlet模块、Gevent模块
  2. Redis 常用监控信息命令总结
  3. 并发编程之多线程线程安全(上)
  4. ssr Android简书,react服务端渲染ssr
  5. java 观察者模式_设计模式:全面通晓23种设计模式(典藏查阅)-第三部分
  6. 【BZOJ1095】捉迷藏,动态点分治
  7. c语言实现万年历程序带节日,【C】万年历
  8. JDK 8 foreach的用法
  9. 【机器视觉】线阵相机模型说明以及使用HALCON标定助手对线阵相机进行标定
  10. 地址总线、数据总线、控制总线
  11. js调用原生android应用的方法
  12. Photoshop CS 5 注册方法
  13. Sematic UI框架的学习-button样式(2)
  14. 强大!HTML5 3D美女图片旋转实现教程
  15. nlp自然语言处理中句子相似度计算
  16. easyexcel 检查表头是否匹配_利用easyexcel生成excel文件-自定义表头与数据栏对应的处理方式...
  17. 基于微信小程序的学院通知与文件分享系统app设计与实现-计算机毕业设计源码+LW文档
  18. 抄板PCB,好麻烦!
  19. value在php中怎么使用方法,valueOf方法怎么使用
  20. 网安基础入门篇(二)

热门文章

  1. 电脑CPU的最佳工作温度是多少度
  2. 计算机视觉领域专家主页代码
  3. 性能测试performance test
  4. 红警代码开源了 来瞅瞅源码 文内送Win10可联机的红警2标准版游戏
  5. [记录]HAproxy负载均衡配置教程
  6. 主机浏览器访问不了OWASP的主页
  7. php 图形库 锯齿,PHP imageantialias - 是否使用抗锯齿(antialias)功能
  8. 数字电路实验(三)——加法器、运算器
  9. matlab画任意正多边形,MATLAB——patch绘制多边形
  10. 【游戏开发进阶】教你使用IL2CppDumper从Unity il2cpp的二进制文件中获取类型、方法、字段等(反编译)