获取网页源码
程序入口Spider
Spider 一般写在Main方法里
它可以设置爬虫的配置,包括编码、抓取间隔、超时时间、重试次数等,也包括一些模拟的参数,例如User Agent、cookie,以及代理的设置
public static void main(String[] args) {
//创建爬虫解析页面
PageProcessor pageProcessor = new FirstWebmagic();
//创建爬虫
Spider spider = Spider.create(pageProcessor);
//给爬虫添加爬取地址
spider.addUrl("https://xiaoshuai.blog.csdn.net/");
//启动一个线程
spider.thread(1);
//启动爬虫
spider.run();
}
同时Spider的其他组件(Downloader、Scheduler、Pipeline)都可以通过set方法来进行设置。
方法 | 说明 | 示例 |
---|---|---|
create(PageProcessor) | 创建Spider | Spider.create(new GithubRepoProcessor()) |
addUrl(String…) | 添加初始的URL | spider .addUrl(“http://webmagic.io/docs/”) |
addRequest(Request…) | 添加初始的Request | spider .addRequest(“http://webmagic.io/docs/”) |
thread(n) | 开启n个线程 | spider.thread(5) |
run() | 启动,会阻塞当前线程执行 | spider.run() |
start()/runAsync() | 异步启动,当前线程继续执行 | spider.start() |
stop() | 停止爬虫 | spider.stop() |
test(String) | 抓取一个页面进行测试 | spider .test(“http://webmagic.io/docs/”) |
addPipeline(Pipeline) | 添加一个Pipeline,一个Spider可以有多个Pipeline | spider .addPipeline(new ConsolePipeline()) |
setScheduler(Scheduler) | 设置Scheduler,一个Spider只能有个一个Scheduler | spider.setScheduler(new RedisScheduler()) |
setDownloader(Downloader) | 设置Downloader,一个Spider只能有个一个Downloader | spider .setDownloader(new SeleniumDownloader()) |
get(String) | 同步调用,并直接取得结果 | ResultItems result = spider .get(“http://webmagic.io/docs/”) |
getAll(String…) | 同步调用,并直接取得一堆结果 | List results = spider .getAll(“http://webmagic.io/docs/”, “http://webmagic.io/xxx”) |
编写PageProcessor
在WebMagic里,实现一个基本的爬虫只需要编写一个类,实现PageProcessor接口即可。这个类基本上包含了抓取一个网站,你需要写的所有代码。
下面来看一下这个接口里面有什么
/** 负责解析页面,抽取有用信息,以及发现新的链接 **/
public interface PageProcessor {
/**
* 处理页面,提取要提取的 URL,提取数据和存储
*
* @param Page page 页面信息
*/
public void process(Page page);
/**
* 获取设置信息
*
* @return site
* @see Site
*/
public Site getSite();
}
Site 配置信息
对站点本身的一些配置信息,例如编码、HTTP头、超时时间、重试策略等、代理等,都可以通过设置Site对象来进行配置。
@Override
public Site getSite() {
Site site = Site.me();//创建Site
site.setTimeOut(1000);//设置超时
site.setRetryTimes(3);//设置重试次数
return site;
}
方法 | 说明 | 示例 |
---|---|---|
setCharset(String) | 设置编码 | site.setCharset(“utf-8”) |
setUserAgent(String) | 设置UserAgent | site.setUserAgent(“Spider”) |
setTimeOut(int) | 设置超时时间,单位是毫秒 | site.setTimeOut(3000) |
setRetryTimes(int) | 设置重试次数 | site.setRetryTimes(3) |
setCycleRetryTimes(int) | 设置循环重试次数 | site.setCycleRetryTimes(3) |
addCookie(String,String) | 添加一条cookie | site.addCookie(“dotcomt_user”,“code4craft”) |
setDomain(String) | 设置域名,需设置域名后,addCookie才可生效 | site.setDomain(“github.com”) |
addHeader(String,String) | 添加一条addHeader | site.addHeader(“Referer”,“https://github.com”) |
setHttpProxy(HttpHost) | 设置Http代理 | site.setHttpProxy(new HttpHost(“127.0.0.1”,8080)) |
process 页面处理
process是定制爬虫逻辑的核心接口,在这里编写抽取逻辑
所有抓取的信息都在这里
我们可以根据需要获取想要的结果
@Override
public void process(Page page) {
//抓取到的页面为一个page对象
Html html = page.getHtml();//我们从page里面获取Html信息
System.out.println(html);//然后一个html源代码就输出到控制台了
}
一个完整的代码示例
import us.codecraft.webmagic.Page;
import us.codecraft.webmagic.Site;
import us.codecraft.webmagic.Spider;
import us.codecraft.webmagic.processor.PageProcessor;
import us.codecraft.webmagic.selector.Html;
public class FirstWebmagic implements PageProcessor {
@Override
public void process(Page page) {
//抓取到的页面为一个page对象
Html html = page.getHtml();//我们从page里面获取Html信息
System.out.println(html);//然后一个html源代码就输出到控制台了
}
@Override
public Site getSite() {
Site site = Site.me();//创建Site
site.setTimeOut(1000);//设置超时
site.setRetryTimes(3);//设置重试次数
return site;
}
public static void main(String[] args) {
//创建爬虫解析页面
PageProcessor pageProcessor = new FirstWebmagic();
//创建爬虫
Spider spider = Spider.create(pageProcessor);
//给爬虫添加爬取地址
spider.addUrl("https://xiaoshuai.blog.csdn.net/");
//启动一个线程
spider.thread(1);
//启动爬虫
spider.run();
}
}