webcollector是一个开源的Java网络爬虫框架。最近的爬虫改用java写了,对这一周的工作进行简要总结。对于内部机制了解不深入,主要侧重在应用。

一、环境搭建

  需要安装一个webcollector的jar包,从官网上下载bin文件,解压,根据不同IDE的安装方式进行安装即可。

  https://github.com/CrawlScript/WebCollector

  关于使用,官网上提供了很多的例子,从GitHub上将整个Webcollector的工程下载下来,参照进行编码。

  

  我直接在官方提供的工程上面建了个文件夹,进行编码。

二、基本使用

  两个class,一个Model,一个抓取

  1、Model类——封装了要抓取的那些字段

 package cn.edu.hfut.dmic.webcollector.example.myCrawler.test;

 public class TongModel {
String fullName;
String shortName;
String time;
public String getFullName() {
return fullName;
} public void setFullName(String fullName) {
this.fullName = fullName;
} public String getShortName() {
return shortName;
} public void setShortName(String shortName) {
this.shortName = shortName;
} public String getTime() {
return time;
} public void setTime(String time) {
this.time = time;
}
}

  2、Crawl类——定义了抓取规则

 package cn.edu.hfut.dmic.webcollector.example.myCrawler.test;
import cn.edu.hfut.dmic.webcollector.crawler.DeepCrawler;
//import cn.edu.hfut.dmic.webcollector.example.util.ProxyCollector;
import cn.edu.hfut.dmic.webcollector.example.util.JDBCBase;
import cn.edu.hfut.dmic.webcollector.model.Links;
import cn.edu.hfut.dmic.webcollector.model.Page;
import cn.edu.hfut.dmic.webcollector.net.HttpRequesterImpl;
import cn.edu.hfut.dmic.webcollector.net.RandomProxyGenerator;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import org.springframework.jdbc.core.JdbcTemplate; import java.util.List;
public class CrawlTong extends DeepCrawler{
JdbcTemplate jdbcTemplate = JDBCBase.getInstance().getTemplete2();
public CrawlTong(String crawlPath){
super(crawlPath);
} @Override
public Links visitAndGetNextLinks(Page page) {
Document doc = page.getDoc();
boolean iRedirect = page.getResponse().getRedirect();
if(iRedirect)
return null;
TongModel tongModel = new TongModel();
Elements elementsAll = doc.getAllElements();
tongModel.setFullName(elementsAll.select("a.v3-branding_logo").text());
tongModel.setShortName(elementsAll.select("a.v3-branding_logo").attr("href"));
tongModel.setTime("2010-01-21");
saveToDB(tongModel);
return null;
}
public int saveToDB(TongModel m)
{
System.out.println(m.getFullName());
System.out.println(m.getShortName());
System.out.println(m.getTime());
String sql = "insert into tong(fullName,shortName,timer) values(?,?,?)";
int updates=jdbcTemplate.update(sql,m.getFullName(),m.getShortName(),m.getTime());
return 0;
}
public static void main(String[] args) throws Exception{
CrawlTong crawler = new CrawlTong("/tong");
crawler.addSeed("https://www.tzg.cn/");
crawler.start(1);
} }

  继承自抓取父类,我采用的是继承DeepCrawler,相应的也可以继承自BreathCrawler。

  主要是三个方法,当写完extends DeepCrawler,一般编辑器会提示你实现构造方法和重写visitAndGetNextLinks方法,然后需要创建一个main函数

  (1)main函数,相当于爬虫的入口

    ① 新建一个爬虫

    ② 设定种子,即要爬取的URL

    ③ 可以设定爬取的线程数,crawler.setThreads(1); 可以并行爬行

    ④ 设定爬取的深度,crawler.start(10);

     关于深度,我的理解是,初始种子是第一层;如果在爬取的过程中不断的加入新的URL,通过第一层新加入的就算第二层;以此类推

     通常爬取的时候深度不好确认,最简单的办法就是设定个特别大的值

  (2)visitAndGetNextLinks方法,页面解析

    采用Jsoup的方法,对页面进行解析 http://www.open-open.com/jsoup/selector-syntax.htm

    定义一个Model的对象,通过set的方式把数据存入model  

    再将Model存放到数据库中

  (3)构造方法

    关于构造方法,我目前的应用中基本没有修改,后续遇到再补充

  (4)JdbcTemplate jdbcTemplate = JDBCBase.getInstance().getTemplete2();

    这行代码,是数据库相关的配置

    JDNCBase文件中的getTemplete2(),定义了连接哪个数据库

补充1:DAO

  WebCollector本身融合了Spring框架(不知道这样说合不合理,本身对Java的框架理解不深),可以通过DAO的形式对数据进行存储。

 package cn.edu.hfut.dmic.webcollector.example.myCrawler.test;

 import cn.edu.hfut.dmic.webcollector.example.util.GenericDaoImpl;

 import java.util.List;

 public class DataVaryDao extends GenericDaoImpl<DataVaryModel,Long> {

     public DataVaryDao(){super(DataVaryModel.class);}

     public Long add(DataVaryModel model)
{
return insert(model);
} public int updata(DataVaryModel model)
{
return this.update(model);
} public List<DataVaryModel> getDataBySql(String sql, List<Object> values)
{
return this.selectBySqlList(sql, values); } @Override
public long getCountBySqlList(String sql, List<Object> values) {
return 0;
}
}
 dataList = dataDao.getDataBySql("select * from table where xmbm = ? and platform_id = ?", valueList);
dataModelDB = dataList.get(0); dataVaryModel=new DataVaryModel();
dataVaryModel.setData_id(dataModelDB.getId());
dataVaryModel.setKtje(ktje);
dataVaryModel.setXmzt(xmzt);
dataVaryModel.setTzrc(tzrc);
dataVaryModel.setCreate_date(new Timestamp(new Date().getTime()));
dataVaryDao.add(dataVaryModel);

  上面就是定义了一个简单的DAO类,这个类也继承自一个基类;然后通过调用DAO中的方法进行数据存储

  当然DAO对数据的增删改查等需要自己后台实现

补充2:动态增加种子

  爬取的一个常见情况,一边爬网页,一边将网页中的URL加入到爬取队列中。  

 Links links=new Links();
for(int i=0;i<length;i++){
String temp=pre+elements1.get(i).attr("href");
System.out.println(temp);
System.out.println(elements1.get(i).text().trim());
links.add(temp);
} return links;

  在visitAndGetNextLinks方法中,定义一个Links类型的变量,将URL加入变量中,返回即可

  如上述提及的爬取深度,爬出初始URL页面获取的links就是第二层,一颗树形的结构,随着抓取的增加,深度不断加深

补充3:不动态增加种子,但是爬取新页面

  还有一种情况,在爬取的过程中得到了新的URL,但是不想放入对爬取队列,想当下就拿到上面的数据。

  String newUrl="http://www.xueshandai.com/invest/invest-record/"+xmbm;
try {
System.out.println(newUrl);
String html = requester.getResponse(newUrl).getHtml("UTF-8");
Pattern p = Pattern.compile("<div class=\"jtit3\">(.*?)</div>");
Matcher m = p.matcher(html);
System.out.println(m);
if(m.find()){
System.out.println("------find---------");
String s=m.group().split(":")[3].split("<")[0];
System.out.println(s.substring(0,s.length()-1));
tzrc = Integer.parseInt(s.substring(0,s.length()-1));
}
} catch (Exception e) {
e.printStackTrace();
}

  requester.getResponse(newUrl).getHtml("UTF-8");

  通过这样一条语句,可以直接得到url的HTML,不过存储的是String类型,可以通过正则进行解析,获取需要的数据。

补充4:对不同种类的URL进行分门处理

  可能抓取队列中存放着不同类型的URL,对每一种爬取方案是不同的。

  高大上的方法:定义抽取器

  简单方法:字符串匹配

   if(pageURL.contains("list")){}

  else if (pageURL.contains("detail")){}

以上,就是目前遇到的一些情况,比较简单,还会再用两周。

后续内容:

  (1)加代理(已经遇到封IP的情况了)、加头部文件

  (2)抽取器

  (3)解析Json文件、XML文件

  (4)内部机制的学习调用

Webcollector应用(一)的更多相关文章

  1. 搜索引擎爬虫技术研究(爬虫框架)-WebCollector

    一.简介: https://github.com/CrawlScript/WebCollector/blob/master/README.zh-cn.md 二.使用: <dependency&g ...

  2. 用WebCollector爬取站点的图片

    用WebCollector爬取整站图片,仅仅须要遍历整站页面.然后将URL为.jpg.gif的页面(文件)保存到本地就可以. 比如我们爬取一个美食站点,获取里面全部的图片: import cn.edu ...

  3. 国庆第三天2014年10月3日10:21:39,Nutz,WebCollector,jsoup

    (1)做得好,做得快,只能选择一样. (2)时间过得很快,你没法在假期的一天里完成更多的计划.假期全部由自己支配,相对长一点的睡眠,新加入的娱乐(视频或者游戏),你不比在工作中更有效率. (3)每天练 ...

  4. JAVA爬虫 WebCollector

    JAVA爬虫 WebCollector 爬虫简介: WebCollector是一个无须配置.便于二次开发的JAVA爬虫框架(内核),它提供精简的的API,只需少量代码即可实现一个功能强大的爬虫. 爬虫 ...

  5. 动态网页爬取例子(WebCollector+selenium+phantomjs)

    目标:动态网页爬取 说明:这里的动态网页指几种可能:1)需要用户交互,如常见的登录操作:2)网页通过JS / AJAX动态生成,如一个html里有<div id="test" ...

  6. 用WebCollector制作一个爬取《知乎》并进行问题精准抽取的爬虫(JAVA)

    简单介绍: WebCollector是一个无须配置.便于二次开发的JAVA爬虫框架(内核),它提供精简的的API.仅仅需少量代码就可以实现一个功能强大的爬虫. 怎样将WebCollector导入项目请 ...

  7. JAVA网络爬虫WebCollector深度解析——爬虫内核

    WebCollector爬虫官网:https://github.com/CrawlScript/WebCollector 技术讨论群:250108697 怎样将爬虫内核导入自己的项目? 1.进入爬虫官 ...

  8. JAVA开源爬虫,WebCollector,使用方便,有接口。

    假设你想下载整个网站内容爬行动物,我不希望配置heritrix复杂的爬行动物,要选择WebCollector.项目github一个不断更新. github源地址:https://github.com/ ...

  9. WebCollector 2.x 新手教程

    WebCollector爬虫官网:https://github.com/CrawlScript/WebCollector 技术讨论群:250108697 WebCollector 2.x教程列表 We ...

  10. 使用webcollector爬虫技术获取网易云音乐全部歌曲

    最近在知乎上看到一个话题,说使用爬虫技术获取网易云音乐上的歌曲,甚至还包括付费的歌曲,哥瞬间心动了,这年头,好听的流行音乐或者经典老歌都开始收费了,只能听不能下载,着实很郁闷,现在机会来了,于是开始研 ...

随机推荐

  1. 洛谷P1658 购物

    题目戳 题目描述 你就要去购物了,现在你手上有N种不同面值的硬币,每种硬币有无限多个.为了方便购物,你希望带尽量少的硬币,但要能组合出1到X之间的任意值. 输入输出格式 输入格式: 第一行两个数X.N ...

  2. Spring Boot系列教程三:使用devtools实现热部署

    一.前言 Eclipse下使用spring-tool-suite插件创建一个spring boot 工程,通过右键“Run As”--->"Spring Boot App"来 ...

  3. 【CF438E】The Child and Binary Tree(多项式运算,生成函数)

    [CF438E]The Child and Binary Tree(多项式运算,生成函数) 题面 有一个大小为\(n\)的集合\(S\) 问所有点权都在集合中,并且点权之和分别为\([0,m]\)的二 ...

  4. BZOJ3509 [CodeChef] COUNTARI 【分块 + fft】

    题目链接 BZOJ3509 题解 化一下式子,就是 \[2A[j] = A[i] + A[k]\] 所以我们对一个位置两边的数构成的生成函数相乘即可 但是由于这样做是\(O(n^2logn)\)的,我 ...

  5. php开启压缩gzip

    php服务的开启压缩,节省带宽 看是否开启压缩的网站 http://www.cnblogs.com/GaZeon/p/5421906.html 找到php.ini,修改下面的 ,重启php-fpm z ...

  6. python中如何优雅使用import

    http://note.youdao.com/noteshare?id=c55be6a8565f5eb586aa52244b3af010

  7. 【题解】【LibreOJ Round #6】花团 LOJ 534 时间线段树分治 背包

    Prelude 题目链接:萌萌哒传送门(/≧▽≦)/ Solution 如果完全离线的话,可以直接用时间线段树分治来做,复杂度\(O(qv \log q)\). 现在在线了怎么办呢? 这其实是个假在线 ...

  8. Android Monkey 脚本编写与检查内存泄露

    一.Monkey脚本编写 1.Monkey脚本格式 脚本优势: 简单快捷,不需要接触任何工具,只需要一个记事本文件 脚本缺点: 实现坐标.按键等基本操作的相应步骤,顺序脚本无逻辑性 脚本源码: \de ...

  9. jeecms上传文件限制导致413-Request Entity Too Large

    1:spring mvc 上传限制大小  配置是否允许在上传文件的大小 <bean id="multipartResolver" class="org.spring ...

  10. sqlserver 2008连接

    初次安装使用SQL server 2008时,可能会遇到无法连接到(local)的情况.那么,如何解决此问题?   工具/原料   SQL server 2008 方法/步骤   1 打开SQL se ...