用python零基础写爬虫--编写第一个网络爬虫

首先要说明的是,一下代码是在python2.7版本下检测的

一.最简单的爬虫程序 --下载网页

import urllib2
request=urllib2.Request("http://www.baidu.com")
response = urllib2.urlopen(request)
print response.read()
怎么样,很简单吧。
urllib2是python中的一个标准库,以上代码会抓取一个特定的网页并将抓取的网页返回。urllib2这个库的使用要多加研究,这个是使用的基础。

1、urllib2是Python的一个获取URLs(Uniform Resource Locators)的组件。他以urlopen函数的形式提供了一个非常简单的接口,这是具有利用不同协议获取URLs的能力;它同样提供了一个比较复杂的接口来处理一般情况,例如:基础验证,cookies,代理和其他,它们通过handlers和openers的对象提供。

2、urllib2.urlopen(url, data=None, timeout=None)
  参数
    url:打开一个url,可以是字符串(如同urllib.urlopen的url参数),或是一个Request对象(这是special的地方)
    data:向服务器传送的额外数据,仅http请求会用到这个参数。当data不为None时,说明此Http请求是Post,而不是Get。这个参数与urllib2.Request类的构造函数的data参数相同,详见urllib2.Request。一般不会设定这个参数,需要时会在urllib2.Request的构造函数处设置
    timeout:设置超时的时间,类型是整型,单位是秒;如果超过指定时间仍未得到所请求服务器的响应(例如由于网络环境差等原因),则抛出异常,而不会无限制等待。适用于HTTP, HTTPS, FTP, FTPS
  返回值
    返回一个类似于文件描述符号(file-like)的对象,与urllib.urlopen的返回值相同,通过返回值也可以使用geturl()和info()。

3、urllib2.Request类,一般使用方法是使用其构造函数得到一个Request对象:class urllib2.Request(url[, data][, headers][, origin_req_host][, unverifiable])
  表示一个URL请求
  参数
    url:一个URL字符串
    data:向服务器传送的额外数据,仅http请求会用到这个参数。当data不为None时,说明此Http请求是Post,而不是Get。其类型应为字符串,一般使用urllib.urlencode()对一个dict或tuple进行处理,得到该字符串。
    headers:请求头,类型是dict。除此之外,请求头可以在创建完Request对象后,通过该对象调用add_header(key, val)添加到对象中。常用方法是添加User-Agent请求头,冒充浏览器请求,用于哄篇服务器,因为一些服务器不允许程序访问。
    后两个参数一般用不到,不再介绍
  返回值
    一个Request对象

4、urllib2.OpenerDirector类
  当你获取一个URL时,你需要使用一个opener(OpenerDirector)。正常情况下我们一直使用默认的opener,被urlopen使用,但你也可以创建自定义的openers。opener使用handler处理任务,所有的重活都交给这些handlers来做。每一个handler知道怎么以特定的url协议打开url,或者怎么处理打开url的某些方面,如,HTTP重定向,或者HTTP cookie。

5、def urllib2.build_opener([handler, ...])
  创建一个OpenerDirector对象,可以包含多个handlers
  参数
    handler, ...:urllib2提供很多handler来处理不同的请求,常用的HTTPHandler,FTPHandler都比较好理解。这里提一下HTTPCookieProcessor,HTTPCookieProcessor是处理cookie的,在很多需要身份验证的请求中cookie是必不可少的,python中对cookie的操作是由cookielib模块来完成的,而这个handler只是调用了其方法,在request和response过程中将cookie加到请求中和把cookie从响应中解析出来。
  返回值
    OpenerDirector对象

6、def urllib2.install_opener(opener)
  install_opener能设置一个全局opener对象,这意味着调用urlopen将会都用你刚安装的opener。
  参数
    opener:OpenerDirector对象

7、urllib2.HTTPCookieProcessor类,通常使用其构造函数得到一个对象,即一个handler:class urllib2.HTTPCookieProcessor([cookiejar])
  参数
    cookiejar:一个cookielib.CookieJar对象,通过构造函数cookielib.CookieJar()得到
  返回值
    HTTPCookieProcessor对象,即一个handler

二.捕获下载异常

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
download('http://httpstat,us/500')

我们引入了urllib2标准库,并且定义了一个download函数 ,其中用到了 try/except 处理异常的语法。

三.网页出错与重试下载

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:
#recursively retry 5XX http errors
return download(url, num_retries-1)
return html

 

 

 

下载时遇到的错误经常是临时性的,比如服务器过载时返回的503 Service Unavilable 错误等。

一般来说4xx错误发生在请求存在问题时候,5xx错误发生在服务器存在问题时。所以我们只需要确保在发生5xx错误时候重新下载。

1xx-信息提示
这些状态代码表示临时的响应。客户端在收到常规响应之前,应准备接收一个或多个1xx响应。
100-继续。
101-切换协议。
2xx-成功
这类状态代码表明服务器成功地接受了客户端请求。
200-确定。客户端请求已成功。
201-已创建。
202-已接受。
203-非权威性信息。
204-无内容。
205-重置内容。
206-部分内容。
3xx-重定向
客户端浏览器必须采取更多操作来实现请求。例如,浏览器可能不得不请求服务器上的不同的页面,或通过代理服务器重复该请求。
301-对象已永久移走,即永久重定向。
302-对象已临时移动。
304-未修改。
307-临时重定向。
4xx-客户端错误
发生错误,客户端似乎有问题。例如,客户端请求不存在的页面,客户端未提供有效的身份验证信息。400-错误的请求。
401-访问被拒绝。IIS定义了许多不同的401错误,它们指明更为具体的错误原因。这些具体的错误代码在浏览器中显示,但不在IIS日志中显示:
401.1-登录失败。
401.2-服务器配置导致登录失败。
401.3-由于ACL对资源的限制而未获得授权。
401.4-筛选器授权失败。
401.5-ISAPI/CGI应用程序授权失败。
401.7–访问被Web服务器上的URL授权策略拒绝。这个错误代码为IIS6.0所专用。
403-禁止访问:IIS定义了许多不同的403错误,它们指明更为具体的错误原因:
403.1-执行访问被禁止。
403.2-读访问被禁止。
403.3-写访问被禁止。
403.4-要求SSL。
403.5-要求SSL128。
403.6-IP地址被拒绝。
403.7-要求客户端证书。
403.8-站点访问被拒绝。
403.9-用户数过多。
403.10-配置无效。
403.11-密码更改。
403.12-拒绝访问映射表。
403.13-客户端证书被吊销。
403.14-拒绝目录列表。
403.15-超出客户端访问许可。
403.16-客户端证书不受信任或无效。
403.17-客户端证书已过期或尚未生效。
403.18-在当前的应用程序池中不能执行所请求的URL。这个错误代码为IIS6.0所专用。
403.19-不能为这个应用程序池中的客户端执行CGI。这个错误代码为IIS6.0所专用。
403.20-Passport登录失败。这个错误代码为IIS6.0所专用。
404-未找到。
404.0-(无)–没有找到文件或目录。
404.1-无法在所请求的端口上访问Web站点。
404.2-Web服务扩展锁定策略阻止本请求。
404.3-MIME映射策略阻止本请求。
405-用来访问本页面的HTTP谓词不被允许(方法不被允许)
406-客户端浏览器不接受所请求页面的MIME类型。
407-要求进行代理身份验证。
412-前提条件失败。
413–请求实体太大。
414-请求URI太长。
415–不支持的媒体类型。
416–所请求的范围无法满足。
417–执行失败。
423–锁定的错误。
5xx-服务器错误
服务器由于遇到错误而不能完成该请求。
500-内部服务器错误。
500.12-应用程序正忙于在Web服务器上重新启动。
500.13-Web服务器太忙。
500.15-不允许直接请求Global.asa。
500.16–UNC授权凭据不正确。这个错误代码为IIS6.0所专用。
500.18–URL授权存储不能打开。这个错误代码为IIS6.0所专用。
500.100-内部ASP错误。
501-页眉值指定了未实现的配置。
502-Web服务器用作网关或代理服务器时收到了无效响应。
502.1-CGI应用程序超时。
502.2-CGI应用程序出错。application.
503-服务不可用。这个错误代码为IIS6.0所专用。
504-网关超时。
505-HTTP版本不受支持。

原文地址:https://www.cnblogs.com/mrruning/p/7636261.html