Java實踐練習輕松幾行實現追書神器
大傢好,我是Spring小楊,一個有夢想的Java司機。
前不久,有個老同學找到我,問有沒有什麼靠譜的追書神器?
我想著這玩意無非用爬蟲,但是還是得盡量低調,不然牢底坐穿!
正版網站的資源很難爬下來的,所以書源還是隻能搜盜版網站,某趣閣就是個不錯的選擇。
說幹就幹,我立刻用eclipse創建瞭一個Java項目,還是按照之前的配方,用Hutool做定時任務。
因為要爬取網站信息,所以還是得借助jsoup。
jsoup 是一款Java 的HTML解析器,可直接解析某個URL地址、HTML文本內容。它提供瞭一套非常省力的API,可通過DOM,CSS以及類似於jQuery的操作方法來取出和操作數據。
還是之前一樣的配方,不過這次加瞭jsoup和javax.mail。為什麼要發送郵件呢?那是因為我想要定時去檢測網站的小說有沒有更新,如果更新瞭,就及時把最新的章節通過郵件的形式發送給我,那不是更好嗎?
這樣我就可以立刻知道小說有沒有更新瞭,然後更新的話,去自己的郵箱看就行瞭。
郵箱裡面是肯定沒有廣告的啦!
public static HashMap cache = new HashMap<>(); public static Map cookies = new HashMap<>(); public static String url = https://www.biquwx.la/xxx/;
首先,定義幾個成員變量,分別是緩存cache,cookie 和 url。我就不用數據庫瞭,用一個靜態的HashMap來做緩存。cookie是每次爬取網頁後保存的,就是盡量模擬得像我瀏覽器訪問。最後是url,就是小說網站的實際地址,大概是這麼一個目錄。
如果有更新,那就一定會出現在這個網頁!
下面是我發送請求的代碼:
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);
為瞭不希望他一下子發送太多郵件,我單獨設置瞭一個起始章節,放在txt文本裡面的。
裡面就一個最新的章節標題:
已經發送過的章節,我把它放到緩存中,不再重復發送:
//先檢查是否已經在緩存中 if(cache.containsKey(element.text())){ System.out.println(element.text()+ "已經發送,無需重復發送!"); continue; }
最後,再用Java發送一份郵件到自己的郵箱就可以啦!
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("你的發送郵箱"); account.setUser("你的發送郵箱"); account.setPass("你發送郵箱的授權碼"); MailUtil.send(account, "[email protected]",element.text() , content, true, new File[0]); System.out.println("發送成功!");
我用的是163郵箱,然後發到對應的qq郵箱。
下面是我成功收到的小說章節郵件:
配上定時任務,效果是達到瞭, 但是這個還是得放在服務器上運行才好,不然總不可能一直開著電腦吧,哈哈。
全部源代碼如下:
/** * 自動發送小說最新章節 */ public static void sendMail() throws IOException{ System.out.println("開始準備爬取.."); 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"); //讀取開始章節,如果服務重啟,必須重新修改該文件 for (Iterator iterator = as.iterator(); iterator.hasNext();) { Element element = (Element) iterator.next(); if(element.text().equals(start)){ shouldSend = true; } if(shouldSend && element.text().startsWith("第")){ //先檢查是否已經在緩存中 if(cache.containsKey(element.text())){ System.out.println(element.text()+ "已經發送,無需重復發送!"); 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("你的發送郵箱"); account.setUser("你的發送郵箱"); account.setPass("授權碼"); // MailUtil.send(account, "你的接收郵箱",element.text() , content, true, new File[0]); System.out.println("發送成功!"); } } }
最後,爬蟲雖好,不過自娛自樂一下就好瞭哈,本文也隻是提供一個傳統思路,切勿用作違法用途哦~~
到此這篇關於Java實踐練習輕松幾行實現追書神器的文章就介紹到這瞭,更多相關Java 追書神器內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- java爬蟲Jsoup主要類及功能使用詳解
- jsoup 框架的使用小結
- java爬蟲jsoup解析HTML的工具學習
- java編程實現簡單的網絡爬蟲示例過程
- 使用maven實現有關Jsoup簡單爬蟲的步驟