前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >谁说我不会用Java爬去网页数据

谁说我不会用Java爬去网页数据

作者头像
用户7293182
发布2022-01-20 17:21:20
6950
发布2022-01-20 17:21:20
举报
文章被收录于专栏:jQuery每日经典jQuery每日经典

没错,你没有看错,这篇文章的主题是Java,不是漏写了JavaScript。但是你能看懂,而且很在行。

你们有时候会不会有这样的想法,如果我能拿到某某网站的数据该多好。如果网站的数据量不大,咱可以使用JavaScript 来重写网站内部的一些方法,以便拿到网站的数据。如果数据过多怎么办呢?频繁的请求可能导致网站把你拉黑,还有很多的麻烦事。

上次我给同事抓了一份16万条数据的网站,这只是一个分类下边的。使用的jQuery技术,每次导出3000条,就写到Excel中,受各种条件限制。但是这毕竟不是个事吧,160000/3000 = 54个Excel文件。

使用后端技术又不太熟悉,Python 这是一个很好的写脚本工具。得学啊,现在的小朋友们都开始学习这个了。

开始正题,今天介绍的 爬取网页数据使用的 jar包(类似于前端的插件)是 “jsoup”,它的实现与 jQuery 有百分之九十的相似度,特指对DOM的操作。

API地址:

https://jsoup.org/apidocs/index.html?overview-summary.html 帮助文档: https://jsoup.org/cookbook/input/parse-document-from-string

中文文档: http://www.open-open.com/jsoup/

解析和遍历一个HTML文档

如何解析一个HTML文档:

代码语言:javascript
复制
String html = "<html><head><title>First parse</title></head>"
  + "<body><p>Parsed HTML into a doc.</p></body></html>";
Document doc = Jsoup.parse(html);

(更详细内容可查看 解析一个HTML字符串.)

其解析器能够尽最大可能从你提供的HTML文档来创见一个干净的解析结果,无论HTML的格式是否完整。比如它可以处理:

  • 没有关闭的标签 (比如: <p>Lorem <p>Ipsum parses to <p>Lorem</p> <p>Ipsum</p>)
  • 隐式标签 (比如. 它可以自动将 <td>Table data</td>包装成<table><tr><td>?)
  • 创建可靠的文档结构(html标签包含head 和 body,在head只出现恰当的元素)

一个文档的对象模型

  • 文档由多个Elements和TextNodes组成 (以及其它辅助nodes:详细可查看:nodes package tree).
  • 其继承结构如下:Document继承Element继承Node. TextNode继承 Node.
  • 一个Element包含一个子节点集合,并拥有一个父Element。他们还提供了一个唯一的子元素过滤列表。

从一个URL加载一个Document

存在问题

你需要从一个网站获取和解析一个HTML文档,并查找其中的相关数据。你可以使用下面解决方法:

解决方法

使用 Jsoup.connect(String url)方法:

代码语言:javascript
复制
Document doc = Jsoup.connect("http://example.com/").get();
String title = doc.title();

说明

connect(String url) 方法创建一个新的 Connection, 和 get() 取得和解析一个HTML文件。如果从该URL获取HTML时发生错误,便会抛出 IOException,应适当处理。

Connection 接口还提供一个方法链来解决特殊请求,具体如下:

代码语言:javascript
复制
Document doc = Jsoup.connect("http://example.com")
  .data("query", "Java")
  .userAgent("Mozilla")
  .cookie("auth", "token")
  .timeout(3000)
  .post();

这个方法只支持Web URLs (httphttps 协议); 假如你需要从一个文件加载,可以使用 parse(File in, String charsetName) 代替。

设置属性的值

问题

在你解析一个Document之后可能想修改其中的某些属性值,然后再保存到磁盘或都输出到前台页面。

方法

可以使用属性设置方法 Element.attr(String key, String value), 和 Elements.attr(String key, String value).

假如你需要修改一个元素的 class 属性,可以使用 Element.addClass(String className)Element.removeClass(String className) 方法。

Elements 提供了批量操作元素属性和class的方法,比如:要为div中的每一个a元素都添加一个rel="nofollow" 可以使用如下方法:

代码语言:javascript
复制
doc.select("div.comments a")
   .attr("rel", "nofollow");

说明

Element中的其它方法一样,attr 方法也是返回当 Element (或在使用选择器是返回 Elements 集合)。这样能够很方便使用方法连用的书写方式。比如:

代码语言:javascript
复制
doc.select("div.masthead")
   .attr("title", "jsoup")
   .addClass("round-box");

设置一个元素的HTML内容

问题

你需要一个元素中的HTML内容

方法

可以使用Element中的HTML设置方法具体如下:

代码语言:javascript
复制
Element div = doc.select("div").first(); // <div></div>
div.html("<p>lorem ipsum</p>"); // <div><p>lorem ipsum</p></div>
div.prepend("<p>First</p>");//在div前添加html内容
div.append("<p>Last</p>");//在div之后添加html内容
// 添完后的结果: <div><p>First</p><p>lorem ipsum</p><p>Last</p></div>Element span = doc.select("span").first(); // <span>One</span>
span.wrap("<li><a href='http://example.com/'></a></li>");
// 添完后的结果: <li><a href="http://example.com"><span>One</span></a></li>

说明

  • Element.html(String html) 这个方法将先清除元素中的HTML内容,然后用传入的HTML代替。
  • Element.prepend(String first)Element.append(String last) 方法用于在分别在元素内部HTML的前面和后面添加HTML内容
  • Element.wrap(String around) 对元素包裹一个外部HTML内容。

参见

可以查看API参考文档中 Element.prependElement(String tag)Element.appendElement(String tag) 方法来创建新的元素并作为文档的子元素插入其中。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-01-31,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 jQuery每日经典 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 解析和遍历一个HTML文档
    • 一个文档的对象模型
    • 从一个URL加载一个Document
      • 存在问题
        • 解决方法
          • 说明
          • 设置属性的值
            • 问题
              • 方法
                • 说明
                • 设置一个元素的HTML内容
                  • 问题
                    • 方法
                      • 说明
                        • 参见
                        领券
                        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档