zoukankan      html  css  js  c++  java
  • Python爬虫学习笔记-1.Urllib库

      urllib 是python内置的基本库,提供了一系列用于操作URL的功能,我们可以通过它来做一个简单的爬虫。

    0X01 基本使用

    简单的爬取一个页面:

    import urllib2
    request = urllib2.Request("http://www.cnblogs.com")
    response = urllib2.urlopen(request)
    print response.read()

      GET方式

    import urllib
    import urllib2
    values ={"id":1}
    data=urllib.urlencode(values)
    url="http://192.168.125.129/config/sql.php"
    geturl=url+"?"+data
    request =urllib2.Request(url)
    response =urllib2.urlopen(request)
    print response.read()

     POST方式

    import urllib
    import urllib2
    url="http://192.168.125.129/config/sql.php"
    values ={"id":1}
    data=urllib.urlencode(values)
    request = urllib2.Request(url,data)
    response=urllib2.urlopen(request)
    print response.read()

     0X02 高级用法

    1、设置Headers

      部分网站做了反爬虫策略,通过上面的程序,可能会获取不到内容,这时候我们可以模拟浏览器的工作,设置一些Headers 的属性。

    import urllib
    import urllib2
    url="http://192.168.125.129/config/sql.php"
    values ={"id":1}
    data=urllib.urlencode(values)
    headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.90 Safari/537.36'}
    request=urllib2.Request(url,data,headers)
    response =urllib2.urlopen(request)
    print response.read()

    常见的headers属性

    User-Agent : 浏览器类型,有些服务器或 Proxy 会通过该值来判断是否是浏览器发出的请求
    Content-Type : 在使用 REST 接口时,服务器会检查该值,用来确定 HTTP Body 中的内容该怎样解析。
    application/xml : 在 XML RPC,如 RESTful/SOAP 调用时使用
    application/json : 在 JSON RPC 调用时使用
    application/x-www-form-urlencoded : 浏览器提交 Web 表单时使用
    在使用服务器提供的 RESTful 或 SOAP 服务时, Content-Type 设置错误会导致服务器拒绝服务

    另外,对付防盗链,可以在headers中加入referer。

    2、设置Timeout 

          urllib2.urlopen方法,如果第二个参数data为空那么要特别指定是timeout是多少,写明形参,如果data已经传入,则不必声明。

    import urllib
    import urllib2
    url="http://192.168.125.129/config/sql.php"
    response = urllib2.urlopen(url, timeout=10)
    
    
    import urllib
    import urllib2
    url="http://192.168.125.129/config/sql.php"
    values ={"id":1}
    data=urllib.urlencode(values)
    response = urllib2.urlopen(url, data,10)

     3、异常处理

      当程序异常时,需要用try-except语句来包围并捕获相应的异常,否则程序将终止。

    import urllib
    import urllib2
    url="http://192.168.125.129/config/sql22.php"
    values ={"id":1}
    data=urllib.urlencode(values)
    try:
        request = urllib2.Request(url,data)
        response=urllib2.urlopen(request)
        print response.read()
    except urllib2.HTTPError, e:
        print e.code
        print e.reason
    except urllib2.URLError, e:
        print e.reason
    
    else:
        print "ok"

    这边使用URLError、HTTPError捕获异常,HTTPError是URLError的子类。

      4、模拟登陆

      利用cookie实现模拟登录,使用cookielib模块,代码示例:

    import urllib
    import urllib2
    import cookielib
    
    filename = 'cookie.txt'
    #声明一个MozillaCookieJar对象实例来保存cookie,之后写入文件
    cookie = cookielib.MozillaCookieJar(filename)
    opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookie))
    postdata = urllib.urlencode({
                'username':'admin',
                'password':'password'
            })
    #登录的URL
    loginUrl = 'http://site/login.php'
    #模拟登录,并把cookie保存到变量
    result = opener.open(loginUrl,postdata)
    #保存cookie到cookie.txt中
    cookie.save(ignore_discard=True, ignore_expires=True)
    #利用cookie请求访问另一个网址,此网址是后台网址
    comurl = 'http://site/index.php'
    #请求访问后台网址
    result = opener.open(comurl)
    print result.read()

      5、证书不匹配

    证书不匹配问题 SSLError(CertificateError("hostname 'xxx.com' doesn't match 'test.xxx.org'"

    对于python自带的 urllib库  解决办法

    import ssl
    ssl.match_hostname = lambda cert, hostname: True
  • 相关阅读:
    分页存储过程
    C#,单元测试
    telerik reporting报表
    在Linq to sql 和 Entity framework 中使用lambda表达式实现left join
    .NET提供了三种后台输出js的方式:
    转换人民币大小金额
    ASP.Net Post方式获取数据流的一种简单写法
    js数组中两个有相同删除一个
    我的个人博客
    It is the courage
  • 原文地址:https://www.cnblogs.com/xiaozi/p/7350843.html
Copyright © 2011-2022 走看看