在使用webmgiac的过程中,很多时候我们需要抓取连接的绝对路径,总结了几种方法,示例代码放在最后。

以和讯网的一个页面为例:

xpath方式获取

  1. log.info("{}", page.getHtml().xpath("//div[@id='cyldata']").links().all());
  2. log.info("{}", page.getHtml().xpath("//div[@id='cyldata']//a//@abs:href").all());

xpath+css选择器方式获取

  1. log.info("{}", page.getHtml().xpath("//div[@id='cyldata']").css("a", "abs:href").all());

css选择器方式获取

  1. log.info("{}", page.getHtml().css("div[id='cyldata']").css("a", "abs:href").all());
  2. log.info("{}", page.getHtml().css("div[id='cyldata']").links().all());
  3. log.info("{}", page.getHtml().css("div[id='cyldata'] a").links().all());
  4. log.info("{}", page.getHtml().css("div[id='cyldata'] a", "abs:href").all());

jsoup方式获取

  1. for (Element element : Jsoup.parse(page.getRawText(), page.getRequest().getUrl()).select("#cyldata a")) {
  2. log.info("{}", element.attr("abs:href"));
  3. log.info("{}", element.absUrl("href"));
  4. }

jsoup中stringutil工具类方式获取

  1. for (Element element : Jsoup.parse(page.getRawText(), page.getRequest().getUrl()).select("#cyldata a")) {
  2. log.info("{}", StringUtil.resolve(page.getRequest().getUrl(), element.attr("href")));
  3. }

示例代码

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  4. <modelVersion>4.0.0</modelVersion>
  5. <parent>
  6. <groupId>org.springframework.boot</groupId>
  7. <artifactId>spring-boot-starter-parent</artifactId>
  8. <version>2.1.4.RELEASE</version>
  9. <relativePath/> <!-- lookup parent from repository -->
  10. </parent>
  11. <groupId>com.ady01</groupId>
  12. <artifactId>java-pachong</artifactId>
  13. <version>0.0.1-SNAPSHOT</version>
  14. <name>java-pachong</name>
  15. <description>java爬虫项目</description>
  16. <properties>
  17. <java.version>1.8</java.version>
  18. </properties>
  19. <dependencies>
  20. <dependency>
  21. <groupId>org.springframework.boot</groupId>
  22. <artifactId>spring-boot-starter</artifactId>
  23. </dependency>
  24. <dependency>
  25. <groupId>org.projectlombok</groupId>
  26. <artifactId>lombok</artifactId>
  27. <optional>true</optional>
  28. </dependency>
  29. <dependency>
  30. <groupId>org.springframework.boot</groupId>
  31. <artifactId>spring-boot-starter-test</artifactId>
  32. <scope>test</scope>
  33. </dependency>
  34. <!-- webmagic start -->
  35. <dependency>
  36. <groupId>us.codecraft</groupId>
  37. <artifactId>webmagic-core</artifactId>
  38. <version>0.7.3</version>
  39. <exclusions>
  40. <exclusion>
  41. <artifactId>fastjson</artifactId>
  42. <groupId>com.alibaba</groupId>
  43. </exclusion>
  44. <exclusion>
  45. <artifactId>commons-io</artifactId>
  46. <groupId>commons-io</groupId>
  47. </exclusion>
  48. <exclusion>
  49. <artifactId>commons-io</artifactId>
  50. <groupId>commons-io</groupId>
  51. </exclusion>
  52. <exclusion>
  53. <artifactId>fastjson</artifactId>
  54. <groupId>com.alibaba</groupId>
  55. </exclusion>
  56. <exclusion>
  57. <artifactId>fastjson</artifactId>
  58. <groupId>com.alibaba</groupId>
  59. </exclusion>
  60. <exclusion>
  61. <artifactId>log4j</artifactId>
  62. <groupId>log4j</groupId>
  63. </exclusion>
  64. <exclusion>
  65. <artifactId>slf4j-log4j12</artifactId>
  66. <groupId>org.slf4j</groupId>
  67. </exclusion>
  68. </exclusions>
  69. </dependency>
  70. <dependency>
  71. <groupId>us.codecraft</groupId>
  72. <artifactId>webmagic-extension</artifactId>
  73. <version>0.7.3</version>
  74. </dependency>
  75. <dependency>
  76. <groupId>us.codecraft</groupId>
  77. <artifactId>webmagic-selenium</artifactId>
  78. <version>0.7.3</version>
  79. </dependency>
  80. <dependency>
  81. <groupId>net.minidev</groupId>
  82. <artifactId>json-smart</artifactId>
  83. <version>2.2.1</version>
  84. </dependency>
  85. <!-- webmagic end -->
  86. <dependency>
  87. <groupId>com.alibaba</groupId>
  88. <artifactId>fastjson</artifactId>
  89. <version>1.2.49</version>
  90. </dependency>
  91. <dependency>
  92. <groupId>commons-lang</groupId>
  93. <artifactId>commons-lang</artifactId>
  94. <version>2.6</version>
  95. </dependency>
  96. <dependency>
  97. <groupId>commons-io</groupId>
  98. <artifactId>commons-io</artifactId>
  99. <version>2.6</version>
  100. </dependency>
  101. <dependency>
  102. <groupId>commons-codec</groupId>
  103. <artifactId>commons-codec</artifactId>
  104. <version>1.11</version>
  105. </dependency>
  106. <dependency>
  107. <groupId>commons-collections</groupId>
  108. <artifactId>commons-collections</artifactId>
  109. <version>3.2.2</version>
  110. </dependency>
  111. </dependencies>
  112. <build>
  113. <plugins>
  114. <plugin>
  115. <groupId>org.springframework.boot</groupId>
  116. <artifactId>spring-boot-maven-plugin</artifactId>
  117. </plugin>
  118. </plugins>
  119. </build>
  120. </project>
  1. package com.ady01.demo3;
  2. import lombok.extern.slf4j.Slf4j;
  3. import org.jsoup.Jsoup;
  4. import org.jsoup.helper.StringUtil;
  5. import org.jsoup.nodes.Element;
  6. import us.codecraft.webmagic.Page;
  7. import us.codecraft.webmagic.Request;
  8. import us.codecraft.webmagic.Site;
  9. import us.codecraft.webmagic.Spider;
  10. import us.codecraft.webmagic.processor.PageProcessor;
  11. /**
  12. * <b>description</b>:webmagic中获取绝对路径 <br>
  13. * <b>time</b>:2019/4/22 10:42 <br>
  14. * <b>author</b>:微信公众号:路人甲Java,专注于java技术分享(带你玩转 爬虫、分布式事务、异步消息服务、任务调度、分库分表、大数据等),喜欢请关注!
  15. */
  16. @Slf4j
  17. public class AbsHrefPageProcessor implements PageProcessor {
  18. Site site = Site.me().setSleepTime(1000);
  19. @Override
  20. public void process(Page page) {
  21. //获取超链接绝对路径的方式
  22. log.info("----------------------xpath方式获取------------------------");
  23. //xpath方式获取
  24. log.info("{}", page.getHtml().xpath("//div[@id='cyldata']").links().all());
  25. log.info("{}", page.getHtml().xpath("//div[@id='cyldata']//a//@abs:href").all());
  26. //xpath+css选择器方式获取
  27. log.info("----------------------xpath+css选择器方式获取------------------------");
  28. log.info("{}", page.getHtml().xpath("//div[@id='cyldata']").css("a", "abs:href").all());
  29. //css选择器方式获取
  30. log.info("----------------------css选择器方式获取------------------------");
  31. log.info("{}", page.getHtml().css("div[id='cyldata']").css("a", "abs:href").all());
  32. log.info("{}", page.getHtml().css("div[id='cyldata']").links().all());
  33. log.info("{}", page.getHtml().css("div[id='cyldata'] a").links().all());
  34. log.info("{}", page.getHtml().css("div[id='cyldata'] a", "abs:href").all());
  35. //jsoup方式获取
  36. log.info("----------------------jsoup方式获取------------------------");
  37. for (Element element : Jsoup.parse(page.getRawText(), page.getRequest().getUrl()).select("#cyldata a")) {
  38. log.info("{}", element.attr("abs:href"));
  39. log.info("{}", element.absUrl("href"));
  40. }
  41. //jsoup中stringutil工具类方式获取
  42. log.info("----------------------jsoup中stringutil工具类方式获取------------------------");
  43. for (Element element : Jsoup.parse(page.getRawText(), page.getRequest().getUrl()).select("#cyldata a")) {
  44. log.info("{}", StringUtil.resolve(page.getRequest().getUrl(), element.attr("href")));
  45. }
  46. }
  47. @Override
  48. public Site getSite() {
  49. return site;
  50. }
  51. public static void main(String[] args) {
  52. Request request = new Request("http://industry.hexun.com/c193_59.shtml");
  53. Spider.create(new AbsHrefPageProcessor()).addRequest(request).run();
  54. }
  55. }

​执行结果:



java爬虫系列第三讲-获取页面中绝对路径的各种方法的更多相关文章

  1. java爬虫系列目录

    1. java爬虫系列第一讲-爬虫入门(爬取动作片列表) 2. java爬虫系列第二讲-爬取最新动作电影<海王>迅雷下载地址 3. java爬虫系列第三讲-获取页面中绝对路径的各种方法 4 ...

  2. Java爬虫系列二:使用HttpClient抓取页面HTML

    爬虫要想爬取需要的信息,首先第一步就要抓取到页面html内容,然后对html进行分析,获取想要的内容.上一篇随笔<Java爬虫系列一:写在开始前>中提到了HttpClient可以抓取页面内 ...

  3. java爬虫系列第二讲-爬取最新动作电影《海王》迅雷下载地址

    1. 目标 使用webmagic爬取动作电影列表信息 爬取电影<海王>详细信息[电影名称.电影迅雷下载地址列表] 2. 爬取最新动作片列表 获取电影列表页面数据来源地址 访问http:// ...

  4. Java爬虫系列之实战:爬取酷狗音乐网 TOP500 的歌曲(附源码)

    在前面分享的两篇随笔中分别介绍了HttpClient和Jsoup以及简单的代码案例: Java爬虫系列二:使用HttpClient抓取页面HTML Java爬虫系列三:使用Jsoup解析HTML 今天 ...

  5. Java爬虫系列三:使用Jsoup解析HTML

    在上一篇随笔<Java爬虫系列二:使用HttpClient抓取页面HTML>中介绍了怎么使用HttpClient进行爬虫的第一步--抓取页面html,今天接着来看下爬虫的第二步--解析抓取 ...

  6. java爬虫系列第一讲-爬虫入门

    1. 概述 java爬虫系列包含哪些内容? java爬虫框架webmgic入门 使用webmgic爬取 http://ady01.com 中的电影资源(动作电影列表页.电影下载地址等信息) 使用web ...

  7. js获取页面中图片的总数

    查看效果:http://keleyi.com/keleyi/phtml/image/9.htm 下面是完整代码: <html><body><div id="ke ...

  8. jQuery基础学习5——JavaScript方法获取页面中的元素

    给网页中的所有<p>元素添加onclick事件 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN& ...

  9. 获取页面中任意一个元素距离body的偏移量

    //offSet:等同于jQuery中的offSet方法,获取页面中任意一个元素距离body的偏移量function offSet(curEle) { var totalLeft = null; va ...

随机推荐

  1. netty基本用法

    1.客户端 ①HelloClient.java public class HelloClient { public static String host = "127.0.0.1" ...

  2. 回归树(Regression Tree)

    目录 回归树 理论解释 算法流程 ID3 和 C4.5 能不能用来回归? 回归树示例 References 说到决策树(Decision tree),我们很自然会想到用其做分类,每个叶子代表有限类别中 ...

  3. [asp.net mvc 奇淫巧技] 06 - 也许你的项目同一个用户的请求都是同步的

    一.感慨 很久前看到一篇博客中有句话大致的意思是:“asp.net 程序性能低下的主要原因是开发人员技术参差不齐”,当时看到这句话不以为然,然而时间过的越久接触的.net 开发人员越多就越认同这句话: ...

  4. 基于Token认证的多点登录和WebApi保护

    在文章中有错误的地方,或是有建议或意见的地方,请大家多多指正,邮箱: linjie.rd@gmail.com 一天张三,李四,王五,赵六去动物园,张三没买票,李四制作了个假票,王五买了票,赵六要直接F ...

  5. 『Möbius函数与Möbius反演』

    Möbius函数 定义 设正整数\(n\)算数基本定理分解后为\(n=\prod_{i=1}^{k}p_i^{a_i}\),定义函数 \[ \mu(n)= \begin{cases} 0\ \ (\e ...

  6. Servlet底层原理、Servlet实现方式、Servlet生命周期

    Servlet简介 Servlet定义 Servlet是一个Java应用程序,运行在服务器端,用来处理客户端请求并作出响应的程序. Servlet的特点 (1)Servlet对像,由Servlet容器 ...

  7. Python中的那些“坑”

    1.哪个是True,哪个是False? 这里要看三组代码: # 第一组: >>>a=256 >>>b = 256 >>>a is b # 第二组: ...

  8. Unity导航 (寻路系统Nav Mesh Agent)

    第一种 简单寻路 地面接触到的.到达目标点不用跳跃能够一直走路到达.场景视图中简单搭设几个物体.胶囊体为寻路者,黄球为目标点 红地板,绿色障碍物.现将地板以及障碍物选中 在检视面板设置静态为Navig ...

  9. Windows -- cmd命令: ipconfig 和 nbtstat

    1. ipconfig 命令格式及参数如下: 2. nbtstat 命令格式及参数如下:

  10. 任务型对话(一)—— NLU(意识识别和槽值填充)

    1,概述 任务型对话系统越来越多的被应用到实际的场景中,例如siri,阿里小密这类的产品.通常任务型对话系统都是基于pipline的方式实现的,具体的流程图如下: 整个pipline由五个模块组成:语 ...