Jsoup爬蟲獲取自己網站在百度搜索中的實時排名
一直有一個需求,希望看到自己網站在百度的實時的排名
用過一些工具,要麼反應遲鈍,要麼結果不準確或不實時
於是打算用jsoup寫一個小爬蟲來實時百度看網站排名
直接上程式碼
依賴只有jsoup
jar包下載地址: https://mvnrepository.com/artifact/org.jsoup/jsoup
或者引入
maven依賴
<dependency> <groupId>org.jsoup</groupId> <artifactId>jsoup</artifactId> <version>1.11.3</version> </dependency>
程式碼
package com.zzzmh.spider; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; import org.jsoup.select.Elements; public class test { /** 百度搜索基本url 後面可以接的引數有 pn rn ie 等 */ public final static String baseUrl = "https://www.baidu.com/s?ie=utf-8"; /** 連線超時時間 */ public static int timeout = 30 * 1000; /** 連線重試次數 */ public static int times = 10; /** UA */ public static String UserAgent[] = { "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_8; en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50", "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50", "Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; .NET4.0C; .NET4.0E; .NET CLR 2.0.50727; .NET CLR 3.0.30729; .NET CLR 3.5.30729; InfoPath.3; rv:11.0) like Gecko", "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E)", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.87 Safari/537.36 OPR/37.0.2178.32", "Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.116 UBrowser/5.6.12150.8 Safari/537.36", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2486.0 Safari/537.36 Edge/13.10586", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.87 Safari/537.36 OPR/37.0.2178.32" }; /** 獲取隨機UA */ public static String getRandomUA() { return UserAgent[(int) (Math.random() * (UserAgent.length))]; } /** 在這裡進行連線 如果失敗會繼續重試 */ public static Document getDocument(String url) { Document doc = null; for (int i = 0; i < times; i++) { try { doc = Jsoup.connect(url).header("User-Agent", getRandomUA()).timeout(timeout).get(); if (doc != null) break; } catch (Exception e) { e.printStackTrace(); } } return doc; } /** * 爬取百度指定關鍵字和頁碼的資料,只存id(排名號),title,url(百度會把url縮寫) 親測雖然 * 加了&rn=50可以明顯增加效率,但結果和使用者實際看到的有所出入,並不準確,故用預設rn,與使用者實際看到保持一致 * * @param keyword 關鍵字 * @param page頁碼 */ public static List<Map<String, String>> spider(String keyword, int page) { List<Map<String, String>> result = new ArrayList<>(); try { Document document = getDocument(baseUrl + "&wd=" + keyword + "&pn=" + (page * 10)); Elements els = document.getElementsByClass("result"); for (Element el : els) { Map<String, String> map = new HashMap<>(); try { map.put("id", el.attr("id")); map.put("title", el.getElementsByTag("a").get(0).text()); map.put("url", el.getElementsByClass("f13").get(0).getElementsByTag("a").text()); result.add(map); } catch (Exception e) { } } } catch (Exception e) { e.printStackTrace(); } return result; } /** * 分析在指定關鍵字在百度的排名 * * @param keyword 關鍵字 * @param url要找的目標包含的url * @param maxPage 最多找幾頁,防止死迴圈 * @return 找得到返回map 超過最大頁碼還找不到返回null */ public static Map<String, String> BaiduRanking(String keyword, String url, int maxPage) { System.out.println("開始查詢百度中關鍵字為 \"" + keyword + "\" 且url包含 \"" + url + "\" 的相關資料排名 最多查詢 " + maxPage + "頁"); for (int i = 0; i < maxPage; i++) { // 輸出當前頁碼和個數,不需要輸出可以去掉 System.out.println("正在查詢第" + i + "頁中的第" + (i * 10 + 1) + " ~ " + ((i + 1) * 10) + "個"); List<Map<String, String>> list = spider(keyword, i); for (Map<String, String> map : list) { if (map.get("url").contains(url)) { return map; } } } return null; } public static void main(String[] args) { /* * 例如 找關鍵字 極簡桌布 主要的網址特徵 bz.zzzmh.cn 最多找20頁 (相當於找1~200箇中有無匹配) * 若有匹配返回 id title url * 若無匹配返回 Null */ System.out.println(BaiduRanking("極簡桌布", "zzzmh.cn", 20)); } }
效果
1、網站標題: zzzmh's blog 網站url: https://zzzmh.cn
引數:
關鍵字: "zzzmh" 目標包含url: "zzzmh.cn" 最多查詢頁數: "20"
執行結果:
開始查詢百度中關鍵字為 "zzzmh" 且url包含 "zzzmh.cn" 的相關資料排名 最多查詢 20頁 正在查詢第0頁中的第1 ~ 10個 正在查詢第1頁中的第11 ~ 20個 {id=13, title=zzzmh's Blog - Design By zmh, url=https://zzzmh.cn/百度快照}
2、網站標題: 極簡桌布... 網站url: https://bz.zzzmh.cn
引數:
關鍵字: "極簡桌布" 目標包含url: "zzzmh.cn" 最多查詢頁數: "20"
執行結果:
開始查詢百度中關鍵字為 "極簡桌布" 且url包含 "zzzmh.cn" 的相關資料排名 最多查詢 20頁 正在查詢第0頁中的第1 ~ 10個 正在查詢第1頁中的第11 ~ 20個 正在查詢第2頁中的第21 ~ 30個 正在查詢第3頁中的第31 ~ 40個 正在查詢第4頁中的第41 ~ 50個 正在查詢第5頁中的第51 ~ 60個 正在查詢第6頁中的第61 ~ 70個 正在查詢第7頁中的第71 ~ 80個 正在查詢第8頁中的第81 ~ 90個 正在查詢第9頁中的第91 ~ 100個 {id=93, title=極簡桌布_極致嚴選高清電腦桌面桌布美圖4k_最潮桌面桌布網站, url=https://bz.zzzmh.cn/百度快照}
3、網站標題: 極簡外掛... 網站url: https://chrome.zzzmh.cn
引數:
關鍵字: "極簡外掛" 目標包含url: "zzzmh.cn" 最多查詢頁數: "20"
執行結果:
開始查詢百度中關鍵字為 "極簡外掛" 且url包含 "zzzmh.cn" 的相關資料排名 最多查詢 20頁 正在查詢第0頁中的第1 ~ 10個 正在查詢第1頁中的第11 ~ 20個 正在查詢第2頁中的第21 ~ 30個 正在查詢第3頁中的第31 ~ 40個 正在查詢第4頁中的第41 ~ 50個 正在查詢第5頁中的第51 ~ 60個 正在查詢第6頁中的第61 ~ 70個 正在查詢第7頁中的第71 ~ 80個 正在查詢第8頁中的第81 ~ 90個 正在查詢第9頁中的第91 ~ 100個 正在查詢第10頁中的第101 ~ 110個 正在查詢第11頁中的第111 ~ 120個 正在查詢第12頁中的第121 ~ 130個 正在查詢第13頁中的第131 ~ 140個 正在查詢第14頁中的第141 ~ 150個 正在查詢第15頁中的第151 ~ 160個 正在查詢第16頁中的第161 ~ 170個 正在查詢第17頁中的第171 ~ 180個 正在查詢第18頁中的第181 ~ 190個 正在查詢第19頁中的第191 ~ 200個 null
補充:
- 有結果返回map包含id、title、url。沒有結果返回 Null
- 百度搜索的url可以指定rn頁碼,最多一頁50個,使用後有效減少了連線次數。但親測下來設定過rn以後的結果與實際使用者在百度搜索的結果排序和個數都有出入。故選擇用預設rn來檢測,效果最準確。
本篇部落格也發表在了我的個人主頁,歡迎檢視,地址 https://zzzmh.cn/singe?id=58