Java使用WebMagic 爬取网站

news/2024/5/10 0:58:57/文章来源:https://blog.csdn.net/qq_43623970/article/details/107913480

安装

这里使用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");@Overridepublic 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("\\((.*)\\)"));}}@Overridepublic 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();}
}

查看相关运行结果

img

这里就等于说已经运行成功,爬取到了一些数据

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 pagepage.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());}@Overridepublic 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("\\((.*)\\)"));
}

这样就完成了最基本例子的读取。

最后我把我收集的各大厂经典高频面试题和Java高级进阶、架构师视频教程送予大家。部分资料如下图所示:

获取地址:java进阶学习资料,面试题,电子书籍免费获取

img

img

img

img

img

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_850875.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

web网站加速之CDN(Content Delivery Network)技术原理

在不同地域的用户访问网站的响应速度存在差异,为了提高用户访问的响应速度、优化现有Internet中信息的流动,需要在用户和服务器间加入中间层CDN. 使用户能以最快的速度&#xff0c;从最接近用户的地方获得所需的信息&#xff0c;彻底解决网络拥塞&#xff0c;提高响应速度&…

pdf在线处理网站

sklearn实战-乳腺癌细胞数据挖掘&#xff08;博主亲自录制视频&#xff09; https://study.163.com/course/introduction.htm?courseId1005269003&utm_campaigncommission&utm_sourcecp-400000000398149&utm_mediumshare 转载于:https://www.cnblogs.com/webRobot…

手机wap网站建设的方法和技巧

随着互联网技术的不断进步&#xff0c;越来越多的运营商对于手机wap网站的建设有了更多的投入&#xff0c;手机wap网站的建设和开发要根据网站的特点和经营范围来进行设计和建设&#xff0c;这样才可以提升手机wap网站建设的效果。现在智能手机也基本都普及了&#xff0c;好多的…

Google官方建议:如何让网站在Goog…

自从去年9月谷歌浏览器发布以来&#xff0c;很多网站管理员和开发者纷纷向我们询问如何使自己的网站与谷歌浏览器更兼容。谷歌浏览器团队把这些问题作为很重要的借鉴和参考&#xff0c;这里我想向您提供一些小建议&#xff0c;让您的网站在谷歌浏览器里看起来更出色。 识别谷歌…

[慕课笔记] node+mongodb建站攻略

如何利用nodemongodb来快速搭建一个电影网站&#xff1f; 一&#xff1a;后端部分 整个网站的后端是由node.js来驱动的&#xff0c;所以在后端需要安装node.js,以及在这个基础之上的框架express&#xff0c;它能够帮助我快速的搭建web应用&#xff0c;然后数据库选用的mongodb&…

一步步教你为网站开发Android客户端

http://www.apkbus.com/forum.php?modviewthread&tid17712&extrapage%3D1 文章覆盖知识点&#xff1a;HttpWatch抓包&#xff0c;HttpClient模拟POST请求&#xff0c;Jsoup解析HTML代码&#xff0c;动态更新ListView背景介绍&#xff1a;客户端&#xff08;Client&…

如何让多个不同类型的后端网站用一个nginx进行反向代理实际场景分析

前段时间公司根据要求需要将聚石塔上服务器从杭州整体迁移到张家口&#xff0c;刚好趁这次机会将这些乱七八糟的服务器做一次梳理和整合&#xff0c;断断续续一个月迁移完 成大概优化掉了1/3的机器&#xff0c;完成之后遇到了一些问题&#xff0c;比如曾今零零散散部署在生产上…

色情网站的光棍节“福利”:加密式挂马玩转流氓推广

结语&#xff1a;攻击者对相关加密算法比较了解&#xff0c;选用了较为少见的Rabbit对称加密算法&#xff1b;攻击者具备一定的前端开发经验&#xff0c;代码容错性强&#xff0c;兼容性高了&#xff1b;后台不再是静态文件&#xff0c;而采用了动态生成内容&#xff0c;生成的…

docker搭建网站详细

远程连接centos7 这里我用的是xshell连接centos7 下载docker 这里我用的是阿里的Docker CE 镜像源站 这里我用的是centos7搭建的,如果是ubuntu的可以进上面那个网站上看 step 1: 安装必要的一些系统工具 sudo yum install -y yum-utils device-mapper-persistent-data lv…

GoDaddy网站程序根目录 网站文件上传到虚拟主机哪个目录

用的linux虚拟主机&#xff0c;网站根目录为public_html&#xff0c;(window主机的目录为httpdocs)我们需要把本地做好的网站上传到此目录下 cPanel控制面板 - 文件管理器 - public_html 转载于:https://www.cnblogs.com/bubuchu/p/10216970.html

论文网站及使用方法(ResearchGate、Sci-Hub等)

文章目录1 浏览器准备1.1 Microsoft Edge1.2 Google Chrome2论文网站2.1 ResearchGate2.2 SCI-HUB2.3 谷歌学术2.4谷粉学术3.数据网站3.1镝数聚3.2国泰安数据库1 浏览器准备 ✨ 这两个浏览器不是必需的&#xff0c;只是这两个浏览器适配大多数的网站&#xff0c;其中chrome已成…

大型网站技术架构:大型网站架构演化

这是《大型网站技术架构》的系列读书记录。 一&#xff0c;大型网站软件系统的特点 1&#xff0c;高并发&#xff0c; 大流量。 每秒7亿次请求&#xff0c;阿里新一代数据库如何支撑&#xff1f; PV&#xff08;Page View&#xff09;访问量&#xff0c;即页面浏览量或点击量…

vs2010里面 新建网站里面的 asp.net网站 和 新建项目里面的 asp.net Web应用程序 的区别(上)

http://www.cnblogs.com/iceicebaby/archive/2012/02/21/2361558.html 一&#xff1a;先来看看 新建网站 里面的 ASP.NET 网站的建立过程 我们采用 3层架构 如果我们想把整个项目放到 D:\web网站建设 这个文件夹来&#xff0c;那么我们建立Web层的时候&#xff0c;Web层的地…

vs2010里面 新建网站里面的 asp.net网站 和 新建项目里面的 asp.net Web应用程序 的区别 (下)

地址&#xff1a;http://www.cnblogs.com/iceicebaby/archive/2012/02/21/2361686.html 二&#xff1a;下面是 通过 新建项目 来创建 ASP.NET web 应用程序 下面我们创建 数据库DAL层 和 实体类层 Model 他会自动生成 DAL 文件夹 我们继续 Model 层。方法同上&#xff0c;就不…

部署网站出错,定义了重复的“entityFramework”节点

网站在本地运行正常&#xff0c;部署到服务器&#xff0c;访问出现以下 “entityFramework”节点只定义了一个&#xff0c;但它认为是有多个&#xff0c;最终把该节点屏蔽后网站才能正常运行。没弄明白原理。。。

说说大型高并发高负载网站的系统架构

转载请保留出处&#xff1a;俊麟 Michael’s blog (http://www.toplee.com/blog/?p71) Trackback Url : http://www.toplee.com/blog/wp-trackback.php?p71 我在CERNET做过拨号接入平台的搭建&#xff0c;而后在Yahoo&3721从事过搜索引擎前端开发&#xff0c;又在MOP处理…

MySQL在大型网站的应用架构演变

MySQL在大型网站的应用架构演变 http://www.tuicool.com/articles/VZF3aiF 【编者按】作为最流行的开源数据库&#xff0c;MySQL被广泛应用在Web应用程序以及其它中小型项目上。然而不可忽视的是&#xff0c;在许多大型IT公司中&#xff0c;MySQL在高度优化和定制化后&#x…

MySQL 在大型网站的应用架构演变

写在最前: 本文主要描述在网站的不同的并发访问量级下&#xff0c;Mysql架构的演变 可扩展性 架构的可扩展性往往和并发是息息相关&#xff0c;没有并发的增长&#xff0c;也就没有必要做高可扩展性的架构&#xff0c;这里对可扩展性进行简单介绍一下&#xff0c;常用的扩展手段…

Android开发中混淆后Gson序列化、反序列化的那些坑,网站开发前后端分离

为什么呢? 因为反序列化创建对象本质还是利用反射, 会根据 json 字符串的 key 作为属性名称, value 则对应属性值. 如何解决 将序列化和反序列化的类排除混淆 使用 SerializedName 注解字段 SerializedName(parameter) 通过注解属性实现了 序列化的结果中, 指定该属性 ke…

Hexo+Coding搭建自己的博客网站系列1-本地环境部署

前言 我的博客&#xff1a;https://fitz1318.top/ 最近我终于实现了自己很久之前关于搭建自己专属的博客网站的目标&#xff0c;现在把搭建期间的过程和走过的坑记录下来&#xff0c;如果你对搭建自己的网站有兴趣&#xff0c;不妨可以参考一下我的文章。 首先我说下自己的版本…