继上一篇爬虫文章后,再用注解版来抓取点数据。
WebMagic爬数据(注解版本)官方资料:http://webmagic.io/docs/zh/posts/ch5-annotation/
一.目标页面(https://www.douban.com/doulist/3907668)
爬取豆瓣电影数据(电影名字,评分,导演信息,电影信息)界面如下图:
二. 注解版本源码分析
现在只爬取单个页面的电影数据,这里写死这个页面@TargetUrl(value = "(https://www.douban.com/doulist/3907668/)")
倘若要爬这个页面下的子页面的话,可以这样写@TargetUrl(value = "(https://www.douban.com/doulist/3907668/*)"),也可以用正则表达式。
主要逻辑代码如下:
package com.robinboot.service.WebMagic.Douban;
import com.robinboot.service.WebMagic.HttpClientDownloader;
import lombok.Data;
import org.springframework.beans.factory.annotation.Value;
import us.codecraft.webmagic.Site;
import us.codecraft.webmagic.model.ConsolePageModelPipeline;
import us.codecraft.webmagic.model.OOSpider;
import us.codecraft.webmagic.model.annotation.ExtractBy;
import us.codecraft.webmagic.model.annotation.TargetUrl;
import java.util.List;
/**
* @auther: TF12778
* @date: 2021/1/26 16:58
* @description: 注解版本
* 豆瓣电影 https://blog.csdn.net/weixin_42526141/article/details/83069599
*
* 参考:https://my.oschina.net/anxiaole/blog/755965
*/
@Data
@TargetUrl(value = "(https://www.douban.com/doulist/3907668/)")
public class DoubanModel {
@ExtractBy("//div[@class='title']/a/text()")
List<String> titles;
@ExtractBy("//div[@class='post']/a")
List<String> movieUrls;
@ExtractBy("//div[@class='rating']/span[@class='rating_nums']/text()")
List<String> ratings;
@ExtractBy("//div[@class='abstract']")
List<String> attrFields;
private static Site site = Site.me()
.setUserAgent("Mozilla/5.0 (Windows NT 10.0; WOW64; rv:56.0) Gecko/20100101 Firefox/56.0")
// .setRetryTimes(3)
.setSleepTime(3000);
public static void main(String[] args) {
OOSpider.create(site,
new DoubanPageModelPipeline()// ConsolePageModelPipeline 这里使用的Pipeline是打印到控制台。
, DoubanModel.class)
.setDownloader(new HttpClientDownloader())
.addUrl("https://www.douban.com/doulist/3907668/")
.thread(1)
.run();
}
}
爬取结果打印处理源码:
import lombok.extern.slf4j.Slf4j;
import us.codecraft.webmagic.Task;
import us.codecraft.webmagic.pipeline.PageModelPipeline;
/**
* @auther: TF12778
* @date: 2021/1/28 18:56
* @description:
*/
@Slf4j
public class DoubanPageModelPipeline implements PageModelPipeline<DoubanModel> {
@Override
public void process(DoubanModel doubanModel, Task task) {
log.info("doubanModel:", doubanModel);
}
}
三. 爬到的数据展示