WebMagic-入门

WebMagic

介绍

WebMagic 是一个简单灵活的 Java 爬虫框架,基于流行的爬虫工具 Scrapy 的设计思想实现。它提供了爬虫开发的核心功能,并遵循”微内核+插件”的设计模式,使得开发者可以灵活扩展功能。

主要特点

  1. 简单易用:提供简洁的 API,只需少量代码即可实现一个功能强大的爬虫
  2. 模块化设计:核心框架小,通过扩展机制满足不同需求
  3. 强大的抽取功能:支持 XPath、正则表达式等多种方式提取数据
  4. 多线程支持:内置多线程支持,提高爬取效率
  5. 可扩展性:可以方便地扩展和定制各个组件

底层原理

HttpClient+Jsoup

在爬虫应用中,HttpClient和Jsoup通常协同工作:

  1. HttpClient负责网络通信层:发送HTTP请求、接收响应、处理重定向/认证等
  2. Jsoup负责内容解析层:将获取的HTML转换为DOM树,提供便捷的数据提取API
  3. 这种分层设计符合单一职责原则,使爬虫程序结构更清晰

WebMagic的执行过程

image-20250526150555062

代码案例

1.创建一个Maven项目,引入依赖

1
2
3
4
5
6
7
8
9
10
11
<dependency>
<groupId>us.codecraft</groupId>
<artifactId>webmagic-core</artifactId>
<version>1.0.3</version>
</dependency>

<dependency>
<groupId>us.codecraft</groupId>
<artifactId>webmagic-extension</artifactId>
<version>1.0.3</version>
</dependency>

2.重写PageProcessor接口,爬去csdn主页的数据信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
package com.luochen.processer;

import us.codecraft.webmagic.Page;
import us.codecraft.webmagic.Site;
import us.codecraft.webmagic.Spider;
import us.codecraft.webmagic.processor.PageProcessor;

public class MyPageProcesser implements PageProcessor {

/*
* 处理解析页面
* */
@Override
public void process(Page page) {
System.out.println(page.getHtml().toString());
}
/*
* 站点处理:超时的时间,重试的次数
* */
@Override
public Site getSite() {
return Site.me()
.setSleepTime(300)//爬虫休息时间,ms
.setTimeOut(3000)//设置超时时间
.setRetryTimes(3); //设置重试次数
}

public static void main(String[] args) {
Spider.create(new MyPageProcesser())
.addUrl("https://www.csdn.net") //加入爬取链接
.start(); //开始爬虫
}
}

运行输出结果如下:
image-20250526155359357

获取爬虫数据

xpath

XPath(XML Path Language)是一种用于在XML和HTML文档中定位和选择节点的查询语言。它提供了一种在文档层次结构中导航的方式,类似于文件系统中的路径。

案例分析

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<html>
<body>
<div id="content">
<h1>Welcome</h1>
<div class="articles">
<article class="post">
<h2>Article 1</h2>
<p>Content 1</p>
<a href="/read-more/1">Read more</a>
</article>
<article class="post">
<h2>Article 2</h2>
<p>Content 2</p>
<a href="/read-more/2">Read more</a>
</article>
</div>
</div>
</body>
</html>

示例1:获取所有文章标题

1
//article/h2/text()

结果:

  • “Article 1”
  • “Article 2”

示例2:获取第二篇文章的链接

xpath

1
(//article)[2]/a/@href

结果:

  • “/read-more/2”

示例3:获取包含”Content”文本的段落

xpath

1
//p[contains(text(), 'Content')]
注意:xpath的表达式看懂即可,不需要硬记,可通过粘贴复制的方式,如csdn官网,直接复制:

image-20250526181335338

采集爬虫内容

上述粘贴的内容为://*[@id="app"]/div/div/aside/div/div[2]/div[1]/div/div[1]/div[1]/div[2]/div/a/div/div[2]/

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
package com.luochen.processer;

import us.codecraft.webmagic.Page;
import us.codecraft.webmagic.Site;
import us.codecraft.webmagic.Spider;
import us.codecraft.webmagic.processor.PageProcessor;

public class MyPageProcesser implements PageProcessor {

/*
* 处理解析页面
* */
@Override
public void process(Page page) {
System.out.println(page.getHtml().xpath("//*[@id=\"app\"]/div/div/aside/div/div[2]/div[1]/div/div[1]/div[1]/div[2]/div/a/div/div[2]/text()").toString());
}
/*
* 站点处理:超时的时间,重试的次数
* */
@Override
public Site getSite() {
return Site.me()
.setSleepTime(300)//爬虫休息时间,ms
.setTimeOut(3000)//设置超时时间
.setRetryTimes(3); //设置重试次数
}

public static void main(String[] args) {
Spider.create(new MyPageProcesser())
.addUrl("https://www.csdn.net") //加入爬取链接
.run(); //开始爬虫
}
}

实际输出结果:
image-20250526182227686