简介:本文全面解析WebMagic爬虫框架的核心功能、配置方法及实战技巧,涵盖基础使用、进阶配置、异常处理及性能优化,帮助开发者快速掌握分布式爬虫开发技能。
WebMagic是一款基于Java的轻量级爬虫框架,采用”垂直爬取+管道输出”的设计模式,通过模块化组件实现数据抓取、解析、存储的全流程管理。其核心优势在于:
@CrawlUrl、@ExtractBy等注解简化开发典型应用场景包括电商价格监控、新闻聚合、舆情分析等结构化数据采集需求。
<!-- Maven依赖配置 --><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>
public class GithubRepoPageProcessor implements PageProcessor {private Site site = Site.me().setRetryTimes(3).setSleepTime(1000).setTimeOut(10000);@Overridepublic void process(Page page) {// 1. 解析列表页List<String> repos = page.getHtml().xpath("//div[@class='repo-list']/div/h3/a/@href").all();// 2. 添加详情页URL到队列page.addTargetRequests(repos.stream().map(url -> "https://github.com" + url).collect(Collectors.toList()));// 3. 解析详情页数据if (page.getUrl().regex("https://github\\.com/\\w+/\\w+").match()) {String repoName = page.getHtml().xpath("//h1[@class='public']/text()").get();String starCount = page.getHtml().xpath("//span[@class='num text-emphasized']/text()").get();page.putField("repoName", repoName);page.putField("starCount", starCount.replace(",", ""));}}@Overridepublic Site getSite() {return site;}public static void main(String[] args) {Spider.create(new GithubRepoPageProcessor()).addUrl("https://github.com/trending").thread(5).run();}}
//div[@class='content']/text()格式定位元素$("#id .class")语法进行元素选择page.getUrl().regex()进行URL过滤
// 配置Redis分布式队列Spider.create(new MyPageProcessor()).setScheduler(new RedisScheduler("localhost")).thread(10).run();
public class MySqlPipeline implements Pipeline {@Overridepublic void process(ResultItems resultItems, Task task) {String repoName = resultItems.get("repoName");String starCount = resultItems.get("starCount");// JDBC操作存储到数据库}}// 注册PipelineSpider.create(new MyPageProcessor()).addPipeline(new MySqlPipeline()).run();
public class ProxyPageProcessor implements PageProcessor {private Site site = Site.me().setProxy(new HttpHost("127.0.0.1", 8888)) // 配置代理.setCycleRetryTimes(3); // 循环重试次数// ...其他实现}
site.setUserAgent("Mozilla/5.0")修改请求头site.setTimeOut(30000)参数PageProcessor的onResult方法进行人工干预Spider.create(...).setExitWhenComplete(false)查看实时日志
// 设置线程池大小Spider.create(new MyPageProcessor()).thread(20) // 建议不超过CPU核心数*2.run();
page.getHtml().xpath().get()替代多次解析page.getRawText()获取原始内容DuplicateRemover接口避免重复爬取PriorityScheduler设置URL优先级SpiderListener接口记录失败URLQ1:如何处理JavaScript渲染的页面?
A:可通过集成PhantomJS或Selenium实现动态渲染:
// 配置SeleniumDownloaderDownloader downloader = new SeleniumDownloader("path/to/chromedriver",new ChromeOptions().addArguments("--headless"));Spider.create(new MyPageProcessor()).setDownloader(downloader).run();
Q2:如何实现增量爬取?
A:通过LastModifiedFilter或自定义DuplicateRemover实现:
public class TimestampDuplicateRemover implements DuplicateRemover {private Set<String> urls = Collections.synchronizedSet(new HashSet<>());@Overridepublic boolean isDuplicate(Request request, Task task) {if (urls.contains(request.getUrl())) {return true;}// 添加时间戳判断逻辑urls.add(request.getUrl());return false;}}
Q3:如何应对反爬机制?
A:综合使用以下策略:
通过系统掌握上述内容,开发者可以高效构建稳定可靠的爬虫系统。建议从简单案例入手,逐步掌握分布式、反爬处理等高级特性,最终实现企业级爬虫解决方案。