2021SC@SDUSC
下面通过实例,边实战边说明Gecco的用法。
爬取思路
首先明确爬取的种子网站:http://news.iresearch.cn/
编写爬虫启动入口
我新建的是maven项目,所以要使用Gecco,第一步是添加maven依赖
<dependency>
<groupId>com.geccocrawler</groupId>
<artifactId>gecco</artifactId>
<version>1.0.8</version>
</dependency>
然后编写一个main函数作为爬虫的入口
public class Main {
public static void main(String[] rags) {
System.out.println("=======start========");
HttpGetRequest startUrl = new HttpGetRequest("http://news.iresearch.cn/");
startUrl.setCharset("GBK");
GeccoEngine.create()
//Gecco搜索的包路径
.classpath("com.crawler.gecco")
//开始抓取的页面地址
.start(startUrl)
//开启几个爬虫线程
.thread(1)
//单个爬虫每次抓取完一个请求后的间隔时间
.interval(2000)
.run();
}
}
HttpGetRequest用于包裹种子网站,同时可以设置编码,这里设置的是“GBK”(一开始当时没有设置该参数时,爬出的文本都是乱码的)
classpath是一个扫描路径,类似于Spring中的component-scan,用于扫描注解的类。这里主要用于扫描注解“@Gecco”所在的类。
解析获取所有子分类
package com.crawler.gecco;
import com.geccocrawler.gecco.annotation.Gecco;
import com.geccocrawler.gecco.annotation.HtmlField;
import com.geccocrawler.gecco.annotation.Request;
import com.geccocrawler.gecco.request.HttpRequest;
import com.geccocrawler.gecco.spider.HtmlBean;
import java.util.List;
/**
* Created by jackie on 18/1/15.
*/
@Gecco(matchUrl="http://news.iresearch.cn/", pipelines={"consolePipeline", "allSortPipeline"})
public class AllSort implements HtmlBean {
private static final long serialVersionUID = 665662335318691818L;
@Request
private HttpRequest request;
// 移动互联网
@HtmlField(cssPath="#tab-list > div:nth-child(1)")
private List<Category> mobileInternet;
// 电子商务
@HtmlField(cssPath="#tab-list > div:nth-child(2)")
private List<Category> electric;
// 互联网
@HtmlField(cssPath="#tab-list > div:nth-child(3)")
private List<Category> internet;
// 网络营销
@HtmlField(cssPath="#tab-list > div:nth-child(4)")
private List<Category> netMarket;
// 网络游戏
@HtmlField(cssPath="#tab-list > div:nth-child(5)")
private List<Category> netGame;
public List<Category> getMobileInternet() {
return mobileInternet;
}
public void setMobileInternet(List<Category> mobileInternet) {
this.mobileInternet = mobileInternet;
}
public List<Category> getElectric() {
return electric;
}
public void setElectric(List<Category> electric) {
this.electric = electric;
}
public List<Category> getInternet() {
return internet;
}
public void setInternet(List<Category> internet) {
this.internet = internet;
}
public List<Category> getNetMarket() {
return netMarket;
}
public void setNetMarket(List<Category> netMarket) {
this.netMarket = netMarket;
}
public List<Category> getNetGame() {
return netGame;
}
public void setNetGame(List<Category> netGame) {
this.netGame = netGame;
}
public HttpRequest getRequest() {
return request;
}
public void setRequest(HttpRequest request) {
this.request = request;
}
}
虽然代码很长,但是除去set和get方法,剩下的就是获取子分类标签的代码
注解@Gecco告知该爬虫匹配的url格式(matchUrl)和内容抽取后的bean处理类(pipelines处理类采用管道过滤器模式,可以定义多个处理类),这里matchUrl就是http://news.iresearch.cn/,意为从这个网址对应的页面中解析
这里pipelines参数可以添加多个管道处理类,意为下一步该执行哪些管道类,需要说明的是consolePipeline,是专门将过程信息输出到控制台的管道类,后面会说明
注解@HtmlField表示抽取html中的元素,cssPath采用类似jquery的css selector选取元素