黑帽联盟

 找回密码
 会员注册
查看: 1619|回复: 1
打印 上一主题 下一主题

[技术文章] 网站全自动收录抽查系统思路概述

[复制链接]
yun 黑帽联盟官方人员 

920

主题

37

听众

1364

积分

超级版主

Rank: 8Rank: 8

  • TA的每日心情
    奋斗
    2019-10-18 11:20
  • 签到天数: 678 天

    [LV.9]以坛为家II

    SEO的数据分析II – 如何改善网站收录”一文中详细介绍了如何从分析网站收录到改善收录率来提升SEO流量,这个任务需要我们建立一个体系来监控不同类型页面甚至是不同频道的收录率以便于长期掌控SEO流量的走势。但是大中型网站少则以万计的URL数量导致了收录的监控本身成了个很繁琐的事情,那么较效率又不失精度的解决办法就是随机抽样来查收录率(可参考天极网废小米的百度收录抽查一文),但是如果没有技术上的配合,手动做这个事情的话依旧费时费力而且不讨巧,比如用excel来做随机抽样,一来效率低下,二来单条URL的抽中概率无法保证。因此,建立一个全自动收录抽查系统势在必行。

    这篇文章主要是谈一下思路,具体的代码实现各位可以使用自己熟悉的语言去写,python,shell啥的都可以。我用的是shell写的,因为lynx -dump抽取URL的功能实在是太方便了。尽管python没有lynx库,但是如果你系统安装了lynx并且能够通过命令行调用到lynx的话也是一样的,我懒得折腾了而已。

    由于lynx是这个脚本的核心,所以花些时间重点说明一下吧,更何况像centos等操作系统默认是没有安装lynx的,我们需要手工安装。首先ssh或者使用putty登陆到服务器,然后下载lynx安装包。我下载的是2.8.7版本,在命令行中输入wget http://lynx.isc.org/release/lynx2.8.7.tar.bz2 。下载完成后进行解压bunzip2 lynx2.8.7.tar.bz2 。得到lynx2.8.7.tar后再解压一下tar -xvf lynx2.8.7.tar 。然后进入目录cd lynx2-8-7。然后输入 ./configure,在完成后输入make install就可以了,如果登陆服务器用的不是root账号得要sudo make install,否则会提示permission denied报错。如果你是sudo安装的lynx,shell脚本中一定要补全lynx的路径来做网址查询,因为cron执行的任务是不会使用用户账号的环境变量的,而路径通常是/usr/local/bin/lynx,当然不同操作系统可能会有细微不同,我们用whereis lynx查询一下具体路径即可。

    接下来开始讲正题,思路是这样子的,我们先将这个系统分成两个部分:
    第一部分为本篇文章的重点也就是抓取网站分类页及产品页URL,并随机等概率的抽取URL。第二部分为批量检查这两类URL的收录,并且输出数据。

    先从第一部分做起来,整个流程其实类似于爬虫抓取网站:
    第一步,我们定义好我们自己的起点(可以是首页也可以是其他的频道页等,挑选起点的原则是保证大部分分类页都能被一次提取到),接着利用lynx去挨个遍历这些起点页URL,注意抓取深度只有这1层,然后利用grep将分类页URL利用正则表达式的具体规则提取出来,再下来对刚才得到的所有分类页URL列表进行去重后保存为fenleiye.txt。如果需要监控的频道比较多的话,在正则规则上稍作变化分别提取多保存几个文件也就可以了。这里为了简单起见就一视同仁都当分类页提取了。

    第二步,接下来我们开始第二轮的抓取,同样抓取深度为1层,对于一个网站而言事实上总共只抓了两层而已,但是视网站规模大小这第二次抓取的耗时可能会相当长。同样我们利用lynx去挨个遍历这些分类页URL,利用正则提取产品页的所有URL并去重保存为chanpinye.txt。

    第三步,通过刚才的两步我们已经得到所有的分类页及产品页URL列表了,现在的问题是将其从中按照一定的比例随机抽样出来,注意此处的随机算法需要保证所有的URL都拥有相同的抽中概率,并且保证所有的URL都一定有被抽过,这么做就能最大限度地保证抽样结果的公正性。我的算法是这么设计的:首先定义期望的随机抽样结果数量变量samplingno,假设我们定义为2000,也就是说我们希望理想情况下最终能从URL列表中抽样个2000条URL出来。其次,定义分类页URL数量变量为fenleiyeno,假设为8000。那么按照假设每个URL被抽中的概率就是2000/8000=1/4=25%,那么我们对每条URL生成区间为1-4的随机整数,如果随到1(25%的概率),那么代表该URL抽中并将该条URL输出到抽样结果列表当中。这里需要注意的是一个四舍五入的问题,因为刚才fenleiyeno是8000,除以samplingno的2000得出的区间上限为4,但如果分类页数量是9001的话,做整除得出的还是4(shell中expr的除法默认是整除),这样会导致抽出的样本数最终偏多,因此判断一下如果小数位>0.5则区间上限自增1。在9001这个情况下就是5,那么每条20%的概率,抽出来大概在1900条左右的样子,也就可以了。

    至此第一部分完工。我们得到了下图分类页及产品页抽样后的URL列表。

    201306251447137481.png

    第二部分也不难,有了列表后我们只需要批量去百度查收录即可,偷懒的话直接用zero写的批量查百度收录的python脚本即可,或者自己动手写一个类似的脚本也行,用shell的话,核心的采集代码就一行。由于现成的解决方案太多这部分我就不细说了。

    在上面脚本都写完调试完后,将脚本加入服务器的cron任务,每周一凌晨跑一下(如果数据量小的话每天跑都行),这样等到周一上班的时候就等着看现成的数据吧。

    帖子永久地址: 

    黑帽联盟 - 论坛版权1、本主题所有言论和图片纯属会员个人意见,与本论坛立场无关
    2、本站所有主题由该帖子作者发表,该帖子作者与黑帽联盟享有帖子相关版权
    3、其他单位或个人使用、转载或引用本文时必须同时征得该帖子作者和黑帽联盟的同意
    4、帖子作者须承担一切因本文发表而直接或间接导致的民事或刑事法律责任
    5、本帖部分内容转载自其它媒体,但并不代表本站赞同其观点和对其真实性负责
    6、如本帖侵犯到任何版权问题,请立即告知本站,本站将及时予与删除并致以最深的歉意
    7、黑帽联盟管理员和版主有权不事先通知发贴者而删除本文

    头像被屏蔽

    0

    主题

    0

    听众

    8

    积分

    黑帽菜鸟

    Rank: 1

  • TA的每日心情
    开心
    2017-2-16 11:52
  • 签到天数: 2 天

    [LV.1]初来乍到

    提示: 该帖被管理员或版主屏蔽
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 会员注册

    发布主题 !fastreply! 收藏帖子 返回列表 搜索
    回顶部