python爬虫改进版

看过我上一篇文章的,都知道写一个爬虫是很容易的。可以参考我的文章:http://blog.csdn.net/jsqfengbao/article/details/56667070
但现在网站各种各样,爬虫效率、及容错性等都需要改进。现在对上一个爬虫进行下改进。
简单的下载网页的代码:
import urllib2
def download(url):
    return urllib2.urlopen(url).read()
不过这个代码片段存在一个问题,即当下载网页时,我们可能会遇到一些无法控制的错误,比如请求的页面可能不存在。此时,urllib2会抛出异常,然后退出脚本。安全起见,下面再给出一个更健壮的版本,可以捕获这些异常。
import urllib2

def download(url):
    print 'downloading:',url
    try:
        html = urllib2.urlopen(url).read()
    except urllib2.URLError as e:
        print 'Download error:',e.reason
        html =None
    return html
现在呢,当出现下载错误时,该函数能够捕获到异常,然后返回None。

1、重新下载:
下载时遇到的错误经常是临时性的,比如服务器过载时返回的503 Service Unavilable错误。对于此错误,我们可以尝试重新下载,因为这个服务器问题现在可能已解决。不过,我们不需要对所有的错误都尝试重新下载。如果服务器返回的是404 Not Found错误,则说明该网页目前不存在,再次尝试同样的请求一般也不会出现不同的结果。
下面是支持重试下载功能的新版本代码。

import urllib2

def download(url,num_retries = 2):
    print 'downloading:',url
    try:
        html = urllib2.urlopen(url).read()
    except urllib2.URLError as e:
        print 'Download error:',e.reason
        html =None
        if num_retries > 0:
            if hasattr(e,'code') and 500 <= e.code < 600:
                return download(url,num_retries-1)
    return html
下载,当download函数遇到5XX错误代码时,将会递归调用函数自身进行重试。此外,该函数还增加了一个参数,用于设定重试下载的次数,其默认为两次。

2、设置用户代理
默认情况下,urllib2适用Python-urllib/2.7作为用户代理下载网页内容,其中2.7是Python的版本号。如果能使用可辨识的用户代理则更好,这样可以避免我们的网络爬虫碰到一些问题。此外,也许是因为曾经历过质量不佳的Python网络爬虫造成的服务器过载,一些网站还会封禁这个默认的用户代理。
因此,为了下载更加可靠,我们需要控制用户代理的设定。下面的代码对download函数进行了修改,设定了一个默认的用户代理“king”

import urllib2

def download(url,user_agent = 'king',num_retries = 2):
    print 'downloading:',url
    headers = {"User-agent":user_agent}
    request = urllib2.Request(url,headers=headers)
    try:
        html = urllib2.urlopen(request).read()
    except urllib2.URLError as e:
        print 'Download error:',e.reason
        html =None
        if num_retries > 0:
            if hasattr(e,'code') and 500 <= e.code < 600:
                return download(url,user_agent,num_retries-1)
    return html
现在我们拥有了一个灵活的下载函数,该函数能够捕获异常,重试下载并设置用户代理。

猜你喜欢

转载自blog.csdn.net/jsqfengbao/article/details/60777395