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,一经查实,立即删除!

相关文章

Hibernate Query 的 list 和iterate方法缓存的区别

list: quert.list()方法会将从数据库查找到的数据库放到一级缓存和二级缓存,但是不能从一级和二级缓存读取数据,但是可以从二级缓存的查询缓存读取数据, iterate: quert.iterate()方法总会先查找数据表的主键,然后根据每一个主键发送对应的sql语句从数据库读取数据,它可以把数据…

java的type转化class_第七章 (类型转换)Type Convertion

第七章 Type Convertion为什么会有类型转换&#xff1f;HTTP协议中传递的任何内容都是String类型的&#xff0c;所以一旦我们在服务器上需要一个非String类型的对象&#xff0c;例如&#xff1a;int或者Date&#xff0c;那么我们就需要在收到HTTP请求的数据的时候&#xff0c;首…

CodeVS 1068-乌龟棋

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

java游戏暂停弹出字体_小白写了个java的小游戏 想加个暂停的功能 无从下手 求大佬们帮...

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼第一次写java的小游戏想实现点击右下角的暂停 实现游戏的暂停和继续 不知道该怎么加&#xff0c;自己找了线程的内容但试了还是成功不了&#xff0c;求大佬们帮一下小白。代码有点乱&#xff0c;大佬们见谅。&#xff0c;&#xff…

乔布斯传

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

JAVA5000行代码什么概念_GitHub - catstiger/mvc: 一个不超过5000行代码的,快速,简单,易用的MVC框架。...

一个不超过5000行代码的&#xff0c;快速&#xff0c;简单&#xff0c;易用的MVC框架。我们的目的是&#xff1a;让MVC回归其最初的目的。因简单而快速&#xff0c;超过目前各种主流MVC。零侵入&#xff0c;零配置&#xff0c;易于测试&#xff0c;并且让开发者感觉不到MVC的存…

33 Java语言基础控制跳转语句标号

1 public class Add9 {2 public static void main(String[] args) {3 4 a:for (int i 1; i <9 ; i) { // 标号为合法的标识符5 System.out.println("\n");6 b:for (int j 1; j <i ; j) {7 8 System.o…

java 配置jmstemplate_Spring JMSTemplate 与 JMS 原生API比较

JMSUtil与Spring JmsTemplate的对比Author&#xff1a;信仰Date&#xff1a;2012-4-20未完待续&#xff0c;截止日期2012-4-20从以下几方面比较JMSUtil和Spring JmsTemplatel 对JNDI的支持l 对ConnectionFactory、Connection、Destination、Session、MessageProducer、Messag…

java微信支付必要参数_微信支付 开发账号体系各参数详解

商户在微信公众平台提交申请资料以及银行账户资料&#xff0c;资料审核通过并签约后&#xff0c;可以获得表6-4所示帐户(包含财付通的相关支付资金账户)&#xff0c;用于公众帐号支付。帐号及作用&#xff1a;appid &#xff1a;公众帐号身份的唯一标识。审核通过后&#xff0c…

MyEclipse10的正确破解方法

无法转载&#xff0c;故给出原文链接&#xff0c;以供需要者。 MyEclipse10的正确破解方法转载于:https://www.cnblogs.com/qbzf-Blog/p/6341400.html

【二分法】- leetcode

275. H-Index II 278. First Bad Version 此题的条件必须是left < right, 否则如果只有一个版本的话&#xff0c;一直跳不出循环&#xff0c; time limitation。转载于:https://www.cnblogs.com/93scarlett/p/6353765.html

mysql referential_constraints_hibernate4.3.8与spring mvc结合遇到的问题

2703 [2015-01-21 16:47:42 ] - [ip, ref, ua, sid]WARN o.h.e.jdbc.spi.SqlExceptionHelper - SQL Error: 1109, SQLState: 42S022703 [2015-01-21 16:47:42 ] - [ip, ref, ua, sid]ERROR o.h.e.jdbc.spi.SqlExceptionHelper - Unknown table ‘referential_constraints‘ in …

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

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

centos uninstall teamviewer11

由于某些原因&#xff0c;centos系统上的teamviewer不能运行。一直没有管它&#xff08;懒&#xff09;。 但是&#xff0c;突然看不下去了。因为每次开机后都自动启动&#xff0c;需要关闭&#xff0c;否则有问题。所以&#xff0c;uninstall。 尝试了很多都失败。尝试的步骤是…

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…

opencv调节图片饱和度_OpenCV调整彩色图像的饱和度和亮度

问题如何调整彩色图像的饱和度和亮度解决思路详细步骤&#xff1a;将RGB图像值归一化到[0, 1]然后使用函数cvtColor进行色彩空间的转换接下来可以根据处理灰度图像对比度增强伽马变换或者线性变换调整饱和度和亮度分量最后转换到RGB色彩空间代码# !/usr/bin/env python# -*-enc…

Java并发——线程中断学习

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

python etree创建xml_Python构建XML树结构的实例教程

这篇文章主要介绍了Python构建XML树结构的方法,结合实例形式分析了Python创建与打印xml数结构的实现步骤与相关操作技巧,需要的朋友可以参考下本文实例讲述了Python构建XML树结构的方法。分享给大家供大家参考&#xff0c;具体如下&#xff1a;1.构建XML元素#encodingutf-8from…

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

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

or函数 java_Java OptionalInt orElseGet()用法及代码示例

orElseGet(java.util.function.IntSupplier)方法可帮助我们获取此OptionalInt对象中的值。如果此OptionalInt中不存在值&#xff0c;则此方法返回提供函数产生的结果&#xff0c;并作为参数传递用法:public int orElseGet(IntSupplier supplier)参数&#xff1a;此方法接受提供…