python之网络爬虫

  网络爬虫,英译为 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来访问此资源    处理方式:重定向到分配的URL

302:请求到的资源在一个不一样的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
相关文章
相关标签/搜索