资讯专栏INFORMATION COLUMN

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

陈伟 / 2649人阅读

摘要:没有结果返回百度搜索的可以指定页码,最多一页个,使用后有效减少了连接次数。但亲测下来设置过以后的结果与实际用户在百度搜索的结果排序和个数都有出入。

一直有一个需求,希望看到自己网站在百度的实时的排名
用过一些工具,要么反应迟钝,要么结果不准确或不实时
于是打算用jsoup写一个小爬虫来实时百度看网站排名

直接上代码



依赖只有jsoup
jar包下载地址:https://mvnrepository.com/artifact/org.jsoup/jsoup
或者引入
maven依赖


    org.jsoup
    jsoup
    1.11.3



代码

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> spider(String keyword, int page) {
        List> result = new ArrayList<>();
        try {
            Document document = getDocument(baseUrl + "&wd=" + keyword + "&pn=" + (page * 10));
            Elements els = document.getElementsByClass("result");
            for (Element el : els) {
                Map 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 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> list = spider(keyword, i);
            for (Map 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

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/73116.html

相关文章

  • Java爬虫之利用Jsoup自制简单的搜索引擎

    摘要:的官方网址为,其使用手册网址为本次分享将实现的功能为利用爬取某个搜索词语暂仅限英文的百度百科的介绍部分,具体的功能介绍可以参考博客爬虫自制简单的搜索引擎。   Jsoup 是一款Java 的HTML解析器,可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API,可通过DOM,CSS以及类似于jQuery的操作方法来取出和操作数据。Jsoup的官方网址为: https:...

    GHOST_349178 评论0 收藏0
  • Python爬虫笔记1-爬虫背景了解

    摘要:学习爬虫的背景了解。但是搜索引擎蜘蛛的爬行是被输入了一定的规则的,它需要遵从一些命令或文件的内容,如标注为的链接,或者是协议。不同领域不同背景的用户往往具有不同的检索目的和需求,搜索引擎无法提供针对具体某个用户的搜索结果。 学习python爬虫的背景了解。 大数据时代数据获取方式 如今,人类社会已经进入了大数据时代,数据已经成为必不可少的部分,可见数据的获取非常重要,而数据的获取的方式...

    oujie 评论0 收藏0
  • Java爬虫之爬取中国高校排名前100名并存入MongoDB中

    摘要:介绍在博客爬虫爬取中国高校排名前名并写入中,我们利用来写爬虫,将中的大学排名表格爬取出来,并存入到中。本次分享将用的来实现相同的功能,并将爬取到的数据存入到数据库中。 介绍   在博客:Python爬虫——爬取中国高校排名前100名并写入MySQL中,我们利用Python来写爬虫,将http://gaokao.xdf.cn/201702/1... 中的大学排名表格爬取出来,并存入到My...

    jzzlee 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<