zoukankan      html  css  js  c++  java
  • 002 Python网络爬虫与信息提取 Requests库

    [A] Requests库的安装

      Pycharm中自行安装第三方库

    [B] Requests库的七个主要方法

    方法 说明
    requests.request() 构造一个请求,支持一下个方法的基础方法
    requests.get() 获取HTML网页的主要方法,对应于HTTP的get方法
    requests.head() 获取HTML网页的头信息方法,对应于HTTP的head方法
    requests.post() 向HTML网页提价交post请求,对应于HTTP的post方法
    requests.put() 向HTML网页提价交put请求,对应于HTTP的put方法
    requests.patch() 向HTML网页提价交局部修改请求,对应于HTTP的patch方法
    requests.delete() 向HTML网页提价交删除请求,对应于HTTP的delete方法

        实际上,request方法为Request库的基本方法,其他六种方法内部都是通过调用request方法来发送请求的。

    [C] requests的get()方法

      语法:

          r = requests.get(url, params = None, **kwargs)

      参数:

        url:必填,拟获取页面的url链接

        params:可选,url中的额外参数,字典获字节流格式

        **kwargs:可选,12个控制访问的参数

      返回值:一个包含服务器资源的 Response 对象

      说明:

        1. requests.get() 方法创建了一个向服务器发送请求的Request对象

        2. 返回值 r 为一个包含服务器资源的 Response 对象,里面也包含请求的相关信息

      示例代码:

    import requests
    r = requests.get('http://www.baidu.com')
    
    # 打印状态码
    # status = r.status_code
    # status = r.text
    # status = r.encoding
    # status = r.apparent_encoding
    status = r.content
    print(status)
    
    # 更改编码
    # r.encoding = 'utf-8'
    # t = r.text
    # print(t)
    View Code

      

      Response对象的属性

    属性 说明
    r.status_code HTTP请求的返回状态,200表示连接成功,404表示连接失败
    r.text HTTP响应内容的字符串形式,即url对应的页面内容
    r.encoding 从HTTP header 中猜测的响应内容的编码形式
    r.apparent_encoding 从内容中分析出来的响应内容的编码方式(备选编码方式)
    r.content HTTP响应内容的二进制形式
    r.headers 获取HTTP的头部信息

         

            r.encoding 和 r.apparent_encoding 的比较:

                    网络上的资源都是经过编码之后存储在服务器中的,有的服务器对编码形式有格式要求,有的没有;

                      有格式要求的,会在其 header 信息的 charset 属性中赋值,没有格式要求的则 charset 属性未被赋值

                1. r.encoding 是从HTTP的header中直接读取对应的 charset 的值,获取编码格式要求,如果 charset 中没有值,则编码默认为ISO-8859-1

                2. r.apparent_encoding 是根据返回资源的内容中分析,确定该资源的编码形式

              实际上,r.apparent_encoding  中存储的编码格式要相比于r.encoding 更准确

     

    [D] 爬取网页的通用代码框架

        通用代码框架:即一组代码,可以准确可靠的爬取网页上的内容。

      1. 爬虫代码在运行时,经常会出现各种错误,这些错误会导致爬取内容失败,常见的Requests库的异常有六种:

    异常 说明
    requests.ConnectionError 网络连接错误异常,如DNS查询失败,拒绝访问等等
    requests.HTTPError HTTP错误异常
    requests.URLRequired URL缺失异常
    requests.TooMangRedirects 超过最大重定向次数,产生重定向异常
    requests.ConnectTimeout 连接远程服务器超时异常
    requests.Timeout 请求URL超时,产生超时异常

     

      2. 通用代码框架代码示例

            谨记:网络连接有风险,异常处理很重要

          Requests库提供了一种异常响应的方法:r.raise_for_status()    能判断响应码r.status是不是200,不是则产生异常HTTPError

    import requests
    
    def getHTMLText(url):
        try:
            r = requests.get(url, timeout=30)
            r.raise_for_status()    # 如果状态不是200,则抛出HTTPError异常
            r.encoding = r.apparent_encoding
            return r.text
        except:
            return '哎呦,产生异常了,我的主人'
    
    if __name__ == "__main__":
        url = 'http://ww.baidu.com'
        print(getHTMLText(url))
    View Code

    [E] HTTP协议及Requests库方法

      1. 相关概念解释

        HTTP协议:Hypertext Transfer Protocol,超文本传输协议。

        HTTP是一个基于 响应与请求 模式的,无状态的应用层协议。

            请求与响应模式:即用户发起请求,服务器响应的模式

            无状态:即第一次请求跟第二次请求之间并没有相应关联

            应用层协议:表示该协议工作在TCP协议之上

        HTTP协议采用URL作为定位网络资源的标识。

        URL格式:http://host [:post] [path]

            host:合法的 Internet 主机域名或者IP地址

            post:端口号,缺省时默认为80

            path:请求资源的路径

        HTTP URL的理解:

            URL是通过HTTP协议存取资源的 Internet 路径,一个URL就对应一个数据资源

      2. HTTP协议对资源的操作

          HTTP协议对资源有一些操作的功能,如下:

    方法 说明
    get() 请求获取URL位置的资源
    head() 请求获取URL位置资源的响应信息报告,即获得该资源的头部信息
    post() 请求向URL位置的资源附加新的数据,不修改原来的数据
    put() 请求向URL位置存储一个资源,覆盖掉原来位置的资源
    patch() 请求局部更新URL位置的资源,即改变该处资源的部分内容
    delete() 请求删除URL位置存储的资源

              put 方法和 patch 方法的比较:

                1. put 方法是用提交的数据替换原来该位置的数据,之前的数据都不存在了

                2. patch 方法是根据提交的数据更新原来该位置的数据

                比较来说,put 是用新的数据覆盖掉原来的数据,而 patch 是用新的数据来修改原来的数据

        HTTP协议对资源的操作的理解:

            1. HTTP协议通过URL对网络上的资源进行标识;

            2. 用户可以通过HTTP协议的get,head方法获取数据;

            3. 也可以通过put, post, patch, delete方法将自己的数据放到网络上,或者对网络上的资源进行修改和删除等操作;

            4. 在 HTTP 的世界里,网络通过和服务器都是黑匣子,我们能直接看到的就是URL和这些操作方法。

        HTTP协议与Requests库的对应关系:

    HTTP协议 Requests库方法 功能一致性
    GET requests.get() 一致
    HEAD requests.head() 一致
    POST requests.post() 一致
    PUT requests.put() 一致
    PATCH requests.patch() 一致
    DELETE requests.delete() 一致

       

    [F] Requests库的主要方法解析

          Requests库的主要方法指的就是 Requests.request() 方法.

        requests.request(method, url, **kwargs)

          参数:

            method:请求方式,即'GET', 'HEAD', 'POST', 'PUT', 'PATCH', 'DELETE', 'OPTIONS'这些方法

            url: 拟访问的链接

            **kwargs: 控制访问的参数,均为可选项

                params:字典或字符串,作为参数增加到 url 中

                    给 params 赋值键值对,这些信息会被添加到当前 url 中去,服务器会根据 url 和 params中的要求,对资源进行筛选并返回回来,如: 

    import requests
    
    kv = {'key1': 'value1', 'key2': 'value2'}
    r = requests.request('GET', 'http://python123.io/wa', params=kv)
    print(r.url)    # 返回值为:https://python123.io/wa?key1=value1&key2=value2

                data: 字典,字符串或文件对象,作为Requests的内容

                    通过 data 传入的数据不会添加到 URL 中,会存储在 url 对应位置的资源中

    import requests
    
    # 存储键值对
    kv = {'key1': 'value1', 'key2': 'value2'}
    r = requests.request('POST', 'http://python123.io/ws', data=kv)
    # 存储字符串
    body = '主体内容'.encode(encoding='UTF-8')      # 将字符串进行编码后存储
    r = requests.request('POST', 'http://python123.io/ws', data=body)

                json:JSON格式的数据,作为 request 的内容,类似于data,目前没发现什么区别

    kv = {'key1': 'value1', 'key2': 'value2'}
    r = requests.request('POST', 'http://python123.io/ws', json=kv)

                headers: 字典,HTTP定制头,即定制某个url访问魔偶个HTTP的协议头

    # headers
    hd = {'user-agent': 'Chrome/10'}        # 模拟Chrome v10版本发送请求
    r = requests.request('POST', 'http://python123.io/ws', headers=hd)

                cookies: 字典或者CookieJar, Request中的cookie,可以从HTTP协议中解析cookie,属于高级功能

                ayth:元组,支持HTTP认证功能,属于高级功能

                files:字典类型,用于向 url 提交一个文件

    # files
    fs = {'file': open('data.xls', 'rb')}
    r = requests.request('POST', 'http://python123.io/ws', files=fs)

                timeout:设定超时时间,以秒为单位,当在指定时间未响应时会报错

                proxies:字典类型,设定访问代理服务器,可以增加登录认证

                    设置代理服务器后,我们访问服务器时使用的IP地址就是代理服务器的IP地址,这样有效的隐藏真实的IP地址,防止爬虫被逆追踪。

    # proxies
    pxs = {'http': 'http://user:pass@10.10.10.1:1234',
           'https': 'https://10.10.10.1:1234'}
    r = requests.request('GET', 'http://www.baidu.com', proxies=pxs)

                allow_redirects: True/False, 默认为True,重定向开关

                stream:True/False, 默认为True,获取内容立即下载开关

                verify:True/False, 默认为True,认证SSL证书开关

                cert:本地SSL证书路径

                

    [G] Requests相关方法解析

        1. requests.get(url, params=None, **kwargs)

        2. requests.head(url, **kwargs)

        3. requests.post(url, data=None, json=None, **kwargs)

        4. requests.put(url, data=None, **kwargs)

        5. requests.patch(url, data=None, **kwargs)

        6. requests.delets(url, **kwargs)

      get()方法是最常用的一个方法,因为服务器上的数据可以随便访问,但是对于数据提交,修改和删除等操作是严格把控的

  • 相关阅读:
    codeforces round #234B(DIV2) B Inna and New Matrix of Candies
    关于禁止ipad的home键解决方法
    ios cocos2d 画线出现闪烁问题
    ios 关于[xxx timeIntervalSinceNow]出现EXC_BAD_ACCESS错误的解决办法
    Codeforces Round #228 (Div. 2) B. Fox and Cross
    Codeforces Round #228 (Div. 2) A. Fox and Number Game
    c语言 %p
    xcode 编译opencv ios容易出现的错误
    ios编译ASIHTTPRequest时出现 'libxml/HTMLparser.h' file not found in ASIHTTPRequest
    当编译CCBReader时出现 “ CCBAnimationManager.m Use of undeclared identifier 'other‘ ” 解决方法
  • 原文地址:https://www.cnblogs.com/carreyBlog/p/13979069.html
Copyright © 2011-2022 走看看