Python脚本ping百度和google

web

什么是Ping服务

ping 是基于 XML_RPC 标准协议的更新通告服务,用于Blog把内容更新快速通知给搜索引擎,以便搜索引擎及时进行抓取和更新。

计算机就相当于 RPC Client ,用于向 RPC Server 发起请求,并接受方法的执行结果。


Python实现方法

Python 内置了 XMLRPClib ,可以很方便地处理XMLRPC协议,免去了封包解包的麻烦。

用法很简单,首先导入库:

import xmlrpclib
生成xmlrpc服务器对象:

sever = xmlrpclib.ServerProxy(ServerProxy)
其中 ServerProxy 是搜索引擎的RPC服务器端点地址。

然后便可以执行RPC服务器的方法了,以百度为例:
result = server.weblogUpdates.extendedPing(blog_name,index_addr,new_post_addr,rss_addr)
weblogUpdates.extendedPing 是需要执行的方法,其中括号中的四个参数是 百度ping服务页面 上所要求的。 result 是方法返回的执行结果。


封装代码

在ping_all函数里放上需要ping的链接就可以了,参数按照需求传。

#!/usr/bin/env python
# -*- coding:utf-8 -*-

import json
import xmlrpclib
from db import redis


def ping(ping_url, *args, **kwds):
    """args: site_name, site_host, post_url, rss_url."""
    rpc_server = xmlrpclib.ServerProxy(ping_url)
    result = rpc_server.weblogUpdates.extendedPing(*args)
    print result


def ping_all(*args, **kwds):
    ping_url_list = [
        'http://ping.baidu.com/ping/RPC2',
        'http://rpc.pingomatic.com/',
        'http://blogsearch.google.com/ping/RPC2',
    ]
    for url in ping_url_list:
        ping(url, *args, **kwds)


def main():
    client = redis.pubsub()
    client.subscribe(['ping'])
    while True:
        for item in client.listen():
            if item['type'] == 'message':
                msg = item['data']
                if msg:
                    post = json.loads(msg)
                    print post
                    ping_all(post.get('site_name'), post.get('site_host'),
                             post.get('post_url'), post.get('rss_url'))


def test():
    site_name = "tech2ipo"
    site_host = "http://alpha.tech2ipo.com"
    post_url = 'http://alpha.tech2ipo.com/100855'
    rss_url = "http://alpha.tech2ipo.com/rss/alpha.tech2ipo.com"
    ping_all(site_name, site_host, post_url, rss_url)


if __name__ == '__main__':
    main()

ref:
http://zhanzhang.baidu.com/tools/ping
http://cheukyin.github.io/jekyll/python/2014-08/ping-service.html
http://www.cnpythoner.com/post/182.html