百度搜索结果html分析

杨某某      2022-02-11     720

关键词:

目的:

为了从搜索结果中提取所有网页,以备后续处理。

 

访问百度链接分析

名称 说明
wd 任意文字 关键字
rn 可以不指定,默认为10,最大为50,最小为1,可设置为任意值 一页包含的结果条目数
pn 百度默认显示760条,所以最后一页为pn=750 第一条结果的索引位置

示例:

https://www.baidu.com/s?wd=老虎&pn=10&rn=3

关键字:老虎,第10条记录,每页显示3条。所以打开的是以老虎为关键字,第四页的记录

 

HTML源文件分析

刚下载的html源文件格式非常混乱,可使用在线html格式化工具进行格式化,以便阅读。

根据我的需求,在HTML文件中,<script>元素与<style>元素可以直接跳过。找到搜索结果所在的位置即可。

image

 

image

 

 

提取搜索结果(Qt实现)

在Qt中,使用QDomDocument 或 QXmlStreamReader 来解析 HTML 文件都失败了。经分析,其原因是:QDomDocument 或 QXmlStreamReader都是针对解析XML文件设计的。HTML与XML的区别

经过查找资料,TidyLib 库正好可以解决问题。包包

Tidy is a console application for Mac OS X, Linux, Windows, UNIX, and more. It corrects and cleans up HTML and XML documents by fixing markup errors and upgrading legacy code to modern standards.

libtidy is a C static and dynamic library that developers can integrate into their applications in order to bring all of Tidy’s power to your favorite tools. libtidy is used today in desktop applications, web servers, and more.

TidyLib将HTML会修复文件可能的格式错误,并输出XHTML。XHTML格式符合XML规范,可以使用QDomDocument 或 QXmlStreamReader 来解析。也可以使用TidyLib库自带的解析函数提取想要的元素。

 

#ifndef HTMLPARSE_H
#define HTMLPARSE_H

#include <QDomDocument>

class HtmlParse
{
public:
    HtmlParse();

    bool setDatas(const QByteArray& datas);

    QList<QDomElement> getResults();
private:

private:
    QDomDocument doc;
};

#endif // HTMLPARSE_H


/*********************************************************************************/


#include "htmlparse.h"
#include <QDataStream>
#include <QTextStream>
#include <QDebug>

#include "tidy.h"
#include "tidybuffio.h"
#include "tidyenum.h"
#include "tidyplatform.h"
#include "errno.h"

#include <QStandardPaths>
#include <QDir>
#include <QDomDocument>
#include <QRegularExpression>
#include <QRegularExpressionMatch>

HtmlParse::HtmlParse()
{

}

bool HtmlParse::setDatas(const QByteArray &datas)
{
    bool result = false;
    TidyBuffer output = {0};
    TidyBuffer errbuf = {0};
    int rc = -1;
    Bool ok;

    TidyDoc tdoc = tidyCreate();                        // Initialize "document"

    ok = tidyOptSetBool( tdoc, TidyXhtmlOut, yes );     // Convert to XHTML
    if ( ok )
         rc = tidySetErrorBuffer( tdoc, &errbuf );      // Capture diagnostics
    if ( rc >= 0 )
         rc = tidyParseString( tdoc, datas.data() );    // Parse the input
    if ( rc >= 0 )
         rc = tidyCleanAndRepair( tdoc );               // Tidy it up!
    if ( rc >= 0 )
         rc = tidyRunDiagnostics( tdoc );               // Kvetch
    if ( rc > 1 )                                       // If error, force output.
         rc = ( tidyOptSetBool(tdoc, TidyForceOutput, yes) ? rc : -1 );
    if ( rc >= 0 )
         rc = tidySaveBuffer(tdoc, &output);            // Pretty Print

    if ( rc >= 0 )
    {
        if (doc.setContent(QByteArray((char *)output.bp)))
        {
            result = true;
        }
    }

    tidyBufFree( &output );
    tidyBufFree( &errbuf );
    tidyRelease( tdoc );

    return result;
}



QList<QDomElement>& findResults(const QDomNode& pnode, const QString& tagName, const QHash<QString, QString>& validators, QList<QDomElement>& results)
{
    QDomNode n = pnode.firstChild();

    while (!n.isNull())
    {
        if (n.isElement())
        {
            // 递归,当前节点的子节点
            findResults(n, tagName, validators, results);

            QDomElement elm = n.toElement();

            // 需要检测tagName时,如果tagName不符合则跳过
            if (!tagName.isEmpty() && elm.tagName() != tagName)
            {
                n = n.nextSibling();
                continue;
            }

            // 取出当前节点的所有键值对
            QHash<QString, QString> ha;
            auto attrs = elm.attributes();
            for (int i = 0; i < attrs.count(); i++)
            {
                QDomAttr attr = attrs.item(i).toAttr();
                ha.insert(attr.name(), attr.value());
            }

            bool isValid = true;

            QHash<QString, QString>::const_iterator it = validators.begin();
            while (it != validators.end())
            {
                QHash<QString, QString>::const_iterator fi = ha.find(it.key());
                if (fi == ha.end())
                {
                    isValid = false;
                    break;
                }

                // 如果为空,则跳过
                if (it.value().isEmpty())
                {
                    it++;
                    continue;
                }

                QRegularExpression exp(it.value());
                QRegularExpressionMatch mc = exp.match(fi.value());
                if (!mc.hasMatch())
                {
                    isValid = false;
                    break;
                }
                it++;
            }
            if (isValid)
                results.append(elm);
        }

        // 下一个兄弟节点
        n = n.nextSibling();
    }

    return results;
}

QList<QDomElement > HtmlParse::getResults()
{
    QList<QDomElement> elements;
    QList<QDomElement> hrefElements;
    QHash<QString, QString> validators;
    validators.insert("class", "result");
    validators.insert("id", "\\d+");
    validators.insert("srcid", "\\d+");

    findResults(doc, "div", validators, elements);

    qDebug() << elements.count();

    for (auto var : elements)
    {
        qDebug() << var.attribute("id");

        validators.clear();
        validators.insert("href", "");
        findResults(var, "a", validators, hrefElements);
        for (auto href : hrefElements)
        {
            qDebug() << href.text() << href.attribute("href");
        }
    }

    return hrefElements;
}

百度搜索法的评价分析

...  好处:现代有一句话叫有问题问度娘,足以见出百度现在在人们心中的地位,在百度中可以查到大部分你想要的,并且实时更新数据,并推荐实时热点给你坏处:有时候推荐的东西没有营养,广告应该提高门槛记住用户... 查看详情

对百度搜索法的分析评价

...者关不掉,也有很多的标题党与事实不符,和搜狗相比,百度更加严肃,提供的大部分都是相关热点,而搜狗比较年轻化,会有很多有意思的段子等,页面布局不合理,可以充分利用一下(对比搜狗页面)。 记住用户选择:... 查看详情

html如何实现圆角的百度搜索框?

 <formaction="http://www.baidu.com/baidu"target="_blank"> <inputtype="text"name="word"size="60"style="height:60px;width:1100px;background-color:#9a9a9a26;"> <inputtyp 查看详情

百度鲜花图像爬取

...应进行分析从中获取想要爬取的数据,本例子利用代码在百度图片上搜索鲜花,将搜索到的图片保存到本地。首先对百度图片搜索鲜花页面进行分析,图片是不断动态 查看详情

用elasticsearch搭建自己的搜索和分析引擎

...:互联网产品中的检索功能随处可见。当你的项目规模是百度大搜|商搜或者微信公众号搜索这种体量的时候,自己开发一个搜索引擎,加入各种定制的需求和优化,是非常自然的事情。但如果只是普通的中小型项目甚至创业团... 查看详情

以图搜图图像匹配_百度识图:以图搜图找到相似图片原理分析

百度识图:以图搜图找到相似图片原理分析1.玩转百度识图"鉴"你所见,百度人脸识别。打开百度首页,搜索框右侧有一个相机图标,就是百度识图。你可以用一张图片,搜索互联网上所有与它相似的图... 查看详情

javascript实现百度搜索页面

JavaScript实现百度搜索页面HTML<!DOCTYPEhtml><html><head><metacharset="UTF-8"><title>百度一下,你就知道</title><!--引入百度icon小图标--><linkrel="shortcuticon"href="https://www.bai 查看详情

node_1

...s获取json的数据后,然后改变html中的数据seo搜索引擎优化百度排名高,需要把一些东西后端渲染百度只能识别html文件内容,不识别js文件内容百度只分析:文字,链接(讲究相关性,正 查看详情

分析师:百度到2030年可能成为中国市值最高的公司

摘要:独立分析师表示,百度有多元化的竞争业务组合:搜索引擎、人工智能云、智能设备和智能驾驶,结合百度的市场渗透率、品牌知名度、中国云业务的增长、以及百度在技术方面的领先地位来看,百度... 查看详情

分析师:百度到2030年可能成为中国市值最高的公司

摘要:独立分析师表示,百度有多元化的竞争业务组合:搜索引擎、人工智能云、智能设备和智能驾驶,结合百度的市场渗透率、品牌知名度、中国云业务的增长、以及百度在技术方面的领先地位来看,百度... 查看详情

python轻松爬取百度搜索信息

...丝加我好友,希望能让我帮忙做一些事情,就是对百度的搜索结果进行采集,同时对格式进行处理,至于具体的用处我也没有太关注,毕竟粉丝也包了一个大红包& 查看详情

python轻松爬取百度搜索信息

...丝加我好友,希望能让我帮忙做一些事情,就是对百度的搜索结果进行采集,同时对格式进行处理,至于具体的用处我也没有太关注,毕竟粉丝也包了一个大红包& 查看详情

https抓包详细分析

专题二:实际抓包分析本文对百度搜索进行了两次抓包,第一次抓包之前清理了浏览器的所有缓存;第二次抓包是在第一次抓包后的半分钟内。百度在2015年已经完成了百度搜索的全站https,这在国内https发展中具... 查看详情

模拟百度搜索框

在使用百度搜索是,页面会根据我们输入的内容自动匹配一些候选内容。实现的主要过程主要是:1、用户在输入一个字符结束后,在onkeyup事件中获取用户输入的内容。2、根据获取到的内容向服务器发送请求,匹配到相似的数据... 查看详情

javascript_dom百度搜索框

今天给大家带来的事一个简单的百度的历史搜索框,大家在搜索东西的时候,百度会自动给你显示你最近搜索过的一些东西,那这个拿js怎么做呢?我们一起来学习吧这是一个HTML页面:1<!DOCTYPEhtml>2<html>3<head>4<metac... 查看详情

哪个搜索引擎最好用?

...圾SEO的存活时间不长,但是其竞价排名缺严重干扰了正常搜索结果。2.创新和品牌比较:Goole的创新精神一直被称道,譬如Gmail、GoogleMap、GoogleTalk等产品被网民赞叹不已。百度也有创新比如“贴吧”,与传统论坛和GoogleGroup等有些... 查看详情

2018-2019-120189215《文献管理与信息分析》第二周课程学习总结

...数据库。2.3常用搜索引擎及使用方法常用的搜索引擎有:百度、谷歌、360、bing必应、搜狗等(国内可以访问到谷歌搜索的镜像)。使用方法:高级搜索逻辑搜索命令搜索site:指定在特定网站进行检索(site:百度识别中文和英文... 查看详情

手机地图的国内手机地图玩家分析

与搜索、应用分发和本地生活服务齐平的入口百度地图在各个图层上已经有不少积累。将底图数据收集的活儿交给第三方来做,如四维图新和灵图。自身专注于POI数据的收集。例如鼓励连锁店和中小企业去百度地图标注。百度已... 查看详情