网络爬虫,英译为 web crawler ,是一种自动化程序,如今咱们很幸运,生处互联网时代,有大量的信息在网络上均可以查获得,可是有时咱们须要网络上的数据,活着文章,图片等等,可是,一个个地复制,粘贴是否是太傻了,循着 “DRY” 的设计原则,咱们但愿用一个自动化的程序,自动帮咱们匹配到网络上面的数据,而后下载下来,为咱们所用。其中,搜索引擎就是个很好的例子,搜索引擎技术里面大量使用爬虫,他爬取下整个互联网的内容,存储在数据库里面,作索引。html
python作网络爬虫主要用到了两个库,urllib,urllib2,官方英文文档看不懂,弱菜只好去看看别人的。python
1.获取html文本web
1 # -*- coding:utf-8 -*- 2 import urllib2 3 response = urllib2.urlopen("http://www.baidu.com"); 4 print response.read(); #返回一个对象,使用对象read()方法,获取html文本
除了"http:",URL一样可使用"ftp:","file:"等等来替代。HTTP是基于请求和应答机制的:客户端提出请求,服务端提供应答。还能够用urllib2用一个Request对象来映射你提出的HTTP请求:req = urllib2.Request('http://www.baidu.com');最后输出内容与上面的同样数据库
1 # -*- coding:utf-8 -*- 2 import urllib2 3 req = urllib2.Request("http://www.baidu.com"); 4 response = urllib2.urlopen(req); #传入一个request对象 5 print response.read();
2.URLError异常处理: 浏览器
1.首先解释下URLError可能产生的缘由:服务器
咱们经过try-except来捕捉异常。cookie
1 # -*- coding:utf-8 -*- 2 import urllib2 3 4 url = "http://www.gsdsff.com" 5 req = urllib2.Request(url) 6 try: 7 response = urllib2.urlopen(req) 8 except urllib2.URLError,e: 9 print e.reason 10 else: 11 print "ok"
输出:网络
[Errno 11001] getaddrinfo failed [Finished in 0.5s]
这是用urllib2来访问一个不存在的网站,错误代号,错误缘由。工具
2.HTTPError为URLError的一个子类,在你利用urlopen方法发出一个请求时,服务器上都会对应一个应答对象response,其中它包含一个数字”状态码”。HTTP状态码表示HTTP协议所返回的响应的状态。post
1 # -*- coding:utf-8 -*- 2 import urllib2 3 4 url = 'http://blog.csdn.net/cqcre' 5 req = urllib2.Request(url) 6 try: 7 response = urllib2.urlopen(req) 8 except urllib2.HTTPError,e: 9 print e.code,e.reason 10 else: 11 print "ok"
输出:
1 403 Forbidden 2 [Finished in 0.2s]
常见状态码:
100:继续 客户端应当继续发送请求。客户端应当继续发送请求的剩余部分,或者若是请求已经完成,忽略这个响应。
101: 转换协议 在发送完这个响应最后的空行后,服务器将会切换到在Upgrade 消息头中定义的那些协议。只有在切换新的协议更有好处的时候才应该采起相似措施。
102:继续处理 由WebDAV(RFC 2518)扩展的状态码,表明处理将被继续执行。
200:请求成功 处理方式:得到响应的内容,进行处理
201:请求完成,结果是建立了新资源。新建立资源的URI可在响应的实体中获得 处理方式:爬虫中不会遇到
202:请求被接受,但处理还没有完成 处理方式:阻塞等待
204:服务器端已经实现了请求,可是没有返回新的信 息。若是客户是用户代理,则无须为此更新自身的文档视图。 处理方式:丢弃
300:该状态码不被HTTP/1.0的应用程序直接使用, 只是做为3XX类型回应的默认解释。存在多个可用的被请求资源。 处理方式:若程序中可以处理,则进行进一步处理,若是程序中不能处理,则丢弃
301:请求到的资源都会分配一个永久的URL,这样就能够在未来经过该URL来访问此资源 处理方式:重定向到分配的URL302:请求到的资源在一个不一样的URL处临时保存 处理方式:重定向到临时的URL
304:请求的资源未更新 处理方式:丢弃
400:非法请求 处理方式:丢弃
401:未受权 处理方式:丢弃
403:禁止 处理方式:丢弃
404:没有找到 处理方式:丢弃
500:服务器内部错误 服务器遇到了一个不曾预料的情况,致使了它没法完成对请求的处理。通常来讲,这个问题都会在服务器端的源代码出现错误时出现。
501:服务器没法识别 服务器不支持当前请求所须要的某个功能。当服务器没法识别请求的方法,而且没法支持其对任何资源的请求。
502:错误网关 做为网关或者代理工做的服务器尝试执行请求时,从上游服务器接收到无效的响应。
503:服务出错 因为临时的服务器维护或者过载,服务器当前没法处理请求。这个情况是临时的,而且将在一段时间之后恢复。
http://cuiqingcai.com/968.html
实例:
# -*- coding:utf-8 -*- import urllib2 import urllib import cookielib def renrenBrower(url,user,password): #登录页面,能够经过抓包工具分析得到,如fiddler,wireshark login_page = "http://www.renren.com/PLogin.do" try: #得到一个cookieJar实例 cj = cookielib.CookieJar() #cookieJar做为参数,得到一个opener的实例 opener=urllib2.build_opener(urllib2.HTTPCookieProcessor(cj)) #假装成一个正常的浏览器,避免有些web服务器拒绝访问。 opener.addheaders = [('User-agent','Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)')] #生成Post数据,含有登录用户名密码。 data = urllib.urlencode({"email":user,"password":password}) #以post的方法访问登录页面,访问以后cookieJar会自定保存cookie opener.open(login_page,data) #以带cookie的方式访问页面 op=opener.open(url) #读取页面源码 data= op.read() return data except Exception,e: print str(e) #访问某用户的我的主页,其实这已经实现了人人网的签到功能。 k = renrenBrower("http://www.renren.com/home","xxxxx","xxxxx") f = open('a.txt','w') f.write(k) f.close