WebMagic总体架构图如下:
项目结构图
配置文件
-
pom.xml
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.xiaoge</groupId> <artifactId>xiaoge-crawler-webmagic</artifactId> <version>1.0-SNAPSHOT</version> <dependencies> <!-- webmagic 核心包 --> <!-- https://mvnrepository.com/artifact/us.codecraft/webmagic-core --> <dependency> <groupId>us.codecraft</groupId> <artifactId>webmagic-core</artifactId> <version>0.7.3</version> </dependency> <!-- webmagic 扩展包 --> <!-- https://mvnrepository.com/artifact/us.codecraft/webmagic-extension --> <dependency> <groupId>us.codecraft</groupId> <artifactId>webmagic-extension</artifactId> <version>0.7.3</version> </dependency> </dependencies> </project>
-
log4j.properties
log4j.rootLogger=INFO,A1 log4j.appender.A1=org.apache.log4j.ConsoleAppender log4j.appender.A1.layout=org.apache.log4j.PatternLayout log4j.appender.A1.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss,SSS} [%t] [%c]-[%p] %m%n
实现类
-
JobProcessor
package com.xiaoge.webmagic.test; import us.codecraft.webmagic.Page; import us.codecraft.webmagic.Site; import us.codecraft.webmagic.Spider; import us.codecraft.webmagic.pipeline.FilePipeline; import us.codecraft.webmagic.processor.PageProcessor; /** * @Author: 潇哥 * @DateTime: 2020/10/2 下午10:14 * @Description: TODO */ public class JobProcessor implements PageProcessor { /** * 负责解析页面, 抽取元素/获取链接 * @param page page */ public void process(Page page) { /* 解析元素 */ // 解析返回的数据page, 并且把解析的结果放到ResultItems中 // css选择器 page.putField("a", page.getHtml().css("a[rel=nofollow]").all()); // XPath page.putField("a2", page.getHtml().xpath("//a[@rel=nofollow]")); // 正则表达式 page.putField("a3", page.getHtml().css("a[rel=nofollow]").regex(".*我们.*").all()); /* 处理结果的api */ // get/toString都是处理结果的第一条 page.putField("a4", page.getHtml().css("a[rel=nofollow]").regex(".*我们.*").get()); page.putField("a5", page.getHtml().css("a[rel=nofollow]").regex(".*我们.*").toString()); // 获取所有数据 page.putField("a6", page.getHtml().css("a[rel=nofollow]").regex(".*我们.*").all()); /* 获取链接 page.addTargetRequests抓取page.getHtml().css("a[rel=nofollow]").links().all()获取的所有链接网址 */ page.addTargetRequests(page.getHtml().css("a[rel=nofollow]").links().all()); page.putField("url", page.getHtml().css(".title").all()); } /** * 配置 */ // Site是爬虫的配置, Site.me()可以对爬虫进行一些配置 private Site site = Site.me() .setCharset("utf8") // 设置编码 .setTimeOut(10000) // 设置超时时间 单位/毫秒 .setRetrySleepTime(3000) // 设置重试的间隔时间 单位/毫秒 .setSleepTime(3) // 设置重试次数 ; public Site getSite() { return site; } /** * 启动与设置Pipeline保存数据的方式 * @param args */ // 主函数, 执行爬虫, 不写输出到哪里(默认输出到控制台) public static void main(String[] args) { // 创建解析器(这个解析器是自己写的解析器) Spider.create(new JobProcessor()) // 设置爬取数据的页面 .addUrl("https://plus.jd.com/index?flow_system=appicon&flow_entrance=appicon11&flow_channel=pc") // 以文件的形式输出, 没设置默认使用内置的控制台pipeline输出到控制台 .addPipeline(new FilePipeline("/Users/xiaoge/Desktop/result")) // 设置5条线程做处理 .thread(5) // 执行爬虫 .run(); } }