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

 

posted @ 2020-11-15 21:26  CarreyB  阅读(200)  评论(0编辑  收藏  举报