python批量查询网页的HTTP状态码

最近业余时间在改版一个网站,改版之前频繁调整了一些栏目的属性,包括栏目的层级,这种最怕就是调整了栏目的从属关系,导致了栏目的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)。