Java實踐練習(xí)輕松幾行實現(xiàn)追書神器
大家好,我是Spring小楊,一個有夢想的Java司機。
前不久,有個老同學(xué)找到我,問有沒有什么靠譜的追書神器?

我想著這玩意無非用爬蟲,但是還是得盡量低調(diào),不然牢底坐穿!
正版網(wǎng)站的資源很難爬下來的,所以書源還是只能搜盜版網(wǎng)站,某趣閣就是個不錯的選擇。
說干就干,我立刻用eclipse創(chuàng)建了一個Java項目,還是按照之前的配方,用Hutool做定時任務(wù)。
因為要爬取網(wǎng)站信息,所以還是得借助jsoup。
jsoup 是一款Java 的HTML解析器,可直接解析某個URL地址、HTML文本內(nèi)容。它提供了一套非常省力的API,可通過DOM,CSS以及類似于jQuery的操作方法來取出和操作數(shù)據(jù)。

還是之前一樣的配方,不過這次加了jsoup和javax.mail。為什么要發(fā)送郵件呢?那是因為我想要定時去檢測網(wǎng)站的小說有沒有更新,如果更新了,就及時把最新的章節(jié)通過郵件的形式發(fā)送給我,那不是更好嗎?
這樣我就可以立刻知道小說有沒有更新了,然后更新的話,去自己的郵箱看就行了。
郵箱里面是肯定沒有廣告的啦!
public static HashMap cache = new HashMap<>(); public static Map cookies = new HashMap<>(); public static String url = https://www.biquwx.la/xxx/;
首先,定義幾個成員變量,分別是緩存cache,cookie 和 url。我就不用數(shù)據(jù)庫了,用一個靜態(tài)的HashMap來做緩存。cookie是每次爬取網(wǎng)頁后保存的,就是盡量模擬得像我瀏覽器訪問。最后是url,就是小說網(wǎng)站的實際地址,大概是這么一個目錄。

如果有更新,那就一定會出現(xiàn)在這個網(wǎng)頁!
下面是我發(fā)送請求的代碼:
Connection con = Jsoup.connect(url)
.userAgent("Mozilla/5.0 (Windows NT 6.1; WOW64; rv:56.0) Gecko/20100101 Firefox/56.0")
.header("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8")
.header("Accept-Language","zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3")
.header("Accept-Encoding", "gzip, deflate")
.header("Connection","keep-alive")
.header("Upgrade-Insecure-Requests", "1").cookies(cookies);
為了不希望他一下子發(fā)送太多郵件,我單獨設(shè)置了一個起始章節(jié),放在txt文本里面的。

里面就一個最新的章節(jié)標(biāo)題:

已經(jīng)發(fā)送過的章節(jié),我把它放到緩存中,不再重復(fù)發(fā)送:
//先檢查是否已經(jīng)在緩存中
if(cache.containsKey(element.text())){
System.out.println(element.text()+ "已經(jīng)發(fā)送,無需重復(fù)發(fā)送!");
continue;
}
最后,再用Java發(fā)送一份郵件到自己的郵箱就可以啦!
MailAccount account = new MailAccount();
account.setHost("smtp.163.com");
account.setPort(Integer.valueOf(465));
account.setAuth(true);
account.setSslEnable(Boolean.valueOf(true));
account.setConnectionTimeout(1000L);
account.setSocketFactoryFallback(true);
account.setFrom("你的發(fā)送郵箱");
account.setUser("你的發(fā)送郵箱");
account.setPass("你發(fā)送郵箱的授權(quán)碼");
MailUtil.send(account, "xxxxxxxxx@qq.com",element.text() , content, true, new File[0]);
System.out.println("發(fā)送成功!");
我用的是163郵箱,然后發(fā)到對應(yīng)的qq郵箱。
下面是我成功收到的小說章節(jié)郵件:

配上定時任務(wù),效果是達到了, 但是這個還是得放在服務(wù)器上運行才好,不然總不可能一直開著電腦吧,哈哈。
全部源代碼如下:
/**
* 自動發(fā)送小說最新章節(jié)
*/
public static void sendMail() throws IOException{
System.out.println("開始準(zhǔn)備爬取..");
Connection con = Jsoup.connect(url)
.userAgent("Mozilla/5.0 (Windows NT 6.1; WOW64; rv:56.0) Gecko/20100101 Firefox/56.0")
.header("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8")
.header("Accept-Language","zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3")
.header("Accept-Encoding", "gzip, deflate")
.header("Connection","keep-alive")
.header("Upgrade-Insecure-Requests", "1").cookies(cookies);
Response execute = con.execute();
cookies = execute.cookies();
String body = execute.body().toString();
Document doc = Jsoup.parse(body);
Elements as = doc.getElementsByTag("a");
boolean shouldSend = false;
String start = FileUtil.readString("C:/start.txt", "UTF-8"); //讀取開始章節(jié),如果服務(wù)重啟,必須重新修改該文件
for (Iterator iterator = as.iterator(); iterator.hasNext();) {
Element element = (Element) iterator.next();
if(element.text().equals(start)){
shouldSend = true;
}
if(shouldSend && element.text().startsWith("第")){
//先檢查是否已經(jīng)在緩存中
if(cache.containsKey(element.text())){
System.out.println(element.text()+ "已經(jīng)發(fā)送,無需重復(fù)發(fā)送!");
continue;
}
con = Jsoup.connect(url + element.attr("href"));
String content = Jsoup.parse(con.execute().body()).getElementById("content").html();
cache.put(element.text(), "");
MailAccount account = new MailAccount();
account.setHost("smtp.163.com");
account.setPort(Integer.valueOf(465));
account.setAuth(true);
account.setSslEnable(Boolean.valueOf(true));
account.setConnectionTimeout(1000L);
account.setSocketFactoryFallback(true);
account.setFrom("你的發(fā)送郵箱");
account.setUser("你的發(fā)送郵箱");
account.setPass("授權(quán)碼");
// MailUtil.send(account, "你的接收郵箱",element.text() , content, true, new File[0]);
System.out.println("發(fā)送成功!");
}
}
}

最后,爬蟲雖好,不過自娛自樂一下就好了哈,本文也只是提供一個傳統(tǒng)思路,切勿用作違法用途哦~~
到此這篇關(guān)于Java實踐練習(xí)輕松幾行實現(xiàn)追書神器的文章就介紹到這了,更多相關(guān)Java 追書神器內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java中Stream的flatMap與map使用場景及區(qū)別詳解
這篇文章主要介紹了Java中Stream的flatMap與map使用場景及區(qū)別詳解,Stream 流式操作,一般用于操作集合即 List 一類的數(shù)據(jù)結(jié)構(gòu),簡單來說 Stream 的 map 使得其中的元素轉(zhuǎn)為另一種元素的映射(map)方法,需要的朋友可以參考下2024-01-01
原生java代碼實現(xiàn)碼云第三方驗證登錄的示例代碼
這篇文章主要介紹了原生java代碼實現(xiàn)碼云第三方驗證登錄的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04
MyBatis學(xué)習(xí)教程(七)-Mybatis緩存介紹
MyBatis緩存分為一級緩存和二級緩存一級緩存,本文給大家介紹mybatis緩存知識,非常不錯具有參考借鑒價值,感興趣的朋友一起學(xué)習(xí)吧2016-05-05
如何利用java控制鼠標(biāo)操作一些重復(fù)的事情
這篇文章主要給大家介紹了關(guān)于如何利用java控制鼠標(biāo)操作一些重復(fù)的事情,主要利用的是Robot類,Robot可以模擬鼠標(biāo)和鍵盤的輸入,相當(dāng)于Java版的按鍵精靈,需要的朋友可以參考下2021-12-12

