Jsoup爬虫获取自己网站在百度搜索中的实时排名

42次阅读

共计 4816 个字符,预计需要花费 13 分钟才能阅读完成。

一直有一个需求,希望看到自己网站在百度的实时的排名用过一些工具,要么反应迟钝,要么结果不准确或不实时于是打算用 jsoup 写一个小爬虫来实时百度看网站排名
直接上代码
依赖只有 jsoupjar 包下载地址: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/single?id=58
END

正文完
 0