技术栈爬虫WebMagic-入门
Luo ChenWebMagic
介绍
WebMagic 是一个简单灵活的 Java 爬虫框架,基于流行的爬虫工具 Scrapy 的设计思想实现。它提供了爬虫开发的核心功能,并遵循”微内核+插件”的设计模式,使得开发者可以灵活扩展功能。
主要特点
- 简单易用:提供简洁的 API,只需少量代码即可实现一个功能强大的爬虫
- 模块化设计:核心框架小,通过扩展机制满足不同需求
- 强大的抽取功能:支持 XPath、正则表达式等多种方式提取数据
- 多线程支持:内置多线程支持,提高爬取效率
- 可扩展性:可以方便地扩展和定制各个组件
底层原理
HttpClient+Jsoup
在爬虫应用中,HttpClient和Jsoup通常协同工作:
- HttpClient负责网络通信层:发送HTTP请求、接收响应、处理重定向/认证等
- Jsoup负责内容解析层:将获取的HTML转换为DOM树,提供便捷的数据提取API
- 这种分层设计符合单一职责原则,使爬虫程序结构更清晰
WebMagic的执行过程

代码案例
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) .setTimeOut(3000) .setRetryTimes(3); }
public static void main(String[] args) { Spider.create(new MyPageProcesser()) .addUrl("https://www.csdn.net") .start(); } }
|
运行输出结果如下:

获取爬虫数据
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:获取所有文章标题
结果:
示例2:获取第二篇文章的链接
xpath
结果:
示例3:获取包含”Content”文本的段落
xpath
1
| //p[contains(text(), 'Content')]
|
注意:xpath的表达式看懂即可,不需要硬记,可通过粘贴复制的方式,如csdn官网,直接复制:

采集爬虫内容
上述粘贴的内容为://*[@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) .setTimeOut(3000) .setRetryTimes(3); }
public static void main(String[] args) { Spider.create(new MyPageProcesser()) .addUrl("https://www.csdn.net") .run(); } }
|
实际输出结果:
