记一次百度主动推送(利用Python的Xpath爬虫)

前言:

每个网站站长都有一颗想出名的心,我也不例外,今天我将自己网站 is-hash.com 的几个网页全部主动推送给了度娘(curl推送),一路上用到一些技巧,在这里做个记录。

 

 

 

 


推送过程

 

其实百度curl推送并不是个难事,就是将要提交的链接按照每行一条的格式写入一个文本文件中,命名此文件为urls.txt,然后进入该文件所在目录,执行如下命令:

curl -H 'Content-Type:text/plain' --data-binary @urls.txt "http://data.zz.baidu.com………………"

就推送了,很简单的一件事情,但是对于我却不容易,因为我已经写了一百左右篇文章了,我想要全部推送,那将一百多个链接写到txt文件中不免有些繁琐,于是我就使用python结合Xpath模块写了一个爬虫程序,将我的网站的主页的几个链接全部爬取并且保存。

 

python代码奉上

import requests
import parsel

#返回页面的全部代码
def get_http(myurl):
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36'
    }
    response=requests.get(myurl,headers=headers)
    data=response.text
    data.encode("UTF-8")
    return data

#通过xpath得到需要的url
def get_url(data):
    #存储数据的列表
    dataList=[]
    urldata=parsel.Selector(data)
    #模糊匹配
    XpathSelect='//*[contains(@id,"post")]/header/h2'
    parse_list=urldata.xpath(XpathSelect)
    for h in parse_list:
        url=h.xpath("./a/@href").extract_first()
        dataList.append(url)
    return dataList

def download(list):
    with open('urls.txt','w') as f:
        for url in list:
            f.write(str(url)+"\n")


#当前文件为启动文件
if __name__=="__main__":
    #这个列表将会收集全部的网页链接
    allUrl=[]
    for page in range(1,12):
        # 用{}预留一个接口,通过.format将页数进行传递
        base_url = "https://www.is-hash.com/page/{}/".format(page)
        #得到这一网页的源代码
        http=get_http(base_url)
        #得到源代码中的url
        urls=get_url(http)
        for url in urls:
            allUrl.append(str(url))
        #加个提示给控制台
        print("已经爬取完第"+str(page)+"页")
    #下载链接
    download(allUrl)

上面有些地方对我比较陌生,记录一下

  • Xpath语法中的contains方法是一个模糊匹配的方法:匹配一个属性值中包含的字符串
  • extract_first():这个方法返回的是一个string字符串,是list数组里面的第一个字符串。
  • 我的网站目前共有11页,url的变化规律是/page/1-11,所以外面用了个大循环。

经过一番猛干,终于拿到结果

兴奋的我赶紧将txt文件传到服务器上,远程执行了命令,结果返回了一个这:

{
   "remain":10000,
   "success":0,
   "not_same_site":[ ……一堆url……  ],
   "not_valid":[]
}

按照百度的说法就是:还可以提交10000个,提交成功0个,“一堆url”不是本站url而未处理。

 

???

 

我有点懵,经过一番搜索终于知道,原来是因为url中的域名还要写上www(看看百度给你的接口是不是也有www,那你应该也要写了)。

 

一行一行手写吗?

如果你有VSCode,那么就可以利用vsCode的“可视区块操作”(我起的名,因为这个类似vim的可视区块),找到关键字,按下Ctrl+D,多行统一操作:

只能用 爽 来形容。

 

修改好文件之后再上传,应该就不会有问题了。

 


留个言点个赞吧!

 

 

 

 

商业转载 请联系作者获得授权,非商业转载 请标明出处,谢谢

发表评论