最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java實(shí)踐練習(xí)輕松幾行實(shí)現(xiàn)追書(shū)神器

 更新時(shí)間:2021年10月19日 09:33:25   作者:spring小楊  
讀萬(wàn)卷書(shū)不如行萬(wàn)里路,只學(xué)書(shū)上的理論是遠(yuǎn)遠(yuǎn)不夠的,只有在實(shí)戰(zhàn)中才能獲得能力的提升,本篇文章手把手帶你用Java實(shí)現(xiàn)一個(gè)追書(shū)神器,用技術(shù)改變生活,大家可以在過(guò)程中查缺補(bǔ)漏,提升水平

大家好,我是Spring小楊,一個(gè)有夢(mèng)想的Java司機(jī)。

前不久,有個(gè)老同學(xué)找到我,問(wèn)有沒(méi)有什么靠譜的追書(shū)神器?

我想著這玩意無(wú)非用爬蟲(chóng),但是還是得盡量低調(diào),不然牢底坐穿!

正版網(wǎng)站的資源很難爬下來(lái)的,所以書(shū)源還是只能搜盜版網(wǎng)站,某趣閣就是個(gè)不錯(cuò)的選擇。

說(shuō)干就干,我立刻用eclipse創(chuàng)建了一個(gè)Java項(xiàng)目,還是按照之前的配方,用Hutool做定時(shí)任務(wù)。

因?yàn)橐廊【W(wǎng)站信息,所以還是得借助jsoup。

jsoup 是一款Java 的HTML解析器,可直接解析某個(gè)URL地址、HTML文本內(nèi)容。它提供了一套非常省力的API,可通過(guò)DOM,CSS以及類(lèi)似于jQuery的操作方法來(lái)取出和操作數(shù)據(jù)。

還是之前一樣的配方,不過(guò)這次加了jsoup和javax.mail。為什么要發(fā)送郵件呢?那是因?yàn)槲蚁胍〞r(shí)去檢測(cè)網(wǎng)站的小說(shuō)有沒(méi)有更新,如果更新了,就及時(shí)把最新的章節(jié)通過(guò)郵件的形式發(fā)送給我,那不是更好嗎?

這樣我就可以立刻知道小說(shuō)有沒(méi)有更新了,然后更新的話(huà),去自己的郵箱看就行了。

郵箱里面是肯定沒(méi)有廣告的啦!

public static HashMap cache = new HashMap<>();
public static Map cookies = new HashMap<>();
public static String url = https://www.biquwx.la/xxx/;

首先,定義幾個(gè)成員變量,分別是緩存cache,cookie 和 url。我就不用數(shù)據(jù)庫(kù)了,用一個(gè)靜態(tài)的HashMap來(lái)做緩存。cookie是每次爬取網(wǎng)頁(yè)后保存的,就是盡量模擬得像我瀏覽器訪(fǎng)問(wèn)。最后是url,就是小說(shuō)網(wǎng)站的實(shí)際地址,大概是這么一個(gè)目錄。

如果有更新,那就一定會(huì)出現(xiàn)在這個(gè)網(wǎng)頁(yè)!

下面是我發(fā)送請(qǐng)求的代碼:

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ā)送太多郵件,我單獨(dú)設(shè)置了一個(gè)起始章節(jié),放在txt文本里面的。

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

已經(jīng)發(fā)送過(guò)的章節(jié),我把它放到緩存中,不再重復(fù)發(fā)送:

//先檢查是否已經(jīng)在緩存中
if(cache.containsKey(element.text())){
	System.out.println(element.text()+ "已經(jīng)發(fā)送,無(wú)需重復(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ā)到對(duì)應(yīng)的qq郵箱。

下面是我成功收到的小說(shuō)章節(jié)郵件:

配上定時(shí)任務(wù),效果是達(dá)到了, 但是這個(gè)還是得放在服務(wù)器上運(yùn)行才好,不然總不可能一直開(kāi)著電腦吧,哈哈。

全部源代碼如下:

/**
     * 自動(dòng)發(fā)送小說(shuō)最新章節(jié)
     */
	public static void sendMail() throws IOException{
		System.out.println("開(kāi)始準(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"); //讀取開(kāi)始章節(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ā)送,無(wú)需重復(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ā)送成功!");
			}
	
		}
	}

最后,爬蟲(chóng)雖好,不過(guò)自?shī)首詷?lè)一下就好了哈,本文也只是提供一個(gè)傳統(tǒng)思路,切勿用作違法用途哦~~

到此這篇關(guān)于Java實(shí)踐練習(xí)輕松幾行實(shí)現(xiàn)追書(shū)神器的文章就介紹到這了,更多相關(guān)Java 追書(shū)神器內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java中Stream的flatMap與map使用場(chǎng)景及區(qū)別詳解

    Java中Stream的flatMap與map使用場(chǎng)景及區(qū)別詳解

    這篇文章主要介紹了Java中Stream的flatMap與map使用場(chǎng)景及區(qū)別詳解,Stream 流式操作,一般用于操作集合即 List 一類(lèi)的數(shù)據(jù)結(jié)構(gòu),簡(jiǎn)單來(lái)說(shuō) Stream 的 map 使得其中的元素轉(zhuǎn)為另一種元素的映射(map)方法,需要的朋友可以參考下
    2024-01-01
  • 原生java代碼實(shí)現(xiàn)碼云第三方驗(yàn)證登錄的示例代碼

    原生java代碼實(shí)現(xiàn)碼云第三方驗(yàn)證登錄的示例代碼

    這篇文章主要介紹了原生java代碼實(shí)現(xiàn)碼云第三方驗(yàn)證登錄的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • MyBatis學(xué)習(xí)教程(七)-Mybatis緩存介紹

    MyBatis學(xué)習(xí)教程(七)-Mybatis緩存介紹

    MyBatis緩存分為一級(jí)緩存和二級(jí)緩存一級(jí)緩存,本文給大家介紹mybatis緩存知識(shí),非常不錯(cuò)具有參考借鑒價(jià)值,感興趣的朋友一起學(xué)習(xí)吧
    2016-05-05
  • 基于Java判斷網(wǎng)絡(luò)是否正常代碼實(shí)例

    基于Java判斷網(wǎng)絡(luò)是否正常代碼實(shí)例

    這篇文章主要介紹了基于Java判斷網(wǎng)絡(luò)是否正常代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-03-03
  • 使用Netty搭建服務(wù)端和客戶(hù)端過(guò)程詳解

    使用Netty搭建服務(wù)端和客戶(hù)端過(guò)程詳解

    這篇文章主要介紹了使用Netty搭建服務(wù)端和客戶(hù)端過(guò)程詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-07-07
  • SpringBoot?緩存預(yù)熱的實(shí)現(xiàn)

    SpringBoot?緩存預(yù)熱的實(shí)現(xiàn)

    本文主要介紹了SpringBoot?緩存預(yù)熱的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2007-11-11
  • RestTemplate自定義ErrorHandler方式

    RestTemplate自定義ErrorHandler方式

    這篇文章主要介紹了RestTemplate自定義ErrorHandler方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • 如何利用java控制鼠標(biāo)操作一些重復(fù)的事情

    如何利用java控制鼠標(biāo)操作一些重復(fù)的事情

    這篇文章主要給大家介紹了關(guān)于如何利用java控制鼠標(biāo)操作一些重復(fù)的事情,主要利用的是Robot類(lèi),Robot可以模擬鼠標(biāo)和鍵盤(pán)的輸入,相當(dāng)于Java版的按鍵精靈,需要的朋友可以參考下
    2021-12-12
  • SpringMVC中請(qǐng)求參數(shù)的獲取方式

    SpringMVC中請(qǐng)求參數(shù)的獲取方式

    這篇文章主要為大家介紹了SpringMVC中請(qǐng)求參數(shù)的獲取方式,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-05-05
  • java數(shù)組中的異常類(lèi)型整理

    java數(shù)組中的異常類(lèi)型整理

    在本篇文章里小編給各位分享的是一篇關(guān)于java數(shù)組中的異常類(lèi)型整理內(nèi)容,有興趣的朋友們可以學(xué)習(xí)下。
    2021-02-02

最新評(píng)論

福贡县| 新宁县| 华容县| 万州区| 榆中县| 鄯善县| 手游| 凯里市| 禹城市| 眉山市| 陕西省| 扶风县| 济阳县| 石狮市| 吐鲁番市| 华亭县| 汝阳县| 阿城市| 台南市| 澳门| 万荣县| 西贡区| 叙永县| 克什克腾旗| 于都县| 曲沃县| 蚌埠市| 固原市| 获嘉县| 西城区| 宁武县| 锦州市| 铁岭县| 宁明县| 张掖市| 镇沅| 来安县| 南平市| 梁河县| 南昌市| 牡丹江市|