Python爬虫——Requests库

Python爬虫——Requests库

Requests库

  • HTTP协议

    在说爬虫之前,先了解了解什么是HTTP协议。

    HTTP–Hyper Text Transfer Protocol,超文本传输协议,是一种建立在TCP上的无状态连接,整个基本的工作流程是客户端发送一个HTTP请求,说明客户端想要访问的资源和请求的动作,服务端收到请求之后,服务端开始处理请求,并根据请求做出相应的动作访问服务器资源,最后通过发送HTTP响应把结果返回给客户端。

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

    host: 合法的Internet主机域名或IP地址
    port:端口号,缺省则为80

    path:请求资源的路径

    HTTP协议对资源的操作

    GET,HEAD,POST, PUT, PATCH, DELETE(请自行查阅相关资料)

    在这里强调一下GET与POST的区别:

    1. GET方式可以通过URL提交数据,待提交的数据是URL的一部分;采用POST方式,待提交的数据放置在HTML HEADER内
    2. GET方式提交的数据最多不超过1024字节,POST没有对提交内容的长度限制
    3. 安全性问题。使用GET时参数会显示在URL中,而POST不会。所以,如果这些数据是敏感数据,建议采用POST方式
  • 什么是Requests库?

    requests库是一个简洁且简单的处理HTTP请求的第三方库。

    由于是第三方库,所以需要自行安装,pip install requests即可。

  • Requests库的主要方法

    方法 描述
    .request() 构造一个请求,以支持以下各种方法
    .get() 获取HTML网页的主要方法,对应GET请求
    .head() 获取HTML网页头信息
    .post() 提交POST请求
    .put() 提交PUT请求
    .patch() 提交局部修改请求
    .delete() 提交删除请求

    关于GET,POST,PUT等方法,请自行学习HTML中的GET,POST,PUT等请求,便于加深理解。

  • 什么是response对象

    和浏览器的交互一样,request.get()等方法代表请求过程,它返回的Response对象代表响应。返回内容作为一个对象以便操作。

  • Respon对象的常用属性与方法

    属性 描述
    r.status_code 请求返回状态,200(成功),404(失败)
    r.text 响应内容的字符串形式,即URL的页面内容
    r.encoding 从HTTPheader中猜测的响应内容编码方式
    r.apparent_encoding 从内容分析出的响应内容的编码方式
    r.content 响应内容的二进制形式
    r.headers 响应内容的头部信息
    r.url 返回请求的URL
方法 描述
r.json() 如果HTTP响应内容包含JSON格式数据,则用该方法解析JSON数据
r.raise_for_status 如果访问状态不是200,则产生HTTPError异常

注:HTTPheader中的charset字段记录了响应内容的编码方式,如果为空,则默认编码方式为“ISO-8859-1”,

直接打印内容会出现乱码,需要修改其编码方式。可通过r.encoding = r.apparent_encoding修改。

>>> import requests                                 #import Requests库
>>> r = requests.get("https://wwww.baidu.com")      #使用get方法打开百度链接
>>> type(r)                                         #返回的是response对象

<class 'requests.models.Response'>
>>> r.status_code				    #查看请求状态
200
>>> r.text[:50]					    #响应内容
'<!DOCTYPE html>\r\n<!--STATUS OK--><html> <head><met'
>>> r.encoding					    #编码方式
'ISO-8859-1'
>>> r.apparent_encoding				    #从内容分析出的编码方式
'utf-8'
>>> r.content					    #响应内容的二进制形式
  • Requests库的常用异常

    异常 描述
    ConnectionError 网络连接错误异常
    HTTPError HTTP错误
    URLRequired URL缺失异常
    TooManyRedirects 超过最大重定向次数
    ConnectTimeout 链接远程服务器超时
    Timeout 请求URL超时
  • 一般网页爬取的通用框架(用于练习的小程序)

    def getHTMLText(url):
        try:
            r = requests.get(url, timeout = 30)
            r.raise_for_status
            r.encoding = r.apparent_encoding
            return r.text
        except:
            return "爬取异常"
  • request方法详细参数

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

    method:指请求类型即,GET,POST,PUT等。

    URL:访问的URL

    **kwarys,包含13个参数,以下是其详细说明

    params: 字典或字节序列,作为参数增加到URL中

    data: 字典,字节序列或文件对象,作为Request的内容
    JSON : JOSN格式的数据,作为Request的内容

    headers:字典,HTTP定制头(模拟浏览器进行访问)
    cokies:字典或CpplieJar,Request中的cookie
    auth: 元组,支持HTTP认证功能
    files:字典类型,传输文件
    timeout: 设定超时时间,秒为单位
    proxies: 字典类型,设定访问代理服务器,可以增加登陆认证
    allow_redirects: True//False,默认为True,重定向开关
    stream: True/False,默认为True,获取内容立即下载开关
    verify: True/False,默认为True,认证SSL证书开关

    注意:Requests库的其他请求方法,都是对request方法的封装
    请看GET的源代码:
    def get(url, params=None, **kwargs):
        r"""Sends a GET request.
    
        :param url: URL for the new :class:`Request` object.
        :param params: (optional) Dictionary, list of tuples or bytes to send
            in the body of the :class:`Request`.
        :param \*\*kwargs: Optional arguments that ``request`` takes.
        :return: :class:`Response <Response>` object
        :rtype: requests.Response
        """
    
        kwargs.setdefault('allow_redirects', True)
        return request('get', url, params=params, **kwargs)   
        #通过调用request方法,得到get方法的返回值

    讲了这么多,现在就来看看代码吧!

    1.最基本的GET方法

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

    其中params默认为None

    >>> import requests
    >>> r = requests.get("https://www.baidu.com")
    >>> r.status_code
    200
    >>> r.encoding = r.apparent_encoding
    >>> r.text
    带参数的GET方法
    >>> r = requests.get("https://www.baidu.com/s?wd=Python")
    >>> r.status_code
    200
    >>> r.encoding = r.apparent_encoding
    >>> r.text
    2.通过params参数可以达到同样的目的,params为字典类型,增加到URL中。
    >>> data = {"wd" : "Python"}
    >>> r=requests.get("https://www.baidu.com/s?", params = data)
    >>> r.status_code
    200
    >>> r.url
    'https://www.baidu.com/s?wd=Python'

    上述两种的结果是相同的,通过params参数传递一个字典内容,从而直接构造url
    注意:第二种方式通过字典的方式的时候,如果字典中的参数为None则不会添加到url.

    3.解析JSON

    注意需要导入json库,下面看代码:

    >>> import json
    >>> import requests
    >>> r = requests.get("https://www.baidu.com")
    >>> r.status_code
    200
    >>> r.json()
    >>> #如果HTTP响应内容包含JSON格式数据,则用该方法解析JSON数据
    	#以上代码会报错,原因是HTTP响应内容没有JSON格式数据。这里只是演示一下。
    4.获取二进制数据

    使用r.content

    主要用于获取视频图片等二进制资源。

    5.提交Headers

    直接访问某些网站(如,知乎)是无法访问的,原因之一是其URL需要提交headers

    >>> import requests
    >>> r = requests.get("https://www.zhihu.com")
    >>> r.status_code
    400
    #出现400,表示访问出错

    Chrome的用户代理如下:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36

    将Chrome的头部信息添加到get中,注意使用字典格式

    >>> import requests
    >>> headers = {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36"}
    >>> r = requests.get("https://www.zhihu.com", headers = headers)
    >>> r.status_code
    200
    
    #User-Agent,用户代理,简称 UA,它是一个特殊字符串头,使得服务器能够识别客户使用的操作系统及版本、CPU 类型、浏览器及版本、浏览器渲染引擎、浏览器语言、浏览器插件等
    6.POST请求

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

    通过在发送post请求时添加一个data参数,data参数为字典类型。

    >>> data = {"name":"germey", "age":"23"}
    >>> r = requests.post("http://httpbin.org/post", data = data)
    >>> r.status_code
    200
    >>> r.text
    '{\n  "args": {}, \n  "data": "", \n  "files": {}, \n  "form": {\n    "age": "23", \n    "name": "germey"\n  }, \n  "headers": {\n    "Accept": "*/*", \n    "Accept-Encoding": "gzip, deflate", \n    "Connection": "close", \n    "Content-Length": "18", \n    "Content-Type": "application/x-www-form-urlencoded", \n    "Host": "httpbin.org", \n    "User-Agent": "python-requests/2.20.0"\n  }, \n  "json": null, \n  "origin": "113.251.223.127", \n  "url": "http://httpbin.org/post"\n}\n'

    在form字段中就添加了data数据

    以上就是Requests库的基本用法。

    下面附上几个mooc上的小实例

转载请注明:https://blog.csdn.net/qq_43544492

Requests库的更多用法,可以参考Requests库的官方文档:http://docs.python-requests.org

猜你喜欢

转载自blog.csdn.net/qq_43544492/article/details/84822482