使用 | Java使用WebMagic 爬取网站
小小又开始学习了,这次跟着项目学习着,需要使用一个相关的爬虫,这里使用的是webmagic作为网站的爬虫。
安装
这里使用maven进行安装。
根据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>
Hello World
几乎所有的api的学习,都是从hello world开始的,webmagic也不例外,使用的同样也是hello world案例。
以爬取sina博文为例。
复制以下代码
package com.example.demo; import us.codecraft.webmagic.Page; import us.codecraft.webmagic.Site; import us.codecraft.webmagic.Spider; import us.codecraft.webmagic.processor.PageProcessor; public class SinaBlogProcessor implements PageProcessor { public static final String URL_LIST = "http://blog\\.sina\\.com\\.cn/s/articlelist_1487828712_0_\\d+\\.html"; public static final String URL_POST = "http://blog\\.sina\\.com\\.cn/s/blog_\\w+\\.html"; private Site site = Site .me() .setDomain("blog.sina.com.cn") .setSleepTime(3000) .setUserAgent( "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_2) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.65 Safari/537.31"); @Override public void process(Page page) { //列表页 if (page.getUrl().regex(URL_LIST).match()) { page.addTargetRequests(page.getHtml().xpath("//div[@class=\"articleList\"]").links().regex(URL_POST).all()); page.addTargetRequests(page.getHtml().links().regex(URL_LIST).all()); //文章页 } else { page.putField("title", page.getHtml().xpath("//div[@class='articalTitle']/h2")); page.putField("content", page.getHtml().xpath("//div[@id='articlebody']//div[@class='articalContent']")); page.putField("date", page.getHtml().xpath("//div[@id='articlebody']//span[@class='time SG_txtc']").regex("\\((.*)\\)")); } } @Override public Site getSite() { return site; } public static void main(String[] args) { Spider.create(new SinaBlogProcessor()).addUrl("http://blog.sina.com.cn/s/articlelist_1487828712_0_1.html") .run(); } }
查看相关运行结果
这里就等于说已经运行成功,爬取到了一些数据
PageProcessor
这里用于实现相关的配置。
代码如下
public class GithubRepoPageProcessor implements PageProcessor { // 部分一:抓取网站的相关配置,包括编码、抓取间隔、重试次数等 private Site site = Site.me().setRetryTimes(3).setSleepTime(1000); @Override // process是定制爬虫逻辑的核心接口,在这里编写抽取逻辑 public void process(Page page) { // 部分二:定义如何抽取页面信息,并保存下来 page.putField("author", page.getUrl().regex("https://github\\.com/(\\w+)/.*").toString()); page.putField("name", page.getHtml().xpath("//h1[@class='entry-title public']/strong/a/text()").toString()); if (page.getResultItems().get("name") == null) { //skip this page page.setSkip(true); } page.putField("readme", page.getHtml().xpath("//div[@id='readme']/tidyText()")); // 部分三:从页面发现后续的url地址来抓取 page.addTargetRequests(page.getHtml().links().regex("(https://github\\.com/[\\w\\-]+/[\\w\\-]+)").all()); } @Override public Site getSite() { return site; } public static void main(String[] args) { Spider.create(new GithubRepoPageProcessor()) //从"https://github.com/code4craft"开始抓 .addUrl("https://github.com/code4craft") //开启5个线程抓取 .thread(5) //启动爬虫 .run(); } }
抽取元素
这里使用相关的方法抽取元素。
这里使用相关的方法抽取相关的元素 List<String> urls = page.getHtml().css("div.pagination").links().regex(".*/search/\?l=java.*").all();
保存结果
这里保存结果使用Pipeline方法
public static void main(String[] args) { Spider.create(new GithubRepoPageProcessor()) //从"https://github.com/code4craft"开始抓 .addUrl("https://github.com/code4craft") .addPipeline(new JsonFilePipeline("D:\\webmagic\\")) //开启5个线程抓取 .thread(5) //启动爬虫 .run(); }
实际案例
这里以 http://blog.sina.com.cn/flashsword20 作为例子,在这个例子里,要从最终的博客文章页面,抓取博客的标题,内容,和日期。
列表页
列表页的格式为 http://blog.sina.com.cn/s/articlelist_1487828712_0_1.html 这里0和1都是可变的页数。
文章页
文章页的格式是,http://blog.sina.com.cn/s/blog_58ae76e80100g8au.html 这里,最后一段是可变的字符串,为文章的id
进行正则匹配
这里用两个正则进行匹配。
这里用,xpath//div[@class=\"articleList\"] 进行相关的匹配,
所以,可以这样进行匹配
page.addTargetRequests(page.getHtml().xpath("//div[@class=\"articleList\"]").links().regex("http://blog\\.sina\\.com\\.cn/s/blog_\\w+\\.html").all());
page.addTargetRequests(page.getHtml().links().regex("http://blog\\.sina\\.com\\.cn/s/articlelist_1487828712_0_\\d+\\.html").all());
内容的添加
这里再进行一次内容的添加
page.putField("title", page.getHtml().xpath("//div[@class='articalTitle']/h2")); page.putField("content", page.getHtml().xpath("//div[@id='articlebody']//div[@class='articalContent']")); page.putField("date", page.getHtml().xpath("//div[@id='articlebody']//span[@class='time SG_txtc']").regex("\\((.*)\\)"));
区分列表和目标页
这里,进行区分列表页,和目标页。
//列表页 if (page.getUrl().regex(URL_LIST).match()) { page.addTargetRequests(page.getHtml().xpath("//div[@class=\"articleList\"]").links().regex(URL_POST).all()); page.addTargetRequests(page.getHtml().links().regex(URL_LIST).all()); //文章页 } else { page.putField("title", page.getHtml().xpath("//div[@class='articalTitle']/h2")); page.putField("content", page.getHtml().xpath("//div[@id='articlebody']//div[@class='articalContent']")); page.putField("date", page.getHtml().xpath("//div[@id='articlebody']//span[@class='time SG_txtc']").regex("\\((.*)\\)")); }
这样就完成了最基本例子的读取。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
1.2 了解MyBatis -《SSM深入解析与项目实战》
1.2 了解MyBatis -《SSM深入解析与项目实战》 声明 专栏链接:https://chenhx.blog.csdn.net/category_10263372.html 作者:谙忆 1.2 了解MyBatis MyBatis是一个基于Java的持久层开源框架。主要是将Java中的接口方法映射到执行对应的SQL语句,POJOs(Plain Old Java Objects,普通Java对象)映射成数据库中的记录。对于持久层,你可以简单地理解为将对象永久保存到数据库中,当然也可以理解为对于和数据库相关的所有操作。 1.2.1 MyBatis简介 MyBatis原名为iBatis,在2010年由Apache Software Foundation迁移到Google Code,并更名为MyBatis。特点如下: MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的持久层框架。 ...... 更多内容请查看: https://chenhx.blog.csdn.net/article/details/107797571
- 下一篇
2.1 类加载器、双亲委派模型 -《SSM深入解析与项目实战》
2.1 类加载器、双亲委派模型 -《SSM深入解析与项目实战》 @[TOC] 第2章 类加载器、反射和动态代理 上一章节中,对Spring、Spring MVC、MyBatis进行了一些简单的介绍,以及它们之间的分工合作。相信大家对于Spring、Spring MVC以及MyBatis以及没有那么陌生了。 本章将会对于类加载器、反射和动态代理进行详细的讲解。方便读者理解后面的章节。以及对于Maven的简单使用进行介绍和实例演示,本书中的绝大多数例子都会使用到Maven,所以学会使用Maven是必不可少的。 2.1 类加载器(ClassLoader) 类加载器(ClassLoader),即加载类文件的一个东西,或者说类。JVM可以加载本地文件、网络流或者其他来源的字节码文件(class文件)到内存中,并且针对字节码生成对应的Class对象,这就是类加载器的功能。 Java提供的类加载器一共有三种:Bootstrap类加载器(启动类加载器)、Extension类加载器(扩展类加载器)和System类加载器(也叫Application类加载器,应用类加载器/系统类加载器)。 启动类加载器(B...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Hadoop3单机部署,实现最简伪集群
- Eclipse初始化配置,告别卡顿、闪退、编译时间过长
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- Windows10,CentOS7,CentOS8安装Nodejs环境
- 设置Eclipse缩进为4个空格,增强代码规范
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- CentOS7设置SWAP分区,小内存服务器的救世主
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- Linux系统CentOS6、CentOS7手动修改IP地址
- Docker安装Oracle12C,快速搭建Oracle学习环境