程序实现百度批量查排名的两种方法。

自己之前参考了ZERO的 全自动监控网站关键词排名(Python实现)写了一个批量查排名的脚本,但自从百度8月31日更新后就失效了,这个脚本自己每天都得用,研究了百度更新后的源码自己也就重新给修改了,目前自己想到的有两种思路从百度源码中取到关键词的排名,贴出来希望能有同行来探讨探讨。

一:指定要查询的关键词的链接:http://www.baidu.com/s?wd=%s&pn=%d&rn=100

上面链接中%s 表示要查询的关键词,%d 表示要查询从第几位至第几位(如果值为0,则查询1-100位,如果值为100,则查询101-200位,以此类推)

二、下载上面那条链接的网页源码。

这里要说一下,百度刚更新后的那几天下载的源码总是下载不全,搞得我很痛苦,然后自己乱摸索,说是页面经过gzip处理过的,需要用gzip处理啥啥的,在网上找到了python读取gzip数据,问题给解决了,只是有点不太完美。后来也有请教了ZERO,只要在他的curl.py之间加一句即可:c.setopt(ENCODING, ‘gzip’)  。gzip这方面至今有点弄不懂,到底是网页有经过gzip压缩就得用这种方式进行下载,还是用gzip压缩网页源码后再下载下来?这个要研究研究下。

也不知道从哪天起,不用gzip,源码也可以完整下载下来了,不过这个弄明白了总是有用的。

三、以前百度的搜索结果标题的超链接是网站链接明码,现在都给加密成百度跳转了,类似这样:

百度链接加密成跳转了

 

百度快照左边的链接

所以现在想要从源码中找到自己的网站网址也就只能从百度快照左边的链接下手(上图)。但是,问题来了,我搜索的关键词是:SUV汽车,你有没有看到上面网址中的 suv 三个字符也被加粗了,在网页源码中以这样的形式  www.chn<b>suv</b>.com/ 出现,为了能够顺利在源码中匹配到自己的网站网址,这一步,需要将下载后的源码中的<b> 和 </b> 标签全部清除掉

四、这一步要实现从源码中得出自己的网站排名。ZERO以前的那份代码是通过循环来判断的,但百度更新后在源码中能找到类似 id="4" ,这个ID号代表你的网站的排名位数。所以我的第一个思路是:在源码中找到你的网站网址,然后跟最临近的一个ID号取出来,这样就得到了排名位数。当然,我在实现过程中也碰到问题,因为要先找到网址,再取得ID号,但是在百度的源码中,ID是在网址的前面(下图),在找到网址后要匹配到在其前面的ID,用类似这样的正则表达式:id="\d{1,3}".*?<span class="g">网址  ,就总会先匹配到ID号例如 id="1",没法确定其排名,所以,我采取的方法是向下匹配,匹配下一位排名的ID号,然后再减去1。具体的正则表达式是:<span class="g">.{0,50}网址.*?id="(\d{1,3})" ,得到ID号后再减去1,这样就得到了第1至第99位的排名,第100名无法再向下匹配到ID号,但可以直接将id=100 这段<span class="g"> </span> 代码里面的内容取出来,再判断网址有没有出现在这里面,有的话说明网站的排名为第100名。  

百度网页源码中的ID号

(点击查看大图)

这是一种思路,我用程序实现的就是这个,另外还有一种思路我没用程序实现出来:

就是在源码中循环匹配 id为 1至100的<span class="g"> </span> 代码里面的内容,如果网址匹配到了,也就得到排名了。

这两种思路我自己感觉应该是第一种的执行效率要比较高,如果哪位还有更好的方法欢迎探讨。

题外话:

SEO技术方面的,如果遭遇了瓶颈但还想要有所突破,建议读一读ZERO的两个博客: 技术领域SEM WATCH

 

  • 除注明外,文章均为拒绝闷骚原创。文明转载请注明出处,谢谢!
  • 原创文章代表陈典榕个人观点,不足之处请点此给我提提建议或和我交流。
  • 本文地址:http://www.chendianrong.com/527.html
  • 您还不了解拒绝闷骚?请查看 关于本站
  • 发表评论?

    2 条评论。

    1. 思路不错,我是采用另外一种匹配方式,百度加密的URL有一段是代表域名的,所以就用这一段进行匹配,具体描述在这个文章http://www.zhidaow.com/?p=328,还望指点。

    2. 不错嘛,支持一下!我很少查百度排名,最多查查PR

    发表评论