最近业余时间在改版一个网站,改版之前频繁调整了一些栏目的属性,包括栏目的层级,这种最怕就是调整了栏目的从属关系,导致了栏目的URL地址改变,一旦改版就导致整个栏目及其下面的文章页地址变更,成为死链。而栏目有几千个,更加大意不得。
在栏目调整前,我把数据库和程序复制出去新建了一个镜像站,用镜像站里调整,然后把栏目地址数据导出来,然后前面批量加上线上域名,然后批量查询组装出来的地址是否能正常访问,能访问就说明没问题,返回404错误就说明调整后的栏目地址,是原来网站不存在的,就要排查错误。
.
此时用python批量查询网页的HTTP状态码,就显得很方便了,代码如下:
#coding=utf-8
import urllib,time
import StringIO
import pycurl
def get_http_status(url):
html = StringIO.StringIO()
c = pycurl.Curl()
myurl=url
c.setopt(pycurl.URL, myurl)
c.setopt(pycurl.WRITEFUNCTION, html.write)
c.setopt(pycurl.FOLLOWLOCATION, 1)
c.setopt(pycurl.MAXREDIRS, 5)
c.setopt(pycurl.CONNECTTIMEOUT, 60)
c.setopt(pycurl.TIMEOUT, 300)
c.setopt(c.HEADER, True)
c.setopt(pycurl.USERAGENT, "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322)")
ret = c.perform()
ret = html.getvalue()
if "200" in ret:
print url,c.getinfo(c.HTTP_CODE)
return 1
elif "404" in ret:
print url,c.getinfo(c.HTTP_CODE)
f = open('/Users/dcm007/Desktop/no.txt','a')
f.write(url+'\n')
f.close()
return 0
if __name__=="__main__":
urls=open('/Users/dcm007/Desktop/url.txt','r').readlines()
oknum=0
lostnum=0
for url in urls:
if get_http_status(url.strip()):
oknum+=1
else:
lostnum+=1
以上代码的含义,从/Users/dcm007/Desktop/url.txt文件(一行一个URL)中一条一条地读取数据,并逐个查询他们的HTTP状态码,并打印出来。若出现404状态码,就存到/Users/dcm007/Desktop/no.txt文件中(一行一个URL)。