发布于 

WebMagic的基础使用

官方中文文档:http://webmagic.io/

安装WebMagic

1
2
3
4
5
6
7
8
9
10
<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>

编写TestProcessor定制爬虫逻辑

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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
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<String> 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定制抽取的结果处理类

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
35
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<String> list = resultItems.get("list");
for (String s : list) {
// 打印
System.out.println(s);
}

System.out.println("------------一页的文章的所有标题------------");

}


}

启动看看效果

第一页标题

第二页标题


本站由 @binvv 使用 Stellar 主题创建。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。