更多内容请点击 我的博客 查看,欢迎来访。
Django Signals(信号)实现推送链接到百度资源搜索平台
使用说明
- 链接提交工具是网站主动向百度搜索推送数据的工具,本工具可缩短爬虫发现网站链接时间,网站时效性内容建议使用链接提交工具,实时向搜索推送数据。本工具可加快爬虫抓取速度,无法解决网站内容是否收录问题
- 百度搜索资源平台为站长提供链接提交通道,您可以提交想被百度收录的链接,百度搜索引擎会按照标准处理,但不保证一定能够收录您提交的链接。
百度添加自己的站点
https://ziyuan.baidu.com/linksubmit/index
访问上面的链接,添加自己的站点,会得到推送接口
BLOG_20190531_203121_76这儿会提供创建、更新、删除数据时的接口调用接口,之后会用到。
Python实现百度接口调用
# baidu_link_submit.py
import requests
token = '???' # 百度链接推送提供的token
site = 'blog.starmeow.cn' # 自己的域名
create_link_url = 'http://data.zz.baidu.com/urls?site={}&token={}&type=original'.format(site, token) # 推送
update_link_url = 'http://data.zz.baidu.com/update?site={}&token={}'.format(site, token) # 更新
delete_link_url = 'http://data.zz.baidu.com/del?site={}&token={}'.format(site, token) # 删除
def push_urls(url, urls):
"""
根据百度站长提供的API推送链接
:param url: 百度提供的推送、更新、删除接口
:param urls:
:return:
"""
headers = {
'User-Agent': 'curl/7.12.1',
'Host': 'data.zz.baidu.com',
'Content - Type': 'text / plain',
'Content - Length': '83'
}
try:
r = requests.post(url, headers=headers, data='\n'.join(urls), timeout=5).text
print('blog signals.py中调用百度链接提交结果:', r)
return r
except BaseException as e:
print('blog signals.py中调用百度链接提交失败:', str(e))
return str(e)
if __name__ == '__main__':
#测试
urls = [
'https://blog.starmeow.cn/detail/82161242827b703e6acf9c726942a1e/',
'https://blog.starmeow.cn/detail/96da2f590cd7246bbde0051047b0d6f/',
]
result = push_urls(create_link_url, urls)
print(result) # {"remain":4999988,"success":2} # 当天剩余的可推送url条数;成功推送的url条数
"""
{
"remain":4999998, 当天剩余的可推送url条数
"success":2, 成功推送的url条数
"not_same_site":[], 由于不是本站url而未处理的url列表
"not_valid":[] 不合法的url列表
}
"""
使用Signal实现链接推送
当创建、更新、删除文章时,利用Django的信号来实现链接推送。
from django.db.models.signals import post_save, post_init, pre_delete
from django.dispatch import receiver
from django_hosts.resolvers import reverse
from .tools.baidu_link_submit import create_link_url, update_link_url, delete_link_url, push_urls
@receiver(post_save, sender=Article)
def blog_save_handler(sender, instance=None, created=False, **kwargs):
"""
推送创建或修改文章后,该文章的url给百度
:param sender:
:param instance: 创建的对象
:param created:
:param kwargs:
:return:
"""
if created:
# 其他操作
# 创建后推送百度链接
instance_url = reverse('detail', args=(instance.ecpid,), host='blog_v0_2')
instance_url = 'https:' + instance_url
push_urls(create_link_url, [instance_url, ])
# 其他操作
else:
# print('更新时,博客ecpid:', instance.ecpid)
# 更新后,或者是被访问,只要该models发生变化,推送百度更新
instance_url = reverse('detail', args=(instance.ecpid,), host='blog_v0_2')
instance_url = 'https:' + instance_url
push_urls(update_link_url, [instance_url, ])
# 其他操作
@receiver(pre_delete, sender=Article)
def blog_pre_delete(sender, instance, **kwargs):
"""
推送删除文章后,该文章的url给百度
:param sender:
:param instance: 删除的对象
:param kwargs:
:return:
"""
print('正在删除实例:', instance)
instance_url = reverse('detail', args=(instance.ecpid,), host='blog_v0_2')
instance_url = 'https:' + instance_url
push_urls(delete_link_url, [instance_url, ])
发现的问题
在这个例子中我使用update_link_url
,delete_link_url
都会显示{"error":400,"message":"over quota"}
,不知道什么原因了,难道是没提交过的链接做更新和删除操作?具体等后面测试,因为一条连接都还没推送出去。
添加自动推送
自动推送是百度搜索资源平台为提高站点新增网页发现速度推出的工具,安装自动推送JS代码的网页,在页面被访问时,页面URL将立即被推送给百度。
添加代码到页面中
<script>
(function () {
var bp = document.createElement('script');
var curProtocol = window.location.protocol.split(':')[0];
if (curProtocol === 'https') {
bp.src = 'https://zz.bdstatic.com/linksubmit/push.js';
}
else {
bp.src = 'http://push.zhanzhang.baidu.com/push.js';
}
var s = document.getElementsByTagName("script")[0];
s.parentNode.insertBefore(bp, s);
})();
</script> <!--百度链接主动推送-->
推送成功
经过几天,终于在百度搜索资源平台看到提交的数量了
BLOG_20190531_203054_63
网友评论