基于Jsoup的数据抓取

为什么写这篇文章

授人以鱼不如授人以渔,工作和技术中总会有这样或者那样的新鲜事务出现在我们面前.我们总是希望寻求别的帮助来减少自己的时间成本而忽略了学习才是最根本的解决问题的方案.但是人人并非圣人,哪怕出发点是为了完成工作我们也不要忘了自己的初心.

希望这篇文章能够给予你帮助.有分享我们一起成长.2017-07-07 凌晨3点钟

什么是爬虫

度娘的解释:网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。另外一些不常使用的名字还有蚂蚁、自动索引、模拟程序或者蠕虫。

维基百科:网络爬虫(英语:web crawler),也叫网络蜘蛛(spider),是一种用来自动浏览万维网的网络机器人。其目的一般为编纂网络索引。

我的理解:有时候我们处于特殊目的需要从网上获取某些特定的数据而编写的程序,这些数据的来源可能是静态页面内容,也可能是异步加载的内容.我们需要程序收集并格式化成我们想要的内容.这个程序就是我们所谓的爬虫

那么,作为一个Java程序员,我们有哪些现成的工具呢或者我们如何使用他们呢?

不要忘了,百分之八十以上的Java都是web方向的,我们每时每刻都在和网络打交到

打开你的IDE,或者去翻一下Java API,你找到java.net包或者直接百度他,凡是在工作业务中调用过他人接口的小伙伴,肯定会眼前一亮,对,就是他;

现在我们写下一段代码:

@Test//使用get请求
    public void test1() throws IOException {
        URL realUrl = new URL("http://www.baidu.com");
        // 打开和URL之间的连接
        URLConnection conn = realUrl.openConnection();
        // 设置通用的请求属性   请求头 关于http协议请求头内容可以查看我的另一篇博客:http://www.cnblogs.com/dougest/p/7130147.html
        conn.setRequestProperty("accept", "*/*");
        conn.setRequestProperty("connection", "Keep-Alive");
        conn.setRequestProperty("user-agent",  "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)");
        // 建立实际的连接
        conn.connect();
        // 定义BufferedReader输入流来读取URL的响应
        BufferedReader in = new BufferedReader(
                new InputStreamReader(conn.getInputStream()));
        String line;
        String result = "";
        while ((line = in.readLine()) != null) {
            result += "\n" + line;
        }
        System.out.println(result);//打印出百度的html
    }

在java.net包下封装实现网络应用程序,包括我们常说的socket(套接字),Proxy(代理)等等

java.net在线API

有了这些东西,我们就能获取简单的数据或者是开发者暴露出来的接口数据,如果按照上面度娘和维基百科的定义来讲,上面的代码就是我们实现的一个相当简单的爬虫了

现在来讲数据爬取到了,但这并不是我想要的,我想要某个字或者某些内容

这个时候我就要介绍一下Java的两个工具了

Jsouphttpclient

我们先看官方的解释

Jsoup官网:https://jsoup.org/

jsoup官方介绍(直接谷歌翻译):

jsoup:Java HTML解析器
jsoup是一个用于处理真实HTML的Java库。它提供了一个非常方便的API来提取和操作数据,使用最好的DOM,CSS和类似jquery的方法。
jsoup实现WHATWG HTML5规范,并将HTML解析为与现代浏览器相同的DOM。
从URL,文件或字符串中刮取并解析 HTML
查找和提取数据,使用DOM遍历或CSS选择器
操纵 HTML元素,属性和文本
根据安全的白名单清理用户提交的内容,以防止XSS攻击
输出整洁的HTML
jsoup旨在处理在野外发现的所有品种的HTML; 从原始和验证,到无效的标签汤; jsoup将创建一个明智的解析树。

httpclient官网:http://hc.apache.org/httpclient-3.x/

httpclient官方介绍(直接谷歌翻译):

HTTP 协议可能是现在 Internet 上使用得最多、最重要的协议了,越来越多的 Java 应用程序需要直接通过 HTTP 协议来访问网络资源。虽然在 JDK 的 java net包中已经提供了访问 HTTP 协议的基本功能,但是对于大部分应用程序来说,JDK 库本身提供的功能还不够丰富和灵活。HttpClient 是 Apache Jakarta Common 下的子项目,用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 HTTP 协议最新的版本和建议。HttpClient 已经应用在很多的项目中,比如 Apache Jakarta 上很著名的另外两个开源项目 Cactus 和 HTMLUnit 都使用了 HttpClient。

看完这两段官方的介绍,我想这两个工具的异同点是仁者见仁,智者见智了

现在我们的出发点是为了实现一个简单爬虫,仅仅抓取网页还是不够的,我们还要把我们想要的数据格式化,格式化数据相比较而言我还是喜欢用jsoup,因为他太强太神奇了.他可以让我们像使用JavaScript或者css选择器一样去遍历节点,

直接筛出我们想要的东西(异步加载的数据还是有点难度,当然我们后面会提到),关于Jsoup是如何筛选如何使用的,可以参考我的另外一篇博客:可做爬虫的jsoup常用方法,附异步请求实现

  @Test
    public void test2() throws IOException {
        //Jsoup内部封装了url请求/参数请求等,这里我们直接调用
        Document doc = Jsoup.connect("http://news.baidu.com/").get();
        System.out.println(doc.text());
    }

直接打印你会发现这些都是页面的文本内容,现在我们来筛选出文章标题和链接

在这里说下心得(我对爬虫只是感兴趣属于个人研究,工作中几乎设计不到):爬数据,或者扒数据就是找规律,写代码也是找规律,有点面向规律的问道咯

  @Test
    public void test2() throws IOException {
        //Jsoup内部封装了http.net的一些方法,使用起来更简单
        //获取博客园首页文章信息
        Document doc = Jsoup.connect("https://www.cnblogs.com/").get();
        Elements elements = doc.getElementsByClass("titlelnk");
        for(Element e : elements) {
            System.out.println("标题==>"+e.text().trim());//获取标题
            System.out.println("超链接==>"+e.attr("href"));//获取超链接
        }
    }

现在讲一下关于异步加载的问题,有时候js异步加载确实是个头疼的问题

如果有耐心,可以使用谷歌浏览器去扒接口,比如扒取某某点评的菜价

规律就然后就去查看请求的URL以及参数摸规律

有时候某些网站会限制请求频率或者封锁ip

针对请求频率可以设置定时器每隔一段时间访问一次,至于封锁ip手段时间关系你们还是自己百度吧

或者推荐使用htmlunit模仿浏览器执行js,等待js加载执行完毕再去解析html,比如

WebClient webClient = new WebClient(BrowserVersion.CHROME);
        //支持JavaScript
        webClient.getOptions().setJavaScriptEnabled(true);//启用JS解释器,默认为true
        webClient.getOptions().setCssEnabled(false);//禁用css支持
        webClient.getOptions().setActiveXNative(false);
        webClient.getOptions().setCssEnabled(false);
        webClient.getOptions().setThrowExceptionOnScriptError(false);
        webClient.getOptions().setThrowExceptionOnFailingStatusCode(false);
        webClient.getOptions().setTimeout(1*1000);
        webClient.getOptions().setUseInsecureSSL(true);
        HtmlPage rootPage = null;
        try {
            rootPage = webClient.getPage("https://www.*****.com");
        } catch (FailingHttpStatusCodeException e) {
            e.printStackTrace();
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        //设置一个运行JavaScript的时间
        webClient.waitForBackgroundJavaScript(1*1000);
        String html = rootPage.asXml();
        Document doc = Jsoup.parse(html);

或者有精力可以研究一下Selenium

这篇博客现在就先到这里,总之还是那句话,授人以鱼不如授人以渔,简单的介绍之后你肯定会对爬虫有了那么点了解

如果能帮你开启一扇新的大门,我将荣幸之至

但是学习的这条路是没有尽头的

路漫漫其修远兮,吾将上下而求索

路,还很长

 Dougest

2017/0707 凌晨4:50

时间: 2024-11-05 12:48:58

基于Jsoup的数据抓取的相关文章

jsoup实现java抓取网页内容。

Java 程序在解析 HTML 文档时,相信大家都接触过 htmlparser 这个开源项目,我曾经在 IBM DW 上发表过两篇关于 htmlparser 的文章,分别是:从 HTML 中攫取你所需的信息和 扩展 HTMLParser 对自定义标签的处理能力.但现在我已经不再使用 htmlparser 了,原因是 htmlparser 很少更新,但最重要的是有了 jsoup . jsoup 是一款 Java 的 HTML 解析器,可直接解析某个 URL 地址.HTML 文本内容.它提供了一套非

Hibernate学习---第十一节:Hibernate之数据抓取策略&批量抓取

1.hibernate 也可以通过标准的 SQL 进行查询 (1).将SQL查询写在 java 代码中 /** * 查询所有 */ @Test public void testQuery(){ // 基于标准的 sql 语句查询 String sql = "select * from t_person"; // 通过 createSQLQuery 获取 SQLQuery,而 SQLQuer 是 Query的子类 SQLQuery query = session.createSQLQue

freecms使用jsoup和quartz抓取其他网站内容

这里提到了freecms,其实抓取和freecms没什么关系,主要还是靠jsoup jsoup里提供了html解析和读取的方法,集成了httprequest,可以从网络和本地读取,支持非闭合标签等. csdn中有比较详细的介绍 http://blog.csdn.net/column/details/jsoup.html 一般抓取页面的内容,都是后台进行的,多数是周期抓取,那么肯定要有调度的方法,包括 Timer,Scheduler, Quartz 以及 JCron Tab等等.这篇文件介绍和对比

关于“淘宝爆款”的数据抓取与数据分析

本文为younghz原创,文章链接为:http://blog.csdn.net/u012150179/article/details/37306629 这个问题最初是源于我在知乎上一个回答(http://www.zhihu.com/question/24368542/answer/27579662),涉及了两个方面:数据抓取和数据分析. 1.数据爬取 爬取对象:淘宝"连衣裙 夏"的搜索结果. 爬取对象的选择分析我在文章中也有提及. 工具:Scrapy. 代码:我把当时实现的代码放在了G

记一次企业级爬虫系统升级改造(二):基于AngleSharp实现的抓取服务

爬虫系统升级改造正式启动: 在第一篇文章,博主主要介绍了本次改造的爬虫系统的业务背景与全局规划构思: 未来Support云系统,不仅仅是爬虫系统,是集爬取数据.数据建模处理统计分析.支持全文检索资源库.其他业务部门和公司资讯系统重要数据来源.辅助决策等功能于一身的企业级Support系统. 介于好多园友对博主的任务排期表感兴趣,便介绍一下博主当时针对这个系统做的工作任务排期概要(排期表就是更加详细细分外加估算工时的一份excel表格,就不贴出来了): 1.总分四大阶段,逐步上线,最终达到预期规划

大数据抓取采集框架(摘抄至http://blog.jobbole.com/46673/)

摘抄至http://blog.jobbole.com/46673/ 随着BIG DATA大数据概念逐渐升温,如何搭建一个能够采集海量数据的架构体系摆在大家眼前.如何能够做到所见即所得的无阻拦式采集.如何快速把不规则页面结构化并存储.如何满足越来越多的数据采集还要在有限时间内采集.这篇文章结合我们自身项目经验谈一下. 我们来看一下作为人是怎么获取网页数据的呢? 1.打开浏览器,输入网址url访问页面内容.2.复制页面内容的标题.作者.内容.3.存储到文本文件或者excel. 从技术角度来说整个过程

python网页数据抓取全纪录

在本文中,我将会为你展示一个基于新的异步库(aiohttp)的请求的代替品.我使用它写了一些速度的确很快的小数据抓取器,下面我将会为你演示是如何做到的.codego.net中介绍的方法如此多样的原因在于,数据"抓取"实际上包括很多问题:你不需要使用相同的工具从成千上万的页面中抓取数据,同时使一些Web工作流自动化(例如填一些表单然后取回数据). asyncio的基本概念 asyncio是在python3.4中被引进的异步IO库.你也可以通过python3.3的pypi来安装它.它相当的

ngrep环回接口数据抓取方法,使用-d lo参数

ngrep环回接口数据抓取方法,使用-d lo参数,注意顺序: ngrep -W byline -d lo port 80

利用Selenium制作python数据抓取,以及对Selenium资源介绍

当当当~第三篇博客开始啦~ 这次的话题是数据抓取.终于到了核心部分的探讨,我的心情也是非常激动啊!如果大家baidu或者google(如果可以的话)数据抓取或者data crawling,将会找到数以千计的例子.但是大多数的代码非常的冗长,并且许多代码还是抓取静态数据之后,对动态JS写成的数据却毫无办法.或者,利用HTML解析网址后,再找到JS写的数据页面来寻找到所想要的数据. 但是!不知各位是否有发现过,如果打开chrome或者safari或者各种浏览器的审查元素.网页上能看到的数据,其实都会