2.2.1爬取页面全部内容
https://blog.csdn.net/nav/ai
(1)创建工程,引入依赖
<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>(2)编写类实现网页内容的爬取
package cn.itcast.demo;import us.codecraft.webmagic.Page; import us.codecraft.webmagic.Site; import us.codecraft.webmagic.Spider;import us.codecraft.webmagic.processor.PageProcessor;/*** 爬取类*/public class MyProcessor implements PageProcessor {public void process(Page page) {System.out.println(page.getHtml().toString());}public Site getSite() {return Site.me().setSleepTime(100).setRetryTimes(3);}public static void main(String[] args) {Spider.create( new MyProcessor()).addUrl("https://blog.csdn.net").run();}}Spider是爬虫启动的入口 。在启动爬虫之前,我们需要使用一个PageProcessor创建一个Spider对象,然后使用run()进行启动 。
文章插图
同时Spider的其他组件(Downloader、Scheduler、Pipeline)都可以通过set方法来 进行设置 。
Page代表了从Downloader下载到的一个页面——可能是HTML,也可能是JSON或者其他文本格式的内容 。Page是WebMagic抽取过程的核心对象,它提供一些方法可供抽 取、结果保存等 。
Site用于定义站点本身的一些配置信息,例如编码、HTTP头、超时时间、重试策略 等、代理等,都可以通过设置Site对象来进行配置 。
文章插图
2.2.2爬取指定内容(XPath)
如果我们想爬取网页中部分的内容,需要指定xpath 。
XPath,即为XML路径语言(XMLPathLanguage),它是一种用来确定XML文档中某 部分位置的语言 。XPath 使用路径表达式来选取 XML 文档中的节点或者节点集 。这些路径表达式和我们在常规的电脑文件系统中看到的表达式非常相似 。语法详见附录A
我们通过指定xpath来抓取网页的部分内容
System.out.println(page.getHtml().xpath("//* [@id="nav"]/div/div/ul/li[5]/a").toString());以上代码的含义:id为nav的节点下的div节点下的div节点下的ul下的第5个li节点下的a节点看一下输出结果
<a href=https://www.isolves.com/it/ai/2019-08-09/"/nav/ai">人工智能2.2.3添加目标地址
我们可以通过添加目标地址,从种子页面爬取到更多的页面
public void process(Page page) {page.addTargetRequests( page.getHtml().links().all() );//将当前页面里的所有链接都添加到目标页面中System.out.println(page.getHtml().xpath("//* [@id="nav"]/div/div/ul/li[5]/a").toString());}运行后发现好多地址都出现在控制台
2.2.4目标地址正则匹配
需求:只提取播客的文章详细页内容,并提取标题
package cn.itcast.demo;import us.codecraft.webmagic.Page; import us.codecraft.webmagic.Site; import us.codecraft.webmagic.Spider;import us.codecraft.webmagic.processor.PageProcessor;/*** 爬取类*/public class MyProcessor implements PageProcessor {public void process(Page page) {//page.addTargetRequests( page.getHtml().links().all() );//将当前页面里的所有链接都添加到目标页面中// page.addTargetRequests(page.getHtml().links().regex("https://blog.csdn.net/[a‐z 0‐9‐]+/article/details/[0‐9]{8}").all() );System.out.println(page.getHtml().xpath("//* [@id="mainBox"]/main/div[1]/div[1]/h1/text()").toString());}public Site getSite() {return Site.me().setSleepTime(100).setRetryTimes(3);}public static void main(String[] args) { Spider.create( new MyProcessor()).addUrl("https://blog.csdn.net/nav/ai").run();}}2.3Pipeline
2.3.1ConsolePipeline 控制台输出
/*** 爬取类*/public class MyProcessor implements PageProcessor {public void process(Page page) {//page.addTargetRequests( page.getHtml().links().all() );//将当前页面里的所有链接都添加到目标页面中// page.addTargetRequests(page.getHtml().links().regex("https://blog.csdn.net/[a‐z 0‐9‐]+/article/details/[0‐9]{8}").all() );//System.out.println(page.getHtml().xpath("//* [@id="mainBox"]/main/div[1]/div[1]/h1/text()").toString());page.putField("title",page.getHtml().xpath("//* [@id="mainBox"]/main/div[1]/div[1]/h1/text()").toString());}public Site getSite() {return Site.me().setSleepTime(100).setRetryTimes(3);}public static void main(String[] args) { Spider.create( new MyProcessor() ).addUrl("https://blog.csdn.net").addPipeline(new ConsolePipeline()).run();}}
推荐阅读
- 5G手机的发射功率,到底能有多大?
- 什么是JVM?
- 网络交换机如何规划,VLAN原理介绍
- 初学者如何区分Html5开发和前端开发
- 网络常见的9大命令
- 开发过程中快速抓包并解析
- 人工智能基础算法
- iOS 14“本地网络”权限是什么,需要开吗?
- Spring框架中的国际化支持
- 网络诈骗200万怎么判刑