做项目需要爬取一些数据,不想用Python,就尝试了下webmagic这个爬虫框架,总的来说上手还是比较简单的,这里来总结一下.
webmagic是一个简单灵活的Java爬虫框架,如果你熟悉Java而且不想用Python写爬虫,那么webmagic是一个不错的选择.
好了,终于来到了爬取阶段,以爬取题库网为例:
package com.xiaokangchen.spider.service;
import us.codecraft.webmagic.Page;
import us.codecraft.webmagic.Site;
import us.codecraft.webmagic.Spider;
import us.codecraft.webmagic.processor.PageProcessor;
/*1.实现PageProcessor接口*/
public class QuesPageProcess implements PageProcessor{
/*2.设置抓取网站的相关配置*/
private Site site = Site.me().setRetryTimes(3).setSleepTime(1000).setTimeOut(10000);
@Override
public Site getSite() {
// TODO Auto-generated method stub
/*3.返回site*/
return site;
}
/*5.爬取逻辑*/
@Override
public void process(Page page) {
// TODO Auto-generated method stub
page.putField("html", page.getHtml());
String pageHtml = page.getResultItems().get("html").toString();
System.err.println(pageHtml);
}
/*4.爬取*/
public static void main(String[] args) {
/*添加爬取的url链接,开启5个线程爬取*/
Spider spider = Spider.create(new QuesPageProcess())
.addUrl("http://www.tiku.com/testPaper.html?sct=0&cn=%E6%95%B0%E5%AD%A6&st=2&cid=500004&bid=800009&vid=800005&uid=800003&cptid=700005&kid=700124&qtid=600050&difficulty=&sort=0")
.thread(5);
/*爬虫启动*/
spider.run();
}
}
1. 首先我们需要实现PageProcessor接口,实现getSite()方法和process()方法.
2. 设置抓取的相关的配置Site,比如重试次数、抓取间隔等。如果出现看不懂、记不住等疑难杂症,直接先设置成和我的一样就可以了,等以后写的多了自然懂了(逃
3. 把刚刚设置的site返回.
4. 在main()方法中调用Spider的一个静态方法static Spider create(PageProcessor pageProcessor)方法来创建一条爬虫,并且添加Url链接,开启五个线程,最后用run()方法启动.
这里还可以设置下载调度器(Scheduler)像FileCacheQueueScheduler缓存爬取到的url和已经爬取的位置来实现程序中断后继续从当前位置爬取,也可以设置RedisScheduler使用Redis来实现多机器分布式爬取.
至于为什么run()方法单独用spider去调用,以及为啥还搞个Spider spider = ,不直接写
Spider.create(new QuesPageProcess())
.addUrl("http://www.tiku.com/testPaper.html?sct=0&cn=%E6%95%B0%E5%AD%A6&st=2&cid=500004&bid=800009&vid=800005&uid=800003&cptid=700005&kid=700124&qtid=600050&difficulty=&sort=0")
.thread(5).run();
因为我们可以在这里调用监控器来监控爬取的情况,下一节我们会将监控器加入进来.
5.爬取逻辑,也是核心部分,在这里我们将提取页面中的元素、属性、url,以及添加后续要爬取的url,也就是我们在这里获取页面中我们想要的哪些数据,这里我们简单地写一个
page.putField("html", page.getHtml());
这句代码的意思是获取整个页面的Html代码,并且将其存到LinkedHashMap中,大家学过Map集合的话都应该知道键值对,不知道也没有关系,第一个”html”是键,第二个page.getHtml()是值,我们通过键可以获取到值.
然后我们用
String pageHtml = page.getResultItems().get("html").toString();
来获取刚才的值,这是页面的全部Html代码,咱们用System.err.out()打印一下刚才的页面。大家会发现控制台中打印了一次红色的Html代码。红色的便是我们输出的pageString。这样,咱们就获取到了页面的源码,之后我们来讲解如何获取后续url实现自动爬取,从上次中断的地方继续爬取,以及抽取网页中我们需要的数据.
文档:http://webmagic.io/docs/zh/