一、导入依赖

  1. <!--webmagic依赖-->
  2. <dependency>
  3. <groupId>us.codecraft</groupId>
  4. <artifactId>webmagic-core</artifactId>
  5. <version>0.7.3</version>
  6. </dependency>
  7. <dependency>
  8. <groupId>us.codecraft</groupId>
  9. <artifactId>webmagic-extension</artifactId>
  10. <version>0.7.3</version>
  11. </dependency>

二、参考网站

适用博客:博客园、CSDN博客、简书

框架参考文档:http://webmagic.io/docs/zh/

X Path语法:http://www.w3school.com.cn/xpath/xpath_syntax.asp

三、核心代码

  1. import us.codecraft.webmagic.Page;
  2. import us.codecraft.webmagic.Site;
  3. import us.codecraft.webmagic.Spider;
  4. import us.codecraft.webmagic.model.OOSpider;
  5. import us.codecraft.webmagic.processor.PageProcessor;
  6.  
  7. import java.io.IOException;
  8. import java.text.SimpleDateFormat;
  9. import java.util.ArrayList;
  10. import java.util.List;
  11. import java.util.Map;
  12.  
  13. /**
  14. * @author zsh
  15. * @site qqzsh.top
  16. * @company wlgzs
  17. * @create 2019-04-08 20:59
  18. * @Description
  19. */
  20. public class CnBlogProcessor implements PageProcessor {
  21.  
  22. // 抓取网站的相关配置,包括:编码、抓取间隔、重试次数等
  23. private Site site = Site.me().setCharset("utf-8").setRetryTimes(5).setSleepTime(1000);
  24. // 文章数量
  25. private static int size = 0;
  26. // 文章集合
  27. private static List<CnBlogs> cnBlogses = new ArrayList<>();
  28.  
  29. // 抽取逻辑类
  30. public void process(Page page) {
  31. CnBlogs cnBlogs = new CnBlogs();
  32. //博客园博客
  33. if (page.getUrl().regex("https://www.cnblogs.com/.*").match()) {
  34. // 标题
  35. //暂时发现3个样式
  36. String title = page.getHtml().xpath("//div[@class='entrylistPosttitle']/a/text()").get();
  37. if (title != null){
  38. cnBlogs.setTitle(title);
  39. }else {
  40. title = page.getHtml().xpath("//div[@class='postTitle']/a/text()").get();
  41. if (title != null){
  42. cnBlogs.setTitle(title);
  43. }else {
  44. title = page.getHtml().xpath("//div[@class='post']/h5/a/text()").get();
  45. cnBlogs.setTitle(title);
  46. }
  47. }
  48.  
  49. // 作者
  50. cnBlogs.setAuthor(page.getHtml().xpath("//a[@id='Header1_HeaderTitle']/text()").get());
  51.  
  52. // 发布日期
  53. String datatime = page.getHtml().xpath("//div[@class='entrylistItemPostDesc']/a/text()").get();
  54. if (datatime != null){
  55. cnBlogs.setDateTime(datatime);
  56. }else {
  57. datatime = page.getHtml().xpath("//div[@class='postDesc']/text()").get();
  58. if (datatime != null){
  59. int qian = datatime.indexOf("@");
  60. int hou = datatime.indexOf(cnBlogs.getAuthor());
  61. datatime = datatime.substring(qian+2,hou-1);
  62. cnBlogs.setDateTime(datatime);
  63. }else {
  64. datatime = page.getHtml().xpath("//p[@class='postfoot']/a/text()").get();
  65. cnBlogs.setDateTime(datatime);
  66. }
  67. }
  68. // URL
  69. String url = page.getHtml().xpath("//div[@class='entrylistPosttitle']/a/@href").get();
  70. if (url != null){
  71. cnBlogs.setUrl(url);
  72. }else {
  73. url = page.getHtml().xpath("//div[@class='postTitle']/a/@href").get();
  74. if (url != null){
  75. cnBlogs.setUrl(url);
  76. }else {
  77. url = page.getHtml().xpath("//div[@class='post']/h5/a/@href").get();
  78. cnBlogs.setUrl(url);
  79. }
  80. }
  81. cnBlogses.add(cnBlogs);
  82. }else if (page.getUrl().regex("https://blog.csdn.net/.*").match()){ //csdn博客
  83. // 标题
  84. String title = page.getHtml().xpath("//div[@class='article-item-box csdn-tracking-statistics']/h4/a/text()").all().get(1);
  85. if (title != null){
  86. cnBlogs.setTitle(title);
  87. }
  88. // 作者
  89. cnBlogs.setAuthor(page.getHtml().xpath("//a[@id='uid']/text()").get());
  90.  
  91. // 发布日期
  92. String datatime = page.getHtml().xpath("//span[@class='date']/text()").all().get(1);
  93. if (datatime != null){
  94. cnBlogs.setDateTime(datatime);
  95. }
  96.  
  97. // URL
  98. String url = page.getHtml().xpath("//div[@class='article-item-box csdn-tracking-statistics']/h4/a/@href").all().get(1);
  99. if (url != null){
  100. cnBlogs.setUrl(url);
  101. }
  102. cnBlogses.add(cnBlogs);
  103. }else if (page.getUrl().regex("https://www.jianshu.com/.*").match()){ //简书
  104. // 标题
  105. String title = page.getHtml().xpath("//div[@class='content']/a/text()").get();
  106. if (title != null){
  107. cnBlogs.setTitle(title);
  108. }
  109. // 作者
  110. cnBlogs.setAuthor(page.getHtml().xpath("//a[@class='name']/text()").all().get(1));
  111.  
  112. // 发布日期
  113. String datatime = page.getHtml().xpath("//span[@class='time']/@data-shared-at").get();
  114. if (datatime != null){
  115. cnBlogs.setDateTime(datatime);
  116. }
  117.  
  118. // URL
  119. String url = "https://www.jianshu.com"+page.getHtml().xpath("//div[@class='content']/a/@href").get();
  120. if (url != null){
  121. cnBlogs.setUrl(url);
  122. }
  123. cnBlogses.add(cnBlogs);
  124.  
  125. }else {
  126. cnBlogses.add(cnBlogs);
  127. }
  128. }
  129.  
  130. public Site getSite() {
  131. return site;
  132. }
  133.  
  134. public static void main(String[] args) throws IOException {
  135. //1.先去小组官网抓取人员名单
  136. Spider.create(new Test()).addUrl("http://wlgzs.org/blog.html").thread(5).run();
  137. //2.根据抓取的名单来获取博客
  138. Map<String, String> map = POITest.readExcel();
  139. List<String> name = new ArrayList<>();
  140. List<String> url = new ArrayList<>();
  141. for (Map.Entry<String, String> entry : map.entrySet()) {
  142. //Map.entry<Integer,String> 映射项(键-值对) 有几个方法:用上面的名字entry
  143. //entry.getKey() ;entry.getValue(); entry.setValue();
  144. //map.entrySet() 返回此映射中包含的映射关系的 Set视图。
  145. System.out.println("key= " + entry.getKey() + " and value= " + entry.getValue());
  146. name.add(entry.getKey());
  147. url.add(entry.getValue());
  148. if (!entry.getKey().equals("计科182 杨惠涵")){
  149. Spider.create(new CnBlogProcessor()).addUrl(entry.getValue()).thread(10).run();
  150. }else {
  151. CnBlogProcessor.cnBlogses.add(new CnBlogs());
  152. }
  153. }
  154. POITest.printExcel2(name,url,CnBlogProcessor.cnBlogses);
  155. }
  156. }

四、项目源码地址

https://gitee.com/ZhangShunHai/webmagic

result.xls文件是从工作室官网抓取的成员名单

result2.xls是抓取的最近一篇博客的链接

webmagic爬虫抓取工作室成员博客的更多相关文章

  1. Scrapy爬取自己的博客内容

    python中常用的写爬虫的库有urllib2.requests,对于大多数比较简单的场景或者以学习为目的,可以用这两个库实现.这里有一篇我之前写过的用urllib2+BeautifulSoup做的一 ...

  2. [Python学习] 简单网络爬虫抓取博客文章及思想介绍

            前面一直强调Python运用到网络爬虫方面很有效,这篇文章也是结合学习的Python视频知识及我研究生数据挖掘方向的知识.从而简介下Python是怎样爬去网络数据的,文章知识很easy ...

  3. Python爬虫小实践:爬取任意CSDN博客所有文章的文字内容(或可改写为保存其他的元素),间接增加博客访问量

    Python并不是我的主业,当初学Python主要是为了学爬虫,以为自己觉得能够从网上爬东西是一件非常神奇又是一件非常有用的事情,因为我们可以获取一些方面的数据或者其他的东西,反正各有用处. 这两天闲 ...

  4. 利用爬虫将Yuan先生的博客文章爬取下来

    由于一次巧遇,我阅读了Yuan先生的一篇博客文章,感觉从Yuan先生得博客学到很多东西,很喜欢他得文章.于是我就关注了他,并且想阅读更多出自他手笔得博客文章,无奈,可能Yuan先生不想公开自己得博客吧 ...

  5. 通过爬虫代理IP快速增加博客阅读量——亲测CSDN有效!

    写在前面 题目所说的并不是目的,主要是为了更详细的了解网站的反爬机制,如果真的想要提高博客的阅读量,优质的内容必不可少. 了解网站的反爬机制 一般网站从以下几个方面反爬虫: 1. 通过Headers反 ...

  6. [Python爬虫笔记][随意找个博客入门(一)]

    [Python爬虫笔记][随意找个博客入门(一)] 标签(空格分隔): Python 爬虫 2016年暑假 来源博客:挣脱不足与蒙昧 1.简单的爬取特定url的html代码 import urllib ...

  7. 爬虫抓取页面数据原理(php爬虫框架有很多 )

    爬虫抓取页面数据原理(php爬虫框架有很多 ) 一.总结 1.php爬虫框架有很多,包括很多傻瓜式的软件 2.照以前写过java爬虫的例子来看,真的非常简单,就是一个获取网页数据的类或者方法(这里的话 ...

  8. nodejs爬虫--抓取CSDN某用户全部文章

    最近正在学习node.js,就像搞一些东西来玩玩,于是这个简单的爬虫就诞生了. 准备工作 node.js爬虫肯定要先安装node.js环境 创建一个文件夹 在该文件夹打开命令行,执行npm init初 ...

  9. Python爬虫,看看我最近博客都写了啥,带你制作高逼格的数据聚合云图

    转载请标明出处: http://blog.csdn.net/forezp/article/details/70198541 本文出自方志朋的博客 今天一时兴起,想用python爬爬自己的博客,通过数据 ...

随机推荐

  1. laradock

    配置xdebug:http://m.php.cn/article/407434.html

  2. Windows10 ntoskrnl.exe占用大量的磁盘空间(100%)

    一.解决办法: 1.此电脑(右键)>  管理(点击)> 系统工具 > 任务计划程序 > 任务计划程序库 > Microsoft > windows > .NE ...

  3. ThinkPHP 5 验证码

    <div> <form action="{:url('index/check')}" method="post"> <img sr ...

  4. Random-Forest-Python

    1. 近期目标,实现随机森林进行点云分类 1)学习阶段: [干货]Kaggle 数据挖掘比赛经验分享 Kaggle Machine Learning Competition: Predicting T ...

  5. STM32_DAC之软件触发(Trigger)

    stm32_DAC可以用来输出固定的电压值,有些时候需要按键可调输出的电压值.其中一种方法是使用外部中断EXTI9, 另外一种方法就是使用软件触发. 如果将DAC_InitTypeDef.DAC_Tr ...

  6. get请求02

    import requests r = requests.get("http://www.baidu.com") print(r.status_code) #状态码 print(r ...

  7. Android通过Chrome Inspect调试WebView出现404页面的解决方法

    无论是调试Web页面还是调试Hybrid混合应用,只要是调试Android的webview,都需要使用Chrome://inspect进行调试.但是国内开发者会出现404 Not Found错误: 解 ...

  8. 关于PL/SQL Developer与Oracle客户端

    这是一个很简单的知识点,但这些年遇到过太多初学者反而受其困扰,所以还是决定记录一下. 背景:国内使用Oracle的群体,几乎都会使用PL/SQL Developer这个图形化的工具进行日常数据维护.这 ...

  9. 关于Oracle的44951事件

    最近有同事遇到某客户数据库产生大量阻塞,等待事件为:enq HW - contention,最开始采用不断杀会话的方式,效果不好,问题一直高频反复.进一步确认SQL是大量的insert,且插入的表中含 ...

  10. Java基础之流程控制

    一.顺序结构 顺序结构的程序语句只能被执行一次.如果您想要同样的操作执行多次,,就需要使用循环结构. if-else-if 语句 语法: if(条件){ 当条件为true时,执行大括号内的代码 }el ...