推广脚本优化,百度推送 hexo 博客所有链接的 Python 脚本。

摘要

如果您了解百度提交的几种模式,相信大家都知道在提交的效率上:主动推送>自动推送>sitemap,本文针对主动推送进行讲解,非常感谢lovenight 提供的百度主动推送脚本hexo向百度提交网址.py ,但部分网上说法由于百度不会收录github网站域名的提交导致说此脚本失效。如果热衷于HEXO,你会发现相对于Github国内还有一个coding代码托管,所以我们可以将我们的网站都一同托管到Github和coding,通过某些方法实现让lovenight的百度推送脚本推送coding域名的网址到百度(此为本文目的)。
HEXO-建站系列
HEXO-优化系列
HEXO-进阶系列


正文

实现思路 利用脚本的对sitemap.xml和baidusitemap.xml的去重复网址结合推送百度的原理,我们仅仅需要替换掉相关代码的sitemap.xml部分,以使得脚本不会推送Google下的sitemap.xml的网址到百度。前提sitemap.xml对应Github域名的网址和baidusitemap.xml对应Coding的域名网址,如果你希望了解如和实现对应的域名的站点地图实现,请点击”Github(google提交)+Coding(百度提交),自适应提交搜索引擎(绝招来啦!)

实现方法介绍

以下是lovenight的推送脚本代码:

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
55
56
57
58
59
60
61
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Author: LoveNight
# @Date: 2015-11-16 20:45:59
# @Last Modified by: lulee007
# @Last Modified time: 2016-01-16 21:06:50
import os
import sys
import json
from bs4 import BeautifulSoup as BS
import requests
import codecs

"""
hexo 博客专用,向百度站长平台提交所有网址

本脚本必须放在 hexo 博客的根目录下执行!需要已安装生成百度站点地图的插件。
百度站长平台提交链接:http://zhanzhang.baidu.com/linksubmit/index
主动推送:最为快速的提交方式,推荐您将站点当天新产出链接立即通过此方式推送给百度,以保证新链接可以及时被百度收录。
从中找到自己的接口调用地址
"""


url = 'http://data.zz.baidu.com/urls?site=YOUR_BLOG_HOST&token=YOUR_TOKEN'
baidu_sitemap = os.path.join(sys.path[0], 'public', 'baidusitemap.xml')
google_sitemap = os.path.join(sys.path[0], 'public', 'sitemap.xml')
# sitemap = [baidu_sitemap, google_sitemap]
sitemap = [baidu_sitemap]

# assert (os.path.exists(baidu_sitemap) or os.path.exists(
# google_sitemap)), "没找到任何网站地图,请检查!"
assert os.path.exists(baidu_sitemap) , "没找到任何网站地图,请检查!"

# 从站点地图中读取网址列表
def getUrls():
urls = []
for _ in sitemap:
if os.path.exists(_):
with codecs.open(_, "r", "utf-8") as f:
xml = f.read()
soup = BS(xml, "xml")
tags = soup.find_all("loc")
urls += [x.string for x in tags]
if _ == baidu_sitemap:
tags = soup.find_all("breadCrumb", url=True)
print("")
urls += [x["url"] for x in tags]
return urls

# POST提交网址列表
def postUrls(urls):
urls = set(urls) # 先去重
print("一共提取出 %s 个网址" % len(urls))
data = "\n".join(urls)
return requests.post(url, data=data).text

if __name__ == '__main__':

urls = getUrls()
result = postUrls(urls)
print("提交结果:")
print(result)

我们关注其中的几行代码:

1
2
3
4
baidu_sitemap = os.path.join(sys.path[0], 'public', 'baidusitemap.xml')
google_sitemap = os.path.join(sys.path[0], 'public', 'sitemap.xml')
# sitemap = [baidu_sitemap, google_sitemap]
sitemap = [baidu_sitemap]

通过这几行代码分析,我们发现此脚本需要捉的网址信息为google下的sitemap.xml和百度下的baidusitemap.xml的去重复的地址结合,既让是结合,我们可以创建一个与baidusitemap.xml的格式一样的占位文件如命名为baidusitemap_zhanwei.xml并将代码修改为如下:

1
2
3
4
baidu_sitemap = os.path.join(sys.path[0], 'public', 'baidusitemap.xml')
google_sitemap = os.path.join(sys.path[0], 'public', 'baidusitemap_zhanwei.xml') #修改位置
# sitemap = [baidu_sitemap, google_sitemap]
sitemap = [baidu_sitemap]

这样的结果是:此脚本仅仅会推送百度与您建立的占位文件的地址结合。所以脚本不会推送github域名的网址到百度搜索引擎。简直一举两得的方法。

脚本运行问题

这里列出脚本运行时可能出现的问题,我用的Pyhton的版本是2.7.10,在运行时出现了这几个问题,希望这些解决方法能帮到您

问题一

问题表现

1
2
3
4
5
6
C:\Users\jory.he\Desktop\myhexo>
C:\Users\jory.he\Desktop\myhexo>pushbaidu.py
File "C:\Users\jory.he\Desktop\myhexo\pushbaidu.py", line 22
url = 你的百度推送接口
^
SyntaxError: invalid syntax

解决方法:
在你的推送接口字符串记得加上单引号

问题二

问题表现:

1
2
3
4
5
C:\Users\jory.he\Desktop\myhexo>pushbaidu.py
Traceback (most recent call last):
File "C:\Users\jory.he\Desktop\myhexo\pushbaidu.py", line 10, in <module>
from bs4 import BeautifulSoup as BS
ImportError: No module named bs4

解决方法:
运行以下命令安装相关模块:
pip install BeautifulSoup4
效果:

1
2
3
4
5
6
C:\Users\jory.he\Desktop\myhexo>pip install BeautifulSoup4
Collecting BeautifulSoup4
Downloading beautifulsoup4-4.4.1-py2-none-any.whl (81kB)
100% |████████████████████████████████| 81kB 81kB/s
Installing collected packages: BeautifulSoup4
Successfully installed BeautifulSoup4-4.4.1

问题三

问题表现:

1
2
3
4
5
6
7
C:\Users\jory.he\Desktop\myhexo>pushbaidu.py
Traceback (most recent call last):
File "C:\Users\jory.he\Desktop\myhexo\pushbaidu.py", line 57, in <module>
urls = getUrls()
File "C:\Users\jory.he\Desktop\myhexo\pushbaidu.py", line 36, in getUrls
with open(_, "r", encoding="utf-8") as f:
TypeError: 'encoding' is an invalid keyword argument for this function

解决方法:
由于您的Python版本非3.0以上,你需要额外插入一个模块,代码如下

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
55
56
57
58
59
60
61
62
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Author: LoveNight
# @Date: 2015-11-16 20:45:59
# @Last Modified by: LoveNight
# @Last Modified time: 2015-11-19 15:28:50
import io #修改位置import io
import os
import sys
import json
from bs4 import BeautifulSoup as BS
import requests
import msvcrt

"""
hexo 博客专用,向百度站长平台提交所有网址
本脚本必须放在hexo博客的根目录下执行!需要已安装生成百度站点地图的插件。
百度站长平台提交链接:http://zhanzhang.baidu.com/linksubmit/index 从中找到自己的接口调用地址
主动推送:最为快速的提交方式,推荐您将站点当天新产出链接立即通过此方式推送给百度,以保证新链接可以及时被百度收录。
"""



url = 'http://data.zz.baidu.com/urls?site=joryhe.coding.me&token=S0O0AFiMjeHTzyJI'
baidu_sitemap = os.path.join(sys.path[0], 'public', 'baidusitemap.xml')
google_sitemap = os.path.join(sys.path[0], 'public', 'baidusitemap_zhanwei.xml')
sitemap = [baidu_sitemap, google_sitemap]

assert (os.path.exists(baidu_sitemap) or os.path.exists(
google_sitemap)), "没找到任何网站地图,请检查!"


# 从站点地图中读取网址列表
def getUrls():
urls = []
for _ in sitemap:
if os.path.exists(_):
with io.open(_, "r", encoding="utf-8") as f: #修改位置open换成io.open
xml = f.read()
soup = BS(xml, "xml")
tags = soup.find_all("loc")
urls += [x.string for x in tags]
if _ == baidu_sitemap:
tags = soup.find_all("breadCrumb", url=True)
urls += [x["url"] for x in tags]
return urls


# POST提交网址列表
def postUrls(urls):
urls = set(urls) # 先去重
print("一共提取出 %s 个网址" % len(urls))
data = "\n".join(urls)
return requests.post(url, data=data).text


if __name__ == '__main__':

urls = getUrls()
result = postUrls(urls)
print("提交结果:")
print(result)
msvcrt.getch()

问题四

问题表现:

1
2
3
4
5
6
7
8
9
C:\Users\jory.he\Desktop\myhexo>pushbaidu.py
Traceback (most recent call last):
File "C:\Users\jory.he\Desktop\myhexo\pushbaidu.py", line 58, in <module>
urls = getUrls()
File "C:\Users\jory.he\Desktop\myhexo\pushbaidu.py", line 39, in getUrls
soup = BS(xml, "xml")
File "C:\Python27\lib\site-packages\bs4\__init__.py", line 156, in __init__
% ",".join(features))
bs4.FeatureNotFound: Couldn't find a tree builder with the features you requested: xml. Do you need to install a parser library?

解决方法:
运行一下命令,安装相应模块:
pip install lxml
效果如下:

1
2
3
4
5
6
C:\Users\jory.he\Desktop\myhexo>pip install lxml
Collecting lxml
Downloading lxml-3.6.0-cp27-none-win_amd64.whl (3.3MB)
100% |████████████████████████████████| 3.3MB 28kB/s
Installing collected packages: lxml
Successfully installed lxml-3.6.0

##总结
如果经过已经您已经成功使用此脚本并合理的将coding的网址推送到百度,脚本允运行效果如下:

注意:python脚本一般后缀为.py文件,要运行次脚本你需要安装python环境安装包下载Python,其次简单描述此脚本的使用方法,你需要将脚本命名为xxx.py放到HEXO根目录下,通过hexo clean& hexo g编译后,在运行xxx.py脚本即开始推送你的网站地图链接。

1
2
3
4
C:\Users\jory.he\Desktop\myhexo>pushbaidu.py
一共提取出 35 个网址
提交结果:
{"remain":465,"success":35}

结语

如果你还需要了解更多技术文章信息,请继续关注Jory博客

看一看,共同关注,共同分享与讨论!