lyyyuna 的小花园

动静中之动, by

RSS

向百度收录自动推送链接

发表于 2015-12

前言

相比较三个搜索引擎,必应对我站点的收录居然是最快的,而百度的抓取确实很慢,至今未收录。研究了下百度的站长工具,里面提到可以通过发送 POST http://data.zz.baidu.com/urls?site=www.lyyyuna.com&token=XXXXXXXXXXXXX&type=original 请求,提交希望百度抓取的链接。不过百度没有给 Python 的例子,于是我准备自己写一个。

自动推送设计思路

整个流程比较简单,毕竟只有一个 POST 请求。公司的电脑常年开机,上面跑了虚拟机,可以作为自动推送机。

由于每天允许最大推送链接数只有 500 条,所以我计划每天定时推送一次,且每次只推送新产生的链接。

定时任务可以直接使用 crontab 完成。

对于如何找到新链接,一开始我想的是是用爬虫爬一遍,虽然我的网站是全静态的,但写爬虫真的麻烦。后来我想到,sitemap.xml 会随 hexo g 自动产生,我只需要去 sitemap.xml 找新链接即可。在我本地的自动推送机上,使用 Python 自带的 sqlite3 数据库保存已推送过的链接。

自动推送链接的实现

crontab 定时触发脚本

crontab 设置成每天 1:10 AM 推送。如何设置可以谷歌或参照自带帮助说明。

10 1 * * * python /root/sitemap_auto_push/1.py >/dev/null 2>&1

sqlite3 数据库

更简单了,只需要一个表。

create table urls
{
    id integer primary key autoincrement,
    url varchar(200)    
}

XML 解析

sitemap.xml 是 XML 标记的,可以直接使用 Python 的 xml 模块来解析。我个人主页的 sitemap.xml 树结构如下

<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">

<url>
    <loc>http://www.lyyyuna.com/2015/12/28/robotframework-quickstartguide/</loc>
    <lastmod>2015-12-28T15:06:00.354Z</lastmod>
</url>
<url>
    <loc>http://www.lyyyuna.com/2015/12/25/scons4-building-and-linking-with-libraries/</loc>
    <lastmod>2015-12-25T13:30:14.968Z</lastmod>
</url>    
...
...
...
</urlset>

所以简单遍历一下就可以取出所有链接,再与数据库中的内容比较即可

loc_string = '{http://www.sitemaps.org/schemas/sitemap/0.9}loc'
for url in root:
    for attr in url:
        if attr.tag == loc_string:
            if not check_if_exist(attr.text):

POST 请求

每行一个链接 POST 即可,没有键-值,不需要 urlencode。

baidu_zhanzhang_url = 'http://data.zz.baidu.com/urls?site=www.lyyyuna.com&token=XXXXXXXXXXXXX&type=original'
# values = 'http://www.lyyyuna.com/2015/12/28/robotframework-quickstartguide/'

req = urllib2.Request(baidu_zhanzhang_url, values)
response = urllib2.urlopen(req)
the_page = response.read()      

完整源代码

# -*- coding: utf-8 -*-

import urllib
import urllib2

def check_if_exist(url):
    for cached_url in all_urls:
        ascii_cached_url = cached_url[1].encode('ascii')
        # print ascii_cached_url
        if url == ascii_cached_url:
            return True
    return False
    
sitemap_url = 'http://www.lyyyuna.com/sitemap.xml'
get = urllib2.urlopen(sitemap_url)
xml_string = get.read()

import sqlite3
import xml.etree.ElementTree as ET
root = ET.fromstring(xml_string)

cx = sqlite3.connect('sitemap.db3')
cur = cx.cursor()
cur.execute('select * from urls')
all_urls = cur.fetchall()
# print all_urls[0][1]

values = ''
loc_string = '{http://www.sitemaps.org/schemas/sitemap/0.9}loc'
for url in root:
    for attr in url:
        if attr.tag == loc_string:
            if not check_if_exist(attr.text):
                # print attr.text
                cur.execute("insert into urls (url) values ('" + attr.text + "')")
                values = values + attr.text + '\n'

cx.commit()

print values

baidu_zhanzhang_url = 'http://data.zz.baidu.com/urls?site=www.lyyyuna.com&token=XXXXXXXXXXXXX&type=original'
# values = 'http://www.lyyyuna.com/2015/12/28/robotframework-quickstartguide/'

req = urllib2.Request(baidu_zhanzhang_url, values)
response = urllib2.urlopen(req)
the_page = response.read()

print the_page

若看到

{"remain":496,"success":2}

你就成功了。