文章目录
什么是Ping服务
ping 是基于 XML_RPC 标准协议的更新通告服务,用于Blog把内容更新快速通知给搜索引擎,以便搜索引擎及时进行抓取和更新,利于网站SEO。
计算机就相当于 RPC Client ,用于向 RPC Server 发起请求,并接受方法的执行结果。
Python实现方法
Python 内置了 XMLRPClib ,可以很方便地处理XMLRPC协议,免去了封包解包的麻烦。
用法很简单,首先导入库:
import xmlrpclib
生成xmlrpc服务器对象:
sever = xmlrpclib.ServerProxy(ServerProxy)
其中 ServerProxy 是搜索引擎的RPC服务器端点地址。python2和3有点不一样,参考这篇文章Porting Code to Python 3 with 2to3
然后便可以执行RPC服务器的方法了,以百度为例: result = server.weblogUpdates.extendedPing(blog_name,index_addr,new_post_addr,rss_addr)
weblogUpdates.extendedPing 是需要执行的方法,其中括号中的四个参数是 百度ping服务页面 上所要求的。 result 是方法返回的执行结果。
封装代码
在ping_all函数里放上需要ping的链接就可以了,参数按照需求传。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 |
ult = rpc_server.weblogUpdates.extendedPing( site_name, site_host, “http://“+post_url, “http://“+rss_url ) print(result) # baidu return 0 means ping success with open(‘./ping.txt’, ‘a+’) as f: # save url f.write(post_url+‘\n’) def ping_all(site_name, site_host, post_url, rss_url): ping_url_list = [ ‘http://ping.baidu.com/ping/RPC2‘, # http://zhanzhang.baidu.com/tools/ping #’http://rpc.pingomatic.com/‘, # must every 5 minutes #’http://blogsearch.google.com/ping/RPC2‘, #’http://api.my.yahoo.com/RPC2‘, #’http://blog.youdao.com/ping/RPC2‘, #’http://ping.feedburner.com‘, ] for ping_url in ping_url_list: try: ping(ping_url, site_name, site_host, post_url, rss_url) except Exception: print(‘ping fail’, post_url) continue def get_all_post_url(rss_url=‘http://jishushare.com/sitemap-posts.xml‘): “””rss_url 博客的rss地址, 用来拿到所有文章””” response = urlopen(rss_url) html = response.read().decode(‘utf-8’) # your sitemap page encoding pat = re.compile(‘<loc>http://(.*?)</loc>’) url_list = [‘http://‘+url.strip() for url in pat.findall(html)] return set(url_list) def get_already_ping_url(f=‘./ping.txt’): “””防止重复ping,在ping.txt里保存已经ping过的url””” if not os.path.exists(f): open(f, ‘a’).close() with open(f, ‘r’) as f: return set([url.strip() for url in f.readlines() if url]) def test(): site_name = “技术分享网” site_host = “http://jishushare.com/“ post_url = ‘http://jishushare.com/duo-xian-cheng-yi-bu-yi-bu-duo-jin-cheng-pa-chong/‘ rss_url = “http://jishushare.com/sitemap-posts.xml“ ping_all(site_name, site_host, post_url, rss_url) def ping_jishushare(): rss_url = ‘http://jishushare.com/sitemap-posts.xml‘ to_ping_url_list = get_all_post_url(rss_url) - get_already_ping_url() site_name = “技术分享网” site_host = “http://jishushare.com/“ rss_url = “http://jishushare.com/sitemap-posts.xml“ for post_url in to_ping_url_list: time.sleep(10) ping_all(site_name, site_host, post_url, rss_url) if name == ‘main‘: ping_jishushare() print(‘finish’) |
使用方法
根据你的站点名字配置站点名等信息,然后把rss_url
替换成你的运行就可以了。ping_url_list
列表里边有一些常用的服务,一般用百度,如果可以访问谷歌也可以把谷歌的rpc也加上。代码会把已经ping过的地址保存到当前文件夹下的post.txt中,防止重复ping。最好用crontab配个定期服务,每天定时跑,自动ping那些更新的文章。
ref:
