因爲看自己的博客文章的一些信息要上網登錄什麼的步驟,有時候顯得很麻煩,所以今天抽空學了webmagic爬蟲框架,讓自己的文章信息直接展示在控制檯,如下圖:
一、創建一個java項目(其實是不是springboot無所謂的,但做成springboot可以有擴展的地方)
二、首先在pom.xml中加入webmagic相關依賴
<dependency>
<groupId>us.codecraft</groupId>
<artifactId>webmagic-core</artifactId>
<version>0.5.3</version>
</dependency>
<dependency>
<groupId>us.codecraft</groupId>
<artifactId>webmagic-extension</artifactId>
<version>0.5.3</version>
</dependency>
<dependency>
<groupId>us.codecraft</groupId>
<artifactId>webmagic-extension</artifactId>
<version>0.5.3</version>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</exclusion>
</exclusions>
</dependency>
三、直接在主包下面建一個類實現PageProcessor接口
package com;
import us.codecraft.webmagic.Page;
import us.codecraft.webmagic.Site;
import us.codecraft.webmagic.Spider;
import us.codecraft.webmagic.pipeline.ConsolePipeline;
import us.codecraft.webmagic.processor.PageProcessor;
import java.util.List;
public class MyBlogMagic implements PageProcessor {
//// 部分一:抓取網站的相關配置,包括編碼、抓取間隔、重試次數等
private Site site = Site.me().setRetryTimes(3).setSleepTime(1);;
//這裏通過page.addTargetRequests()方法來增加要抓取的URL
// 這裏抽取支持鏈式調用。調用結束後,toString()表示轉化爲單個String,all()則轉化爲一個String列表。
public void process(Page page) {
//用於獲取所有滿足這個正則表達式的鏈接
List<String> links = page.getHtml().links().regex("http://bolg\\.csdn\\.net/").all();
//將這些鏈接加入到待抓取的隊列中去
page.addTargetRequests(links);
//相同元素的結果加到相應的集合中去。
List<String>titlelist=page.getHtml().xpath("//span[@class='link_title']/a/text()").all();
List<String>readlist=page.getHtml().xpath("//span[@class='link_view']/text()").all();
List<String>pinlunlist=page.getHtml().xpath("//span[@class='link_comments']/text()").all();
//遍歷這些list,輸出自己想要的結果。
for (int i=0;i<titlelist.size();i++){
if (i==0){
System.out.println("###################################################");
System.out.println("###################################################");
}
System.out.println("題目:"+titlelist.get(i));
System.out.println("閱讀人數:"+readlist.get(i).replace("(","").replace(")",""));
System.out.println("評論次數:"+pinlunlist.get(i).replace("(","").replace(")",""));
if (i!=titlelist.size()-1) {
System.out.println("*******************我是可愛的分割線*******************\n");
}
}
}
public Site getSite() {
return site;
}
public static void main(String[] args) {
Spider
.create(new MyBlogMagic())
//在這裏寫上自己博客地址,從這個地址開始抓
.addUrl("http://blog.csdn.net/h295928126")
.run();
}
}
四、run main方法即可輸出自己的博客文章信息。
五、後來優化了一下MyBlogMagic 類,變成一個通用版的。可以看一下
package com;
import us.codecraft.webmagic.Page;
import us.codecraft.webmagic.Site;
import us.codecraft.webmagic.Spider;
import us.codecraft.webmagic.processor.PageProcessor;
import java.util.List;
import java.util.Scanner;
public class MyBlogMagic implements PageProcessor {
//文章的總頁數
static String state = "0";
//// 部分一:抓取網站的相關配置,包括編碼、抓取間隔、重試次數等
private Site site = Site.me().setRetryTimes(3).setSleepTime(1);
;
//這裏通過page.addTargetRequests()方法來增加要抓取的URL
// 這裏抽取支持鏈式調用。調用結束後,toString()表示轉化爲單個String,all()則轉化爲一個String列表。
public void process(Page page) {
//用於獲取所有滿足這個正則表達式的鏈接
List<String> links = page.getHtml().links().regex("http://bolg\\.csdn\\.net/article/list/\\d+").all();
//將這些鏈接加入到待抓取的隊列中去
page.addTargetRequests(links);
//相同元素的結果加到相應的集合中去。
List<String> titlelist = page.getHtml().xpath("//span[@class='link_title']/a/text()").all();
List<String> readlist = page.getHtml().xpath("//span[@class='link_view']/text()").all();
List<String> pinlunlist = page.getHtml().xpath("//span[@class='link_comments']/text()").all();
if (!state.equals("0")) {
for (int i = 0; i < titlelist.size(); i++) {
if (i == 0) {
System.out.println("-------------------------------------------------");
System.out.println("------------------------------------------------");
}
System.out.println("題目:" + titlelist.get(i));
System.out.println("閱讀人數:" + readlist.get(i).replace("(", "").replace(")", ""));
System.out.println("評論次數:" + pinlunlist.get(i).replace("(", "").replace(")", ""));
if (i != titlelist.size() - 1) {
System.out.println("********************************************\n");
}
}
}
String pagelist = page.getHtml().xpath("//div[@class='pagelist']/span/text()").get();
if (pagelist != null) {
state = pagelist.substring(pagelist.indexOf("共") + 1, pagelist.indexOf("頁"));
} else {
state = "true";
}
}
public Site getSite() {
return site;
}
public static void main(String[] args) {
Scanner scanner1 = new Scanner(System.in);
System.out.println("++++++++++++++++++++++++++++++++");
System.out.println("+ +");
System.out.println("+請輸入您的博客名字,按回車確認:+");
System.out.println("+ +");
System.out.println("++++++++++++++++++++++++++++++++");
String name = scanner1.next();
Spider
.create(new MyBlogMagic())
//從這個地址開始抓
.addUrl("http://blog.csdn.net/" + name + "/article/list")
.run();
if (state.equals("true")) {
Spider
.create(new MyBlogMagic())
//從這個地址開始抓
.addUrl("http://blog.csdn.net/" + name)
.run();
} else while (!state.equals("0")) {
try {
Scanner scanner = new Scanner(System.in);
System.out.println("********************************************************");
System.out.println("**總頁數爲 " + state + " 頁 **");
System.out.println("**請輸入您要看的頁碼,按回車確認: **");
System.out.println("**輸入大於" + state + "的數字可查看全部文章列表 **");
System.out.println("********************************************************");
String str = scanner.next();
int a = Integer.valueOf(str);
Spider
.create(new MyBlogMagic())
//從這個地址開始抓
.addUrl("http://blog.csdn.net/" + name + "/article/list/" + str)
.run();
} catch (Exception e) {
new Thread(new Runnable() {
@Override
public void run() {
String str="不要輸入非數字啦!!人家都要奔潰了(>﹏<。)要重新輸入哦~";
try {
for(int i=0;i<str.length();i++){
Thread.sleep(100);
System.out.print(str.charAt(i));
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();
}
}
}
}