基于jsoup的爬虫

时间:2022-10-31 11:06:42

通过jsoup对 企查查 的公司信息爬取

1、Jsoup

先介绍下Jsoup,它还有一个名称“Beautifulsoup for Java”,对爬虫知识感兴趣的朋友一般都是从Python的爬虫开始,那么自然不会对Beautifulsoup感到陌生,而Jsoup就是java环境下同样具有html文档解析的最好的选择之一。

主要方法就是 Jsoup.parse(),解析出来的是一个Document对象。Element对象则提供了一系列类似于DOM的方法来查找元素,抽取并处理其中的元素。这边还是根据官方文档的中文版将它们一一列举,以便使用:

查找元素

getElementById(String id)

getElementsByTag(String tag)

getElementsByClass(String className)

getElementsByAttribute(String key) (and related methods)

Element siblings: siblingElements(), firstElementSibling(), lastElementSibling(); nextElementSibling(), previousElementSibling()

Graph: parent(), children(), child(int index)

元素数据

attr(String key)获取属性attr(String key, String value)设置属性

attributes()获取所有属性

id(), className() and classNames()

text()获取文本内容text(String value) 设置文本内容

html()获取元素内HTMLhtml(String value)设置元素内的HTML内容

outerHtml()获取元素外HTML内容

data()获取数据内容(例如:script和style标签)

tag() and tagName()

操作HTML和文本

append(String html), prepend(String html)

appendText(String text), prependText(String text)

appendElement(String tagName), prependElement(String tagName)

html(String value)

这给我大致的感觉就像是html的读写,而爬虫就是利用它的读的功能。

2、爬虫

一般来说,爬虫都是模拟浏览器访问的存在,但是有爬虫也就有反爬虫,尤其是像企查查这样以数据为核心的类似网站,它所建立的反爬虫机制是非常强的,这时,一般的爬虫是难以获取到想要得到的所有数据的。之前我所写过的一个爬虫(详见github)拿来作为框架已经不合适了,我也想过再系统地去学python的爬虫,为什么是python?因为它的第三方包多啊,也有相应的大型可以定制的爬虫框架。但是万一还是不行呢?然后就陷入了爬虫与反爬虫的攻防战中,对,那样应该是一个技术控要做的,但此时,更重要的是,减少时间成本与学习成本而获得大量优秀有效的数据以便后续的数据开发与分析。所以我选择一个最无脑的方式……

大家玩过浏览器的都知道有个保存网页的功能吧,嗯,我们这次的爬虫就是相当于解析本地文档。这点当然受益于上一次爬虫的开发,就很简单的两个功能,页面请求与保存接着解析,写好的爬虫放在定时器中就可以自动执行了。这次的从代码方面看更简单,就是一次页面解析的过程,如果有N个公司的信息要获得,那么就写N个HashMap吧!

其实有了思路再加上Jsoup的方法那么简单使用,很快就能完成。

相关代码就放在github上了。

3、个人使用经验

其实有代码有说明,照着弄只要时间长点基本都能弄出来。所以这里要提供点精华了 ^_^

关于表格数据的抓取(解析)

对于表格,一般来说获取表格数据时,都会写一个循环,因为每一行的结构都是一样的,而通过Tag的Name获取时,会同时获取表头。

比如: <tr><th>身高</th></tr>

我们要获取的是“身高”属性 这一列的值,而并不需要“身高”。

那么我们可以直接结束整个循环的第一次。

操作方法就是:

boolean flag = true;

在循环里加入

 

if(flag) {
        flag = false;
       }else {
        ... //需要执行的语句
           }

 

这样就可以过滤掉表头了。

上面的方法是用来解决水平结构的表格。

还有一种垂直结构的表格。

我自己的办法是,因为这种表格的表头都是有自己的标签的,所以直接利用jsoup先把dom处理一次。

Document.getElementsByClass("#").remove();

 之后再获取自己想要的信息吧~