java爬虫抓取网页数据( Java世界中小白的我(瑟瑟发抖的状态), )
优采云 发布时间: 2021-09-23 22:08java爬虫抓取网页数据(
Java世界中小白的我(瑟瑟发抖的状态),
)
前言
作为Java世界中的一个小白种人,我(颤抖)对网络数据捕获一无所知。人是没有办法的。这时,我们的老板向我推荐了一款非常有用的爬虫框架webcollector。Webcollector是一个Java爬虫框架,它不需要配置,并且易于二次开发。它提供了一个简化的API,一个功能强大的爬虫程序只需少量代码即可实现。Webcollector Hadoop是Webcollector的Hadoop版本,支持分布式爬网。webcollector非常简单且易于使用。在这里,我想作为初学者与大家分享webcollector
网络采集器的特性
如果我们使用一个框架,我们最需要了解它的优点和缺点,以便更好地发挥它的作用。因为我只知道网络数据爬行的webcollector框架,所以我在Internet上找到了一些关于webcollector的信息并进行了分类
web采集器与传统web爬虫的区别
传统的网络爬虫倾向于将网站内容从一个站点下载到另一个站点。最小的数据单位是单个网页或文件。Web collector可以为定向采集设置爬网策略,并从网页中提取结构化信息
webcollector与httpclient和jsup之间的差异
Webcollector是一个爬虫框架,httpclient是一个HTTP请求组件,jsoup是一个网页解析器(具有内置的HTTP请求功能)
一些程序员在单个线程中通过迭代或递归方法调用httpclient和jsup以获取数据采集,这也可以完成任务,但存在两个主要问题:
单线程的速度比较慢,多线程爬虫的速度要比单线程爬虫快得多
您需要编写自己的任务维护机制。该机制包括URL重复数据消除、断点爬网(即异常中断处理)和其他功能
webcollector框架附带多线程和URL维护。用户在编写爬虫
时不需要考虑线程池、URL去重和断点爬行等问题。
webcollector可以处理的数量级
目前,webcollector有*敏*感*词*和Hadoop版(webcollector Hadoop)。独立版本可以处理数千万个URL,这对于大多数精细数据采集任务来说已经足够了。Webcollector Hadoop可以处理比*敏*感*词*更多的问题,具体数量取决于集群的大小
webcollector的遍历
Webcollector使用粗略的宽度遍历,但是这里的遍历与网站拓扑树结构无关,用户不需要关心遍历方法。PS:作为小白,我对此有着深刻的理解
当访问一个页面时,网络爬虫将从该页面浏览一个新的URL并继续爬网。WebCollector为探索新URL提供了两种机制:自动解析和手动解析。有关这两种机制的详细信息,请阅读以下示例中的代码注释
webcollector的简单使用
上面描述了一系列webcollector框架的特征。让我们简单地看看WebC采藏器在实际进程
中的用法。
1.首先,我们可以直接将webcollector的jar包导入到项目中,或者在POM文件中配置Maven依赖项,如下所示
方法1:单击下载webcollector的jar包
方法2:配置Maven依赖项,如下所示
cn.edu.hfut.dmic.webcollector
WebCollector
2.70
2.创建一个实体类以从BroadthCrawler类继承并重写BroadthCrawler构造函数方法。在构造函数方法中设置基本的爬虫类属性,如设置*敏*感*词*集合、设置URL规则约束、设置断点爬网、设置线程数等(代码在下面)3.完成构造函数方法后,我们最需要的是实现方法public void visit(第页,crawldatams next)在界面访问者中。在该方法中,我们捕获所需的数据信息
让我们举一个具体的例子来说明webcollector的爬行过程是如何实现的
让我们首先创建类、构造函数和visit方法,如下所示
package com.infosports.yuqingmanagement.crawler.impl;
import cn.edu.hfut.dmic.webcollector.model.CrawlDatum;
import cn.edu.hfut.dmic.webcollector.model.CrawlDatums;
import cn.edu.hfut.dmic.webcollector.model.Page;
import cn.edu.hfut.dmic.webcollector.plugin.berkeley.BreadthCrawler;
import cn.edu.hfut.dmic.webcollector.util.RegexRule;
public class SaoDongCrawler extends BreadthCrawler {
private final static String crawlPath = "/Users/luying/data/db/jianshu";
private final static String seed = "http://www.jianshu.com/u/e39da354ce50";
RegexRule regexRule = new RegexRule();
public SaoDongCrawler() {
super(crawlPath, false);
//添加爬取*敏*感*词*,也就是需要爬取的网站地址,以及爬取深度
CrawlDatum datum = new CrawlDatum(seed)
.meta("depth", "1");
addSeed(datum);
//设置线程数,根据自己的需求来搞
setThreads(2);
//添加正则表达式规则
regexRule.addRule("http://.*");
}
@Override
public void visit(Page page, CrawlDatums next) {
}
public static void main(String[] args) throws Exception {
//测试
SaoDongCrawler crawler = new SaoDongCrawler();
crawler.start(2);
}
}
然后,我们打开WebDeveloper工具来查找抓取数据所需的元素和类,如下所示
我们通过开发者工具找到了我们需要的元素,因此我们可以在访问方法中得到“nerve Sao Dong”一词,如下所示
@Override
public void visit(Page page, CrawlDatums next) {
String name = page.select("a.name").text();
System.out.println(name);
}
或者如果我们不想得到标签的值,只是想得到标签呢?然后通过标签得到标签的值
@Override
public void visit(Page page, CrawlDatums next) {
Element nameElement = page.select("a.name").first();
String name = nameElement.text();
System.out.println(name);
}
或者因为一个类的标签太多,我们需要通过上面的标签获得标签。我们应该怎么做?我们需要使用>;以“name”标签为例
@Override
public void visit(Page page, CrawlDatums next) {
Element nameElement = page.select("div.title>a.name").first();
String name = nameElement.text();
System.out.println(name);
}
爬行结果如下所示
总结
本博客即将结束。webcollector基本上可以满足我自己的数据爬行需求。当然,毕竟我已经很久没有学习Java了,所以文章很多概念可能是模棱两可的。因此,如果有错误,我欢迎指导和批评。非常感谢
参考文章:Java开源爬虫框架webcollector2.x入门教程-基本概念