当梦想照进现实

python批量查询百度收录

2014.04.11

Albert与Rex

Python是一种非常适合SEO学习的语言,不仅语法简单,而且很多功能还能通过各种库来实现,可谓SEO居家必备的“良药”。

背景

作为SEO,每天都有一批数据需要记录,抓取方面,收录方面,流量方面等。
在收录方面,收录率是非常有意义的一个指标,可以直接反映整站或者某频道的收录情况。

我之前使用的是昆哥的软件,可以随机抽取一批页面查询,但后来觉得可以用python做得更自动化,更方便,于是就有了这个脚本。

思路

脚本的整体思路是这样的:

  1. 用搜索关键词构建百度搜索URL(查询收录的时候搜索词就是待查页面URL)
  2. 获取百度搜索结果页内容
  3. 提取百度搜索结果(这里是最终的真实URL)
  4. 收录判定

具体代码

#coding=utf-8

import requests
from bs4 import BeautifulSoup as bs
import re

headers = {  
    'User-Agent': 'Mozilla/4.0+(compatible;+MSIE+8.0;+Windows+NT+5.1;+Trident/4.0;+GTB7.1;+.NET+CLR+2.0.50727)'
}  # 设置UA模拟用户,还可设置多个UA提高搜索成功率

def baidu_url(word): # 构建百度搜索URL;因为是查收录,所以只显示了前10个搜索结果,还可以通过rn参数来调整搜索结果的数量
    '''
    get baidu search url
    '''
    return 'http://www.baidu.com/s?wd=%s' % word


def baidu_cont(url):  # 获取百度搜索结果页内容
    r = requests.get(url, headers=headers)
    return r.content


def serp_links(word):  #获取百度搜索结果的最终URL
    '''
    get baidu serp links with the word
    '''
    b_url = baidu_url(word)
    soup = bs(baidu_cont(b_url))
    b_tags = soup.find_all('h3', {'class': 't'})  # 获取URL的特征值是通过class="t"
    b_links = [tag.a['href'] for tag in b_tags]
    real_links = []
    for link in b_links:  # 使用requests库获取了最终URL,而不是快照URL
        try:
            r = requests.get(link, headers=headers, timeout=120)
        except Exception as e:
            real_links.append('page404')
        else:
            real_links.append(r.url)
    return real_links


def indexer(url):  # 待查URL是否在百度搜索结果的URL列表中,如果在就表示收录,反之未收录
    indexed_links = serp_links(url)
    if url in indexed_links:
        return True
    else:
        return False

特点

之前也写过python的收录脚本,但感觉不准确,于是这次算是改良版。本次的脚本也有一些优势和劣势。

优势

  • 准确率高。脚本中比对的是百度搜索结果中最终的真实的URL,而不是快照URL,所以完全不会出现偏差(注:百度在去年做了调整,将标题上链接改为baidu的跳转链接,而不是真实链接);
  • 函数封装。本次脚本跟之前最大的不同就是进行了封装,每次使用只要import一下即可(我对发送邮件也做了封装);当然,也是为了方便其他百度查询,比如百度排名,百度site值;
  • 容错处理。因为平常都是批量查询,并且结合crontab定时任务,所以没有容错很可能中断。我主要通过tryrequeststimeout来处理,最主要是前者;

劣势

  • 速度慢。由于SERP每个结果都要返回最终URL,难免增加了很多次查询,这就导致速度很慢;但这也是目前较稳妥的处理方式,因为查询速度快会导致百度查询失败,弹出验证码;如果要高速查询也不是没有办法,可以通过多线程+更换host来实现;
  • 需要自定义。之前的脚本就是傻瓜版,把URL放在一个文件里,然后运行程序就会看到结果,现在的脚本只能算是一个小引擎,需要投入使用还需要自己配置;不过剩下的工作也不多了,而且自己配置下更能满足自己的需求。

写在最后

  1. 最近一直想发出自己的声音,但忽然不知道写什么了。写自己的思想?还不够完善;写自己的SEO思路?感觉很空;还是写一些自己的脚本吧,这个脚本还是比较可靠的,目前基本上不会挂掉;另外也透露下,现在正在测试排名脚本,可以自动查询百度排名,计算排名质量分,如果完善之后,也许也会添加进来。
  2. 最后,昨天收到了谷歌的邀请,参加东京的杰出贡献者会议,虽说还有4,5个月,不过挺激动的。又想想自己好久没在谷歌社区里做贡献了,也有点惭愧。
  3. 附图来自quora.
Comments
Write a Comment