关于Java爬虫的研究

起因

最近突然发了羊癫疯,对爬虫十分感兴趣,开始想写几个爬虫练练手,于是,洗手开搞。

像我这种懒人,对爬虫了解个大概之后就开始偷懒了,开始找框架了,Google关键字“Java 爬虫”,第一个搜索结果就是

高票回答推荐的几款爬虫框架:nutch、Heritrix、crawler4j、WebCollector和WebMagic,果断选择了WebMagic,支持国人作品嘛(肯定是中文文档啊)

下手

使用Maven添加框架到项目中,在poxm.xml文件中添加以下依赖。国内的Maven库居然没有WebMagic,泪奔,顶着延迟添加了依赖。

<dependency>
        <groupId>us.codecraft</groupId>
        <artifactId>webmagic-core</artifactId>
        <version>0.5.3</version>
</dependency>
<dependency>
        <groupId>us.codecraft</groupId>
        <artifactId>webmagic-extension</artifactId>
        <version>0.5.3</version>
</dependency>

依赖添加成功如下图所示:

直接从开发文档的例子入手,主要是有三个部分:

  • 抓取网站的相关配置
  • 抽取页面信息的方法
  • 发现后续url地址

WebMagic提供了一个Site类用于设置抓取网站的相关属性,例如,设置失败时重试次数为3次,抓取间隔为1秒的代码如下所示:

private Site site = Site.me().setRetryTimes(3).setSleepTime(1000);

抽取页面信息的方法

WebMagic通过重写PageProcessor的process()方法来实现爬虫的基本逻辑功能。

WebMagic提供了四种用于抽取数据的方法:

对于HTML内容来说,可以通过XPath、CSS选择器和正则表达式这三种方法抽取内容;对于JSON格式的数据可以通过JsonPath方法抽取内容。

下面是抽取内容的API表:

方法 说明 示例
xpath(String xpath) 使用XPath选择 html.xpath("//div[@class=‘title‘]")
$(String selector) 使用Css选择器选择 html.$("div.title")
$(String selector,String attr) 使用Css选择器选择 html.$("div.title","text")
css(String selector) 功能同$(),使用Css选择器选择 html.css("div.title")
links() 选择所有链接 html.links()
regex(String regex) 使用正则表达式抽取 html.regex("\<div\>(.*?)\")
regex(String regex,int group) 使用正则表达式抽取,并指定捕获组 html.regex("\<div\>(.*?)\",1)
replace(String regex, String replacement) 替换内容 html.replace("\","")

发现后续url地址

一个站点的页面是非常多的,那么我们怎么在发现并抽取了一个页面之后进行链式的挖掘呢?这事爬虫程序非常关键的部分,对链式

答案是通过正则表达式构造待挖掘的url格式,调用page对象(不是页面对象page,是process()方法提供的参数对象page)的addtargetRequests()方法,将url添加到待挖掘的url中。

时间: 2024-07-31 14:32:42

关于Java爬虫的研究的相关文章

webmagic的设计机制及原理-如何开发一个Java爬虫 转

此文章是webmagic 0.1.0版的设计手册,后续版本的入门及用户手册请看这里:https://github.com/code4craft/webmagic/blob/master/user-manual.md 之前就有网友在博客里留言,觉得webmagic的实现比较有意思,想要借此研究一下爬虫.最近终于集中精力,花了三天时间,终于写完了这篇文章.之前垂直爬虫写了一年多,webmagic框架写了一个多月,这方面倒是有一些心得,希望对读者有帮助. webmagic的目标 一般来说,一个爬虫包括

Java爬虫搜索原理实现

permike 原文 Java爬虫搜索原理实现 没事做,又研究了一下爬虫搜索,两三天时间总算是把原理闹的差不多了,基本实现了爬虫搜索的原理,本次实现还是俩程序,分别是按广度优先和深度优先完成的,广度优先没啥问题,深度优先请慎用,有极大的概率会造成死循环情况,下面深度优先的测试网站就造成了死循环....好吧,我承认是我人品不太好...下面有请代码君出场~~~~~~~~~~~~~~~ 1.广度优先 [java] view plaincopy /** * 完成广度优先搜索 */ package imp

JAVA爬虫 WebCollector

爬虫简介: WebCollector是一个无须配置.便于二次开发的JAVA爬虫框架(内核),它提供精简的的API,只需少量代码即可实现一个功能强大的爬虫. 爬虫内核: WebCollector致力于维护一个稳定.可扩的爬虫内核,便于开发者进行灵活的二次开发.内核具有很强的扩展性,用户可以在内核基础上开发自己想要的爬虫.源码中集成了Jsoup,可进行精准的网页解析. 量级: WebCollector最常用的爬取器BreadthCrawler使用2^24的布隆过滤器进行URL管理,可处理2^24量级

福利贴——爬取美女图片的Java爬虫小程序代码

自己做的一个Java爬虫小程序 废话不多说,先上图. 文件夹命名是用标签缩写,如果大家看得不顺眼可以等下载完成后手动改一下,比如像有强迫症的我一样... 这是挂了一个晚上下载的总大小,不过还有很多因为一些问题没有遍历下载到,而且会产生很多空文件,最下面我附带了一个递归删除空文件夹的小程序代码. 接下来是文件夹内部~ 图片存放位置默认为d:\picture,可在程序中更改,main函数的开头就是,有注释.爬取的网站为http://www.mmonly.cc/,大家有更好的资源网站可以私我. 爬虫源

JAVA 虚拟机深入研究(三)——Java内存区域

JAVA 虚拟机深入研究(一)--关于Java的一些历史 JAVA 虚拟机深入研究(二)--JVM虚拟机发展以及一些Java的新东西 JAVA 虚拟机深入研究(三)--Java内存区域 Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的围城,城外的人想进去,城里的人想出来. Java运行的时候会把内存分为若干个,他们各有各的用途,每块区域的创建和销毁都是相对独立的,有的跟虚拟机一起混,有的则抱着用户的大腿同生共死. 按照第七版的<Java虚拟机规范>规定,JVM所管理的内存包括以下

C#和Java交互相关研究

之前总觉得C#和Java可以交互应用,但是由于时间以及其他方面的原因,一直没有调研.今天抽空搜了一下,终于折腾出来了. 以下是我自己就C#和Java整合的一些提问和分析,如果有不对的地方,请路过的各位大虾给予指出.3Q! 问题来了: 1.C#和Java如何整合? 2.为什么C#(.Net)要和Java整合? 3.Java和C#整合时,Java主要扮演什么角色?C#扮演什么角色? 答案一一揭晓: 1.C#和Java整合大致有4条路可以走. 1.1 把Java包转换为DLL或者EXE后注册为com组

Java爬虫

1.昨天复习了Java基础(I/O流)和正则表达式 今天不讲Java中的 I/O 主要用一个实例来爬取网站中的邮箱 代码如下: 1 package com.miao.baba.pacong; 2 3 import java.io.BufferedReader; 4 import java.io.IOException; 5 import java.io.InputStream; 6 import java.io.InputStreamReader; 7 import java.net.URL;

Java爬虫项目实战(一)

目的: 通过网络爬虫爬取中国最小粒度的区域维度信息,包括省(Province) .市(City).县(County).镇(town).村委会(village) 主网站链接: http://www.stats.gov.cn/tjsj/tjbz/tjyqhdmhcxhfdm/2015/index.html 主要jar包: http://jsoup.org/packages/jsoup-1.8.1.jar 之前一节我们说过java爬虫从网络上利用jsoup获取网页文本,也就是说我们可以有三种方法获取h

Java爬虫框架SeimiCrawler的工程自动打包工具使用

为了便于开发者对使用SeimiCrawler框架开发的爬虫工程的打包部署,SeimiCrawler现已推出maven-seimicrawler-plugin,一个maven工程的自动化打包插件.下面简要介绍下他的使用. 开始 pom添加添加plugin <plugin> <groupId>cn.wanghaomiao</groupId> <artifactId>maven-seimicrawler-plugin</artifactId> <