Webcollector应用(一)

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

一、环境搭建

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

  https://github.com/CrawlScript/WebCollector

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

  

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

二、基本使用

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

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

 1 package cn.edu.hfut.dmic.webcollector.example.myCrawler.test;
 2
 3 public class TongModel {
 4     String fullName;
 5     String shortName;
 6     String time;
 7     public String getFullName() {
 8         return fullName;
 9     }
10
11     public void setFullName(String fullName) {
12         this.fullName = fullName;
13     }
14
15     public String getShortName() {
16         return shortName;
17     }
18
19     public void setShortName(String shortName) {
20         this.shortName = shortName;
21     }
22
23     public String getTime() {
24         return time;
25     }
26
27     public void setTime(String time) {
28         this.time = time;
29     }
30 }

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

 1 package cn.edu.hfut.dmic.webcollector.example.myCrawler.test;
 2 import cn.edu.hfut.dmic.webcollector.crawler.DeepCrawler;
 3 //import cn.edu.hfut.dmic.webcollector.example.util.ProxyCollector;
 4 import cn.edu.hfut.dmic.webcollector.example.util.JDBCBase;
 5 import cn.edu.hfut.dmic.webcollector.model.Links;
 6 import cn.edu.hfut.dmic.webcollector.model.Page;
 7 import cn.edu.hfut.dmic.webcollector.net.HttpRequesterImpl;
 8 import cn.edu.hfut.dmic.webcollector.net.RandomProxyGenerator;
 9 import org.jsoup.nodes.Document;
10 import org.jsoup.nodes.Element;
11 import org.jsoup.select.Elements;
12 import org.springframework.jdbc.core.JdbcTemplate;
13
14 import java.util.List;
15 public class CrawlTong  extends DeepCrawler{
16     JdbcTemplate jdbcTemplate = JDBCBase.getInstance().getTemplete2();
17     public CrawlTong(String crawlPath){
18         super(crawlPath);
19     }
20
21     @Override
22     public Links visitAndGetNextLinks(Page page) {
23         Document doc = page.getDoc();
24         boolean iRedirect = page.getResponse().getRedirect();
25         if(iRedirect)
26             return null;
27         TongModel tongModel = new TongModel();
28         Elements elementsAll = doc.getAllElements();
29         tongModel.setFullName(elementsAll.select("a.v3-branding_logo").text());
30         tongModel.setShortName(elementsAll.select("a.v3-branding_logo").attr("href"));
31         tongModel.setTime("2010-01-21");
32         saveToDB(tongModel);
33         return null;
34     }
35     public int saveToDB(TongModel m)
36     {
37         System.out.println(m.getFullName());
38         System.out.println(m.getShortName());
39         System.out.println(m.getTime());
40         String sql = "insert into tong(fullName,shortName,timer) values(?,?,?)";
41         int updates=jdbcTemplate.update(sql,m.getFullName(),m.getShortName(),m.getTime());
42         return 0;
43     }
44     public static void main(String[] args) throws Exception{
45         CrawlTong crawler = new CrawlTong("/tong");
46         crawler.addSeed("https://www.tzg.cn/");
47         crawler.start(1);
48     }
49
50 }

  继承自抓取父类,我采用的是继承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的形式对数据进行存储。

 1 package cn.edu.hfut.dmic.webcollector.example.myCrawler.test;
 2
 3 import cn.edu.hfut.dmic.webcollector.example.util.GenericDaoImpl;
 4
 5 import java.util.List;
 6
 7 public class DataVaryDao extends GenericDaoImpl<DataVaryModel,Long> {
 8
 9     public DataVaryDao(){super(DataVaryModel.class);}
10
11     public Long add(DataVaryModel model)
12     {
13         return insert(model);
14     }
15
16     public int updata(DataVaryModel model)
17     {
18         return this.update(model);
19     }
20
21     public List<DataVaryModel> getDataBySql(String sql, List<Object> values)
22     {
23         return this.selectBySqlList(sql, values);
24
25     }
26
27     @Override
28     public long getCountBySqlList(String sql, List<Object> values) {
29         return 0;
30     }
31 }

 1 dataList = dataDao.getDataBySql("select * from table where xmbm = ? and platform_id = ?", valueList);
 2             dataModelDB = dataList.get(0);
 3
 4             dataVaryModel=new DataVaryModel();
 5             dataVaryModel.setData_id(dataModelDB.getId());
 6             dataVaryModel.setKtje(ktje);
 7             dataVaryModel.setXmzt(xmzt);
 8             dataVaryModel.setTzrc(tzrc);
 9             dataVaryModel.setCreate_date(new Timestamp(new Date().getTime()));
10             dataVaryDao.add(dataVaryModel);

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

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

补充2:动态增加种子

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

1 Links links=new Links();
2 for(int i=0;i<length;i++){
3                 String temp=pre+elements1.get(i).attr("href");
4                 System.out.println(temp);
5                 System.out.println(elements1.get(i).text().trim());
6                 links.add(temp);
7             }
8
9 return links;

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

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

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

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

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

  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)内部机制的学习调用

时间: 2024-11-09 02:15:38

Webcollector应用(一)的相关文章

JAVA爬虫 WebCollector

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

用WebCollector 2.x爬取新浪微博(无需手动获取cookie)

用WebCollector 2.x 配合另一个项目WeiboHelper,就可以直接爬取新浪微博的数据(无需手动获取cookie) 1.导入WebCollector 2.x和WeiboHelper的所有jar包 两个项目的地址:http://git.oschina.net/webcollector/WebCollector http://git.oschina.net/webcollector/WeiboHelper 2.示例代码: package cn.edu.hfut.dmic.webcol

WebCollector提供免费代理

WebCollector论坛每10分钟,会推送可用代理,这些代理都是在推送前几分钟通过测试的代理. 爬虫使用最新的代理,可以大大减少自己清洗代理的时间. 代理推送地址: http://www.brieftools.info/bbs/index.php?c=thread&fid=12

WebCollector入门教程(中文版)

WebCollector入门教程 1.将WebCollector导入工程: 进入WebCollector主页:https://github.com/CrawlScript/WebCollector 下载:webcollector-版本号-bin.zip 将解压后文件夹中的所有jar包添加到工程既可. 2.用WebCollector爬取整个网站: 爬取新华网整站内容: public class Demo { public static void main(String[] args) throws

用WebCollector爬取网站的图片

用WebCollector爬取整站图片,只需要遍历整站页面,然后将URL为.jpg.gif的页面(文件)保存到本地即可. 例如我们爬取一个美食网站,获取里面所有的图片: import cn.edu.hfut.dmic.webcollector.crawler.BreadthCrawler; import cn.edu.hfut.dmic.webcollector.model.Page; import cn.edu.hfut.dmic.webcollector.util.FileUtils; im

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

最近在知乎上看到一个话题,说使用爬虫技术获取网易云音乐上的歌曲,甚至还包括付费的歌曲,哥瞬间心动了,这年头,好听的流行音乐或者经典老歌都开始收费了,只能听不能下载,着实很郁闷,现在机会来了,于是开始研究爬虫技术,翻阅各种资料,最终选择网友们一致认为比较好用的webcollector框架来实现. 首先,我们来认识一下webcollector,webcollector是一个无需配置,便于二次开发的爬虫框架,它提供精简的API,只需少量代码即可实现一个功能强大的爬虫,webcollector+hado

用WebCollector爬取新浪微博数据

用WebCollector可以轻松爬取新浪微博的数据. 首先需要一个能查看cookie的浏览器插件,推荐使用 firefox浏览器+firebug(插件). 具体步骤: 1.用浏览器打开 http://weibo.cn/pub/   这是新浪微博面对手机用户的一个入口.建议不要使用自己的账号来做爬虫.之所以选择weibo.cn来爬去,是因为这个手机版的限制较少,但是weibo.cn的账号密码都是以明文传输,所以为了防止盗号,建议新申请账号进行爬取. 2.登陆进去后,进入个人微博界面(不是http

JAVA爬虫Nutch、WebCollector的正则约束

爬虫爬取时,须要约束爬取的范围. 基本全部的爬虫都是通过正則表達式来完毕这个约束. 最简单的,正则: http://www.xinhuanet.com/.* 代表"http://www.xinhuanet.com/"后加随意个随意字符(能够是0个). 通过这个正则能够约束爬虫的爬取范围,可是这个正则并非表示爬取新华网全部的网页. 新华网并非仅仅有www.xinhuanet.com这一个域名,还有非常多子域名,类似:news.xinhuanet.com 这个时候我们须要定义这样一个正则:

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

目标:动态网页爬取 说明:这里的动态网页指几种可能:1)需要用户交互,如常见的登录操作:2)网页通过JS / AJAX动态生成,如一个html里有<div id="test"></div>,通过JS生成<div id="test"><span>aaa</span></div>. 这里用了WebCollector 2进行爬虫,这东东也方便,不过要支持动态关键还是要靠另外一个API -- selen