昊天SEO

python脚本ping百度和google

什么是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的链接就可以了,参数按照需求传。

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

"""ping脚本,有新文章发布的时候通知搜索引擎。 
不依赖第三方库,支持python3
"""

import os  
import re  
import time  
try:  
    from urllib2 import urlopen
    from xmlrpclib import ServerProxy
except ImportError:    # py3  
    from urllib.request import urlopen
    from xmlrpc.client import ServerProxy


def ping(ping_url, site_name, site_host, post_url, rss_url):  
    """ping single service"""
    print('ping...', ping_url, post_url)
    rpc_server = ServerProxy(ping_url)
    result = 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:

网站的维护离不开大家的支持鼓励,捐赠让我更有动力走的更远&& 也可以关注我的微信公众号,发布更多的干货
本文网址:https://www.168seo.cn/python/1626.html

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址