Thinking——nodejs实现的SEO相关的库

SEO

SEO是为了网站在搜索引擎中的自然排名更靠前,引入更多的用户流量。SEO有很多技巧,譬如官网多发优质文章,文章的url做成静态化,文章多出现一些搜索相关的关键字,自建站群等等。

百度收录

百度定期会对优质文章进行收录(原创程度高),如何判断文章是否被收录呢?有个简单的方法:
直接在百度的搜索框输入文章的链接,如果有结果且结果里就有对应文章的链接,就说明这篇文章被收录。

代码实现

自己用nodejs封装了一个查询收录和计算文章原创度的库,已放置于Github上,这里对isURLIncluded接口梳理一下自己的思路,原理很简单,就是上文讲的方法,只是有些细节。

isURLIncluded

const baiduSearchUrl = 'https://www.baidu.com/s?wd=';

async function isURLIncluded(url) {
    url = url.trim();
    let urlParsed = URL.parse(url);
    let body = await sendRequest(baiduSearchUrl + url);
    let $ = cheerio.load(body);
    let firstBlock = $('#1');
    let emptyBlock = $('#container .content_none');
    if(firstBlock.length > 0) {
        let firstLinkText = firstBlock.find('.f13 > a > b').eq(0).text();
        // 三个.和四个.都会有
        firstLinkText = firstLinkText.split('...')[0].trim();
        // 域名开头
        // 带protocol
        if(url.substr(0, firstLinkText.length) === firstLinkText) {
            return true;
        }
        let protocol = urlParsed.protocol + "//";
        let urlNoProtocol = url.substr(protocol.length);
        return urlNoProtocol.substr(0, firstLinkText.length) === firstLinkText
    } else if(emptyBlock.length > 0) {
        return false;
    } else {
        throw new Error('访问频率过快');
    }
}

思路

直接调用百度接口查询后,要考虑到情况如下:

├── 网络正常 
     |── 有查询结果
     |── 无查询结果
     |── 其他错误(如百度反爬虫策略)
├── 网络出错
有查询结果我是用html中id=1的元素(也就是第一个查询到的结果)判断的

clipboard.png

无查询结果有两种情况(一种存在class=content_none元素,一种存在hit_top_new元素)

clipboard.png

clipboard.png

对于我有查询结果的情况,我把百度给我的链接和输入链接进行比对

百度给的链接(标绿色的部分)会有省略号(,三个点和四个点都有),所以我用了统一用三个点进行截断,取第一部分

 firstLinkText = firstLinkText.split('...')[0].trim();

然后用这部分字符串和输入的链接进行比对(分两种,因为有时候百度给的结果有协议头,有时候没有)
带协议头比较

if(articleUrl.substr(0, firstLinkText.length) === firstLinkText) {
    return true;
}

不带协议头比较

let protocol = urlParsed.protocol + "//";
let articleUrlNoProtocol = articleUrl.substr(protocol.length);
return articleUrlNoProtocol.substr(0, firstLinkText.length) === firstLinkText

clipboard.png

clipboard.png

clipboard.png


Salamander
上帝在我很小的时候送给我了两个苹果,一个红苹果,一个蓝苹果。红苹果代表疯狂,蓝苹果代表思考
6.7k 声望
407 粉丝
0 条评论
推荐阅读
Java AtomicInteger类使用
这个问题发生的原因是++counter不是一个原子性操作。当要对一个变量进行计算的时候,CPU需要先从内存中将该变量的值读取到高速缓存中,再去计算,计算完毕后再将变量同步到主内存中。这在多线程环境中就会遇到问...

pigLoveRabbit2阅读 2.3k

从零搭建 Node.js 企业级 Web 服务器(十五):总结与展望
总结截止到本章 “从零搭建 Node.js 企业级 Web 服务器” 主题共计 16 章内容就更新完毕了,回顾第零章曾写道:搭建一个 Node.js 企业级 Web 服务器并非难事,只是必须做好几个关键事项这几件必须做好的关键事项就...

乌柏木66阅读 6.2k评论 16

从零搭建 Node.js 企业级 Web 服务器(一):接口与分层
分层规范从本章起,正式进入企业级 Web 服务器核心内容。通常,一块完整的业务逻辑是由视图层、控制层、服务层、模型层共同定义与实现的,如下图:从上至下,抽象层次逐渐加深。从下至上,业务细节逐渐清晰。视图...

乌柏木44阅读 7.4k评论 6

从零搭建 Node.js 企业级 Web 服务器(二):校验
校验就是对输入条件的约束,避免无效的输入引起异常。Web 系统的用户输入主要为编辑与提交各类表单,一方面校验要做在编辑表单字段与提交的时候,另一方面接收表单的接口也要做足校验行为,通过前后端共同控制输...

乌柏木33阅读 6.2k评论 9

从零搭建 Node.js 企业级 Web 服务器(五):数据库访问
回顾 从零搭建 Node.js 企业级 Web 服务器(一):接口与分层,一块完整的业务逻辑是由视图层、控制层、服务层、模型层共同定义与实现的,控制层与服务层实现了业务处理过程,模型层定义了业务实体并以 对象-关系...

乌柏木34阅读 4.6k评论 9

从零搭建 Node.js 企业级 Web 服务器(十三):断点调试与性能分析
Node.js 官方提供了断点调试机制,出于安全性考虑默认为关闭状态,可以通过 node 参数 --inspect 或 --inspect-brk 开启,配合 IDE 能够非常方便地调试代码,本章就上一章已完成的项目 licg9999/nodejs-server-ex...

乌柏木31阅读 3.9k评论 9

从零搭建 Node.js 企业级 Web 服务器(八):网络安全
计算机网络依据 TCP/IP 协议栈分为了物理层、网络层、传输层、应用层,通常基础设施供应商会解决好前三层的网络安全问题,需要开发者自行解决应用层的网络安全问题,本章将着重表述应用层常见的网络安全问题及处...

乌柏木33阅读 5.8k评论 1

6.7k 声望
407 粉丝
宣传栏