本次案例主要是爬取豆瓣读书的标签列表以及每个标签下的书籍名称、对应的URL,然后输出到控制台。
1、引入webmagic的依赖
<!-- webmagic爬虫 -->
<dependency>
<groupId>us.codecraft</groupId>
<artifactId>webmagic-core</artifactId>
<version>0.7.3</version>
</dependency>
<dependency>
<groupId>us.codecraft</groupId>
<artifactId>webmagic-extension</artifactId>
<version>0.7.3</version>
</dependency>
2、编写爬虫类
public class WebMagicTest implements PageProcessor {
/**
* 利用正则表达式匹配标签下的书籍列表界面URL
* 例如:https://book.douban.com/tag/名著
*/
static String tagLinks="https://book.douban.com/tag/.*";
static Pattern tagLinksPattern=Pattern.compile(tagLinks);
//抓取网站的相关配置,包括编码、抓取间隔、重试次数等
private Site site = Site.me().setRetryTimes(3).setSleepTime(1000);
public static void main(String[] args) {
//启动爬虫
Spider.create(new WebMagicTest()).addUrl("https://book.douban.com/tag/?view=type")
.thread(1).run();
}
// process是定制爬虫逻辑的核心接口,在这里编写抽取逻辑
@Override
public void process(Page page) {
Html html=page.getHtml();
/**
*豆瓣读书标签列表页面
*在这个界面获取标签的URL,并加入爬取URL队列
*/
if (page.getUrl().toString().equals("https://book.douban.com/tag/?view=type")) {
String douban="https://book.douban.com/tag/";
//匹配<table class="tagCol">下的<tbody>标签下的<tr>标签下的<td>标签下的<a>中的内容
List<String> tags=html.xpath("//table[@class='tagCol']/tbody/tr/td/a/text()").all();
//补全URL,并加入爬去队列
for (String string : tags) {
page.addTargetRequest(douban+string);
}
}
/**
*豆瓣读书标签下的书籍列表界面
*输出标签名以及书籍信息
*/
else if(tagLinksPattern.matcher(page.getUrl().toString()).matches()) {
//获取标签名
String tag=html.xpath("//div[@id='content']/h1/text()").get();
String[] tagSplit=tag.split(" ");
//输出标签名
System.out.println("<----"+tagSplit[1]+"---->");
//获取书籍信息
List<String> circles=html.xpath("//li[@class='subject-item']/div[@class='info']/h2/a/text()").all();
List<String> circleUrls=html.xpath("//li[@class='subject-item']/div[@class='info']/h2/a/@href").all();
//输出书籍信息
for (int k=0;k<circles.size();k++) {
System.out.print("序号: "+(k+1)+" 书名:");
System.out.print(circles.get(k)+" 地址:");
System.out.print(circleUrls.get(k)+" ID:");
String[] ids=circleUrls.get(k).split("/");
System.out.println(ids[ids.length-1]);
}
//换行
System.out.println();
}
}
//返回抓取网站的相关配置
@Override
public Site getSite() {
return site;
}
}
3、控制台输出截图
这只是一个简单的例子,具体爬取数据需要分析html界面,从中获取我们想要的数据。