网站信息采集系列(五)--百度新闻

本文实现在百度新闻搜索栏中自动输入关键字搜索(以“军事”为例),并自动采集搜索的内容,采集内容包含新闻标题,链接,来源,时间,摘要,并显示在表中,并将效果如下图所示:

 

1.网页分析

关键字搜索框及点击按钮

网站信息采集系列(五)--百度新闻_第1张图片

直接使用ID来确定,比较方便。

搜索到的内容:

网站信息采集系列(五)--百度新闻_第2张图片

里面的内容比较多,需要找下,下面直接贴代码。

2.主要代码

输入关键字并点击搜索按钮

var input_element = document.getElementById('ww');

input_element.value = 'mykeyword';

input_element = document.getElementById('s_btn_wr');

input_element.click();

获取页面指定内容

var contentElement = document.getElementById('content_left');

if (contentElement){

    var newsElements = contentElement.getElementsByClassName('result-op');

    if (newsElements && newsElements.length > 0){

        for (var i = 0;i < newsElements.length;i ++){

            //标题和链接

            var title = '',link = '';

            var titleElements = newsElements[i].querySelectorAll('h3 a');

            if (titleElements && titleElements.length > 0){

                link = titleElements[0].getAttribute('href');

                title = titleElements[0].innerText;

            }

            //来源,时间

            var time = '',source = '';

            var tsElements = newsElements[i].querySelectorAll('.c-row .c-span-last .news-source_Xj4Dv  span');

            if (tsElements && tsElements.length > 1){

                source = tsElements[0].innerText;

                time   = tsElements[1].innerText;

            }

            //摘要

            var abstract = '';

            var absElements = newsElements[i].querySelectorAll('.c-row .c-span-last > span');

            if (absElements && absElements.length > 0)

                abstract = absElements[0].innerText;

        }

        /*点击下一页*/

        var nextAElements = document.querySelectorAll('#page .page-inner a');

        if (nextAElements){

            nextAElements[nextAElements.length - 1].click();

        }

    }

}

3 翻页控制

点击下一页时,网页会释放窗口,然后再创建新窗口,因此翻页控制不能在当前窗口中进行,必须由主程序控制(我这里是QT),具体是在网页导入完成后再确定是否翻页,代码如下:

    if (_urlStr.contains("baidu.com/s") && _urlStr.contains("tn=news")){

        int _curPage = 0;

        //如果没有key=pn的值,表示是第一页

        if (_urlQuery.hasQueryItem("pn"))

            _curPage = _urlQuery.queryItemValue("pn").toInt() / 10;

        else

            _curPage = this->currentPage = 0;

        //只有当前翻页次数与this->currentPage相等时才能获取信息

        //baidu_news-2.js里面会点击一次下一页

        if (_curPage == this->currentPage){

            //小于用户设置的翻页次数

            if (this->currentPage <=mypages){

                jscode = *获取网页的内容代码*l

                webView->page()->runJavaScript(jscode,[&](const QVariant&){});

                this->currentPage = _curPage + 1;

            }

        }

    }

你可能感兴趣的:(C++,/,QT,HTML,HTTP,百度,css,html)