一、导入依赖
<!--webmagic依赖--> <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>
二、参考网站
适用博客:博客园、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是抓取的最近一篇博客的链接