urllib2模块
要想爬取网页,我们首先需要将其下载下来。下面的示例脚本使用Python的urllib 2 模块下载URL。
方法一:
import urllib2 def download1(url):#当传人参数URL时,该函数会下载网页并返回其HTML return urllib2.urlopen(url).read()
调用:
print download1('http://example.webscraping.com')
当传入URL参数时, 该函数将会下载网页并返回其HTML。不过这个代码片段存在一个问题,即当下载网页时,我们可能会遇到一些无法控制的错误,比如请求的页面可能不存在。
方法二:
此时,urlli b2 会抛出异常,然后退出脚本。当出现下载错误时, 该函数能够捕获到异常, 然后返回None。
def download2(url): print 'downloading:',url try: html=urllib2.urlopen(url).read() except urllib2.URLError as e: print 'download error:',e.reason html=None return html调用:
print download2('http://example.webscraping.com')
服务器 过载时返回的 503错误,我们可以尝试重新下载。
我们只需要确保download函数在 发生5xx 错误时重试下载即可。 下面是支持重试下载功能的新版 本代码。
方法3:
def download3(url,num_retries=2):#num_retries重新下载的次数,默认为2 print 'download:',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:#遇见5**错误码时,重新调用下载 return download3(url,num_retries-1) return html当 download函数遇到5xx误码时,将会递归调用函数自身进行重试。 此外, 该函数还增加了一个参数, 用于设定重试下载的次数, 其默认值为两次。 我们在这里限制 网页下载的尝试次数, 是因为服务器错误可能 暂时还没有解决。想要测试该函数, 可以尝试下载http: //httpstat.us/500, 该网址会始终 返回500 错误码。