安装WebMagic
us.codecraft
webmagic-core
0.7.3
us.codecraft
webmagic-extension
0.7.3
编写TestProcessor定制爬虫逻辑
package test.webmagic.com.test;
import us.codecraft.webmagic.Page;
import us.codecraft.webmagic.Site;
import us.codecraft.webmagic.Spider;
import us.codecraft.webmagic.processor.PageProcessor;
import java.util.ArrayList;
import java.util.List;
/**
* @title: TestProcessor
* @package test.webmagic.com.test
* @author: 彬
* @date: 2020/7/27
* @version: v1.0
* @description:
*/
public class TestProcessor implements PageProcessor{
private Site site = Site.me().setRetryTimes(3).setSleepTime(100);
@Override
public void process(Page page) {
// 创建list存储爬虫爬取的数据
List list = new ArrayList<>();
// 获取列表长度
//*[@id="pjax"]/div[3]/div/article[@class=item] 获取div下article标签中所有class为item的数据
int size = page.getHtml().xpath("//*[@id=\"pjax\"]/div[3]/div/article[@class=item]").all().size();
for (int i = 1; i <= size; i++) {
// 爬取文章标题
//*[@id=\"pjax\"]/div[3]/div/article["+i+"]/h2/a/text() 获取article标签中的h2标签下的a标签中的文本内容
String s = page.getHtml().xpath("//*[@id=\"pjax\"]/div[3]/div/article["+i+"]/h2/a/text()").toString();
// 存储文章标题
list.add(s);
}
System.out.println("------------------------------------------------------------------");
// 设置存储key名称将爬取到的数据放入
page.putField("list",list);
// 设置继续爬取下一页
//*[@id="pjax"]/div[3]/div/nav/a[11]/@href 获取下一页按钮中的a标签的链接
page.addTargetRequests(page.getHtml().xpath("//*[@id=\"pjax\"]/div[3]/div/nav/a[11]/@href").all());
}
@Override
public Site getSite() {
return site;
}
public static void main(String[] args) {
// 创建爬虫
Spider.create(new TestProcessor())
// 设置需要爬取的url
.addUrl("https://88250.b3log.org/?utm_source=hacpai.com")
// 设置使用定制的Pipeline对爬取到的数据进行保存或其他处理
.addPipeline(new TestPipeline())
// 开启5个线程抓取
.thread(5)
.run();
}
}
编写TestPipeline定制抽取的结果处理类
package test.webmagic.com.test;
import us.codecraft.webmagic.ResultItems;
import us.codecraft.webmagic.Task;
import us.codecraft.webmagic.pipeline.Pipeline;
import java.util.List;
/**
* @title: TestPipeline
* @package test.webmagic.com.test
* @author: 彬
* @date: 2020/7/27
* @version: v1.0
* @description:
*/
public class TestPipeline implements Pipeline {
@Override
public void process(ResultItems resultItems, Task task) {
// 取出TestProcessor中保存的文章标题list
List list = resultItems.get("list");
for (String s : list) {
// 打印
System.out.println(s);
}
System.out.println("------------一页的文章的所有标题------------");
}
}
启动看看效果
第一页标题
第二页标题