最近手上項目空了下來,沒什麼事做。博客博客不想寫,文章文章不想看。於是乾脆看點小說吧,但是上班時間,大家都在認認真真敲代碼,自己拿出手機看小說又不是很好(其實主要是數據線壞了,在公司沒發充電),電腦上瀏覽器看,更是不行。於是想了想,乾脆就自己爬著看吧,把內容列印在IDE的控制台,想一想這波操作就很騷 ...
最近手上項目空了下來,沒什麼事做。博客博客不想寫,文章文章不想看。於是乾脆看點小說吧,但是上班時間,大家都在認認真真敲代碼,自己拿出手機看小說又不是很好(其實主要是數據線壞了,在公司沒發充電),電腦上瀏覽器看,更是不行。於是想了想,乾脆就自己爬著看吧,把內容列印在IDE的控制台,想一想這波操作就很騷,於是說動就動。
爬蟲選擇
由於本人是一枚正經的Javaer,所以爬蟲當然也要用Java咯。Java下也有幾款比較好的爬蟲軟體,如nutch、crawler4j 等。但是我只是爬個網頁,看個小說而已啊。於是就選了個Jsoup,直接解析Html信息,從中提取小說內容。
其實選擇Jsoup還有個原因就是我好歹寫過一陣子jQuery,對jQuery語法比較熟悉。因為Jsoup語法與jQuery語法非常一致。
開始動工
添加maven依賴
<dependency> <groupId> org.jsoup </groupId> <artifactId> jsoup </artifactId> <version> 1.9.2 </version> </dependency>
爬取頁面信息
Jsoup的爬取方式十分簡單,是通過獲取html文檔到本地,然後再用jQuery的解析方式做的DOM解析。
public class BiQuGeCrawler extends AbstractCrawler { @Override public String getPage(String url) { try { page = Jsoup.connect(url).get(); this.getNext(); this.getLast(); } catch (IOException e) { e.printStackTrace(); } return this.getContent(); } @Override protected String getContent(){ Element cntEl = page.getElementById("content"); // 八個空格,(製表符號) return cntEl.text().replaceAll(" ", "\n"); } protected void getNext() { Element ul = page.getElementsByClass("page_chapter").get(0).child(0); Element nextHref = ul.child(2).child(0); nextUrl = nextHref.attr("abs:href"); } protected void getLast() { Element ul = page.getElementsByClass("page_chapter").get(0).child(0); Element lastHref = ul.child(0).child(0); lastUrl = lastHref.attr("abs:href"); } }
獲取小說正文內容及前一頁、後一頁鏈接等關鍵信息。
設置翻頁及退出
每次抓取完頁面後,監聽控制台輸入值,進行翻頁、退出操作。
public class Function { // app配置 private AppConfig config; // 爬蟲類 private AbstractCrawler crawler; public Function(String firstUrl){ config = new AppConfig(); crawler = CrawlerFactory.build(config.sourceType); startView(firstUrl); } // 頁面瀏覽 private void startView(String pageUrl){ String content = crawler.getPage(pageUrl); System.out.println(content); this.inputListener(); } // 開始瀏覽 private void inputListener(){ System.out.println("*************"); System.out.println("* L 上一頁 *"); System.out.println("* Q 退出 *"); System.out.println("* 其他 下一頁 *"); System.out.println("*************"); Scanner sc = new Scanner(System.in); String input = sc.nextLine(); if ("l".equalsIgnoreCase(input)){ // 上一頁 startView(crawler.lastUrl); } else if ("q".equalsIgnoreCase(input)){ // 退出 } else { // 下一頁 startView(crawler.nextUrl); } } }
如上,整個摸魚神器的關鍵代碼就已經完成了,具體的完整代碼,可以查看我的github項目
Run一下
首先配置需要看的小說網頁信息及個人操作習慣設置。然後通過運行main方法。即可運行。
後續支持
OK,到此爬蟲已經能夠正常爬取小說內容了。並且已經實現翻頁、退出等基本功能。後續將支持更多小說來源如 縱橫綜合網 等網站。以及更多的功能如 日誌混淆、 日誌格式化 、斷點續看 等功能。
本文章涉及的代碼已托管到github,歡迎各位客官使用https://github.com/weechang/ReadingCrawler
本文作者: 張未 本文鏈接: https://blog.weechang.xyz/2018/09/21/論如何優雅地使用爬蟲摸魚/ 版權聲明: 本博客所有文章除特別聲明外,均採用 CC BY-NC-SA 4.0 許可協議。轉載請註明出處!