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

爬虫

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

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

网络爬虫

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

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

9c80af0d77ca?utm_source=oschina-app

运行流程图

我们听得多的爬虫可能是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");

}

9c80af0d77ca?utm_source=oschina-app

数据.png

总结

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/572793.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CodeVS 1068-乌龟棋

原题 题目描述 Description 小明过生日的时候&#xff0c;爸爸送给他一副乌龟棋当作礼物。 乌龟棋的棋盘是一行N个格子&#xff0c;每个格子上一个分数&#xff08;非负整数&#xff09;。棋盘第1格是唯一 的起点&#xff0c;第N格是终点&#xff0c;游戏要求玩家控制一个乌龟棋…

乔布斯传

资料参考 http://www.ruanyifeng.com/blog/2013/03/apple_inc_and_division_of_labor.html 苹果公司与分工原理 1.乔布斯 "乔布斯买了一间不错的房子&#xff0c;但家里只有一幅帕黎思&#xff08;Maxfield Parrish&#xff09;的画作、一部百灵牌咖啡机和几把双人牌的刀子…

ie11浏览器可以下载java吗_解析:WindowsXP系统能否安装IE11浏览器

现在&#xff0c;IE浏览器可以称得上是市场占有率最高的一款网页浏览器。因为windowsxp是一款比较久的操作系统&#xff0c;所以很多用户都会疑惑在xp上是否能够安装最新版的ie11浏览器。下面&#xff0c;小编就给大家详细解答下该问题。很遗憾的告诉大家&#xff0c;Windows X…

java ajax传输图片_Java使用Ajax实现跨域上传图片功能

说明 &#xff1a;图片服务器是用Nginx搭建的&#xff0c;用的是PHP语言这个功能 需要 用到两个js文件&#xff1a;jquery.js和jQuery.form.jsfunction submitImgSize1Upload() {var postData function( form , callback){var form document.getElementById("upload-for…

Java并发——线程中断学习

1. 使用interrupt()中断线程当一个线程运行时&#xff0c;另一个线程可以调用对应的Thread对象的interrupt()方法来中断它&#xff0c;该方法只是在目标线程中设置一个标志&#xff0c;表示它已经被中断&#xff0c;并立即返回。这里需要注意的是&#xff0c;如果只是单纯的调用…

分布式服务框架原理(一)设计和实现

分布式服务框架设计 分布式服务框架一般可以分为以下几个部分&#xff0c; &#xff08;1&#xff09;RPC基础层&#xff1a; 包括底层通信框架&#xff0c;如NIO框架、通信协议&#xff0c;序列化和反序列化协议&#xff0c;以及在这几部分上的封装&#xff0c;屏蔽底层通信细…

saltstack之混合匹配

需要-C参数: salt -C ## 使用grains属性来匹配 [roothadoop0 pillar]# salt -C Gos:Ubuntu test.ping uadoop1:True ## 使用Minion ID的正则表达式来匹配 [roothadoop0 pillar]# salt -C Euadoop\d test.ping uadoop2:True uadoop3:True uadoop1:True ## 使用gr…

java自定义 filter,HBase自定义Filter

必需要提前说明下&#xff1a;不建议使用自定义的Filter。所有的Filter都是在服务端生效&#xff1a;就是说需要将自定义的Filter封装为jar&#xff0c;上传到HBase的类路径下&#xff0c;并重启HBase使之生效。对于生产环境的HBase来说&#xff0c;重启通常是不能接受的。Filt…

Mybatis学习总结(二)——Mapper代理开发

一、概要 1、原始DAO开发中存在的问题:&#xff08;1&#xff09;DAO实现方法体中存在很多过程性代码。&#xff08;2&#xff09;调用SqlSession的方法(select/insert/update)需要指定Statement的id&#xff0c;存在硬编码&#xff0c;不利于代码维护。 2、Mapper动态代理方法…

mac wordpress php7,Mac 下基于 wordpress 搭建个人博客系统

一、前言这里说的是自己从 wordpress 源码开始搭建一个个人博客系统。当然&#xff0c;很多云端已经直接提供了在线安装的方式&#xff0c;这个就不在本文的讨论范围之内了。二、关于 wordpresswordpress是一款个人博客系统&#xff0c;并逐步演化成一款内容管理系统软件&#…

TypeError: db.addUser is not a function : @(shell):1:1 ——mongoDB创建新用户名密码的方法...

不多说&#xff0c;旧版本使用 db.addUser("root","root") 新版本使用这句会出现这个错误提示 TypeError: db.addUser is not a function : (shell):1:1 新版本用的是 db.createUser({user: "test",pwd: "test",roles: [ { role: &quo…

java开发技术有什么意义,零基础学Java开发技术有哪些优势和好处?

零基础学Java开发技术有哪些优势和好处&#xff1f;Java开发技术有下列优势&#xff1a;Java编程语言简单、面向对象集中于对象及其接口、分布式处理TCP/IP协议、鲁棒性、安全性、体系结构中立性、可移植性、解释执行、高性能、多线程以及动态性等。零基础学Java开发技术的优势…

C#-WebForm-★★★JQuery知识——基础知识、选择器、事件★★★

JQuery 与 JS 之间的转换 将JQuery转换为JS —— get(0)  例如&#xff1a;alert( $("#d1").get(0).offsetwidth ); 将JS 转换为JQuery —— $(" ")  例如&#xff1a;$("#d1").click(function(){}); 1、什么是JQuery&#xff1f;   它就是…

事件对象及其属性

$(function(){$(input).bind(click,function(e){alert(e); //获取对象//event对象的属性alert(e.type);alert(e.target);alert(e.currentTarget);//得到监听元素的DOM&#xff0c;target是点的那个的DOM});$(input).bind(mouseover,function(e){alert(e.relatedTarget);});$(in…

php上传同一张图片,两种php实现图片上传的方法_PHP

图片上传在项目中经常用到&#xff0c;几乎没有任何一个项目可以脱离图片或者是文件上传。本篇我在这向大家介绍两种常规的上传方式。(注&#xff1a;在这里我们仅仅是对功能的实现&#xff0c;不去做过多的前端的样式)一、利用form表单上传此种方式是最原始的上传方式&#xf…

java位运算求幂,程序员必学:快速幂算法

前阵子&#xff0c;有小伙伴在我B站的算法教程底下留言小伙伴们有任何疑问或者希望我解说任何内容&#xff0c;都可以在我的小我私家B站或民众号(xmg_mj)留言哦&#xff0c;我会尽我最大能力、只管抽时间去写文章\录视频来回应人人。关于快速幂实在快速幂相关的问题&#xff0c…

java过滤器

过滤器 1、Filter工作原理&#xff08;执行流程&#xff09; 当客户端发出Web资源的请求时&#xff0c;Web服务器根据应用程序配置文件设置的过滤规则进行检查&#xff0c;若客户请求满足过滤规则&#xff0c;则对客户请求&#xff0f;响应进行拦截&#xff0c;对请求头…

假设检验

假设检验分参数假设和非参数假设。 假设 先假设原假设H0&#xff0c;对应的反面叫做备择假设H1。SAS一般沿用的规则是NEYMAN和PEARSON提出的&#xff1a;在控制犯第一类错误的原则下&#xff0c;是犯第二类错误的概率尽量小&#xff08;即&#xff0c;原假设受到保护&#xff0…

jeesite在eclipse中部署

1&#xff1a;下载下来最新版本的jeesite&#xff0c;首先要在本地安装好maven运行环境 2&#xff1a;运行 bin/eclipse.bat 生成工程文件并下载jar依赖包 如果需要修改默认项目名&#xff0c;请打开pom.xml修改第7行artifactId&#xff0c;然后再执行eclipse.bat文件 3&…

php抖音关注列表,网页PHP抖音批量取消关注JS代码

在很多时候我们抖音关注的人太多&#xff0c;想要批量取消但是一个一个点击太麻烦了&#xff0c;如何解放双手批量取消关注呢&#xff1f;今天分享一段JS代码&#xff0c;可在线批量取消关注&#xff0c;需电脑才能操作。首先打开抖音创作服务平台登录&#xff1a;https://crea…