zoukankan      html  css  js  c++  java
  • python之网络爬虫

      网络爬虫,英译为 web crawler ,是一种自动化程序,现在我们很幸运,生处互联网时代,有大量的信息在网络上都可以查得到,但是有时我们需要网络上的数据,活着文章,图片等等,但是,一个个地复制,粘贴是不是太傻了,循着 “DRY” 的设计原则,我们希望用一个自动化的程序,自动帮我们匹配到网络上面的数据,然后下载下来,为我们所用。其中,搜索引擎就是个很好的例子,搜索引擎技术里面大量使用爬虫,他爬取下整个互联网的内容,存储在数据库里面,做索引。

      python做网络爬虫主要用到了两个库,urllib,urllib2,官方英文文档看不懂,弱菜只好去看看别人的。

    1.获取html文本

    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来捕捉异常。

     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协议所返回的响应的状态。

     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
  • 相关阅读:
    【转】ubuntu 12.04 LTS 网络配置要点
    Sqlite3在FS_S5PC100开发板上的移植
    java中常用的字符串的截取方法
    一种很好的程序调试方法!
    win7修复MBR
    .tar.xz文件的解压
    linux环境下LED驱动编程一例
    Eclipse设置:背景与字体大小和xml文件中字体大小调整
    ARM LDR与MOV的区别
    windows下从任意目录快速进入CMD
  • 原文地址:https://www.cnblogs.com/a1225234/p/5281314.html
Copyright © 2011-2022 走看看