zoukankan      html  css  js  c++  java
  • 爬虫——requests库使用方法

    一、什么是Requests

    Requests 是⽤Python语⾔编写,基于urllib,采⽤Apache2 Licensed开源协议的 HTTP 库。它⽐ urllib 更加⽅便,可以节约我们⼤量的⼯作,完全满⾜HTTP测试需求。

    ⼀句话——Python实现的简单易⽤的HTTP库

    二、安装Requests库

    进入命令行win+R执行

    命令:pip install requests

    项目导入:import 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页面提交删除请求,对应于

    1、get 和 post比较常见(最常用的还是get)

    GET请求将提交的数据放置在HTTP请求协议头中
    POST提交的数据则放在实体数据中

    2、put和patch的区别

    假设URL位置有一组数据UserInfo,包括UserID、UserName等20个字段

    需求:用户修改了UserName,其他不变

    • 采用PATCH,仅向URL提交UserName的局部更新请求

      • 采用PUT,必须将所有20个字段一并提交到URL,未提交字段被删除

    PATCH的最主要好处:节省网络带宽

    3、方法的可选参数

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

    data : 字典、字节序列或文件对象,作为Request的内容

    json : JSON格式的数据,作为Request的内容 headers : 字典,HTTP定制头

    cookies : 字典或CookieJar,Request中的cookie auth : 元组,支持HTTP认证功能

    files : 字典类型,传输文件

    timeout : 设定超时时间,秒为单位

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

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

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

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

    cert : 本地SSL证书路径

    (1)、基本的GET请求

    import requests
     
    response = requests.get('http://httpbin.org/get')
    print(response.text)

    (2)、带参数的GET请求

    import requests
    
    response = requests.get("http://httpbin.org/get?name=germey&age=22")
    print(response.text)

    或者使用params的方法:

    import requests
     
    data = {
     'name': 'germey',
     'age': 22
    }
    response = requests.get("http://httpbin.org/get", params=data)
    print(response.text)

    (3)、解析json

    将返回值已json的形式展示:

    import requests
    import json
     
    response = requests.get("http://httpbin.org/get")
    print(type(response.text))
    print(response.json())
    print(json.loads(response.text))
    print(type(response.json()))

    返回值:注意打印的类型

    <class 'str'>
    {'args': {}, 'headers': {'Accept': '*/*', 'Accept-Encoding': 'gzip, deflate', 'Connection': 'close', 'Host': 'httpbin.org', 'User-Agent': 'python-requests/2.18.4'}, 'origin': '183.64.61.29', 'url': 'http://httpbin.org/get'}
    {'args': {}, 'headers': {'Accept': '*/*', 'Accept-Encoding': 'gzip, deflate', 'Connection': 'close', 'Host': 'httpbin.org', 'User-Agent': 'python-requests/2.18.4'}, 'origin': '183.64.61.29', 'url': 'http://httpbin.org/get'}
    <class 'dict'>

    (4)、获取二进制数据

    返回值.content就ok了

    import requests
     
    response = requests.get("https://github.com/favicon.ico")
    print(type(response.text), type(response.content))
    print(response.text)
    print(response.content)

    (5)、添加headers

    有些网站访问时必须带有浏览器等信息,如果不传入headers就会报错,如下

    import requests
     
    response = requests.get("https://www.zhihu.com/explore")
    print(response.text)

    没有带headers时执行之后会返回500

    <html><body><h1>500 Server Error</h1>
    An internal server error occured.
    </body></html>

    当传入headers时:

    import requests
     
    headers = {
     'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36'
    }
    response = requests.get("https://www.zhihu.com/explore", headers=headers)
    print(response.text)

    成功返回网页源代码不做展示

    (6)、基本POST请求

    import requests
     
    data = {'name': 'germey', 'age': '22'}
    response = requests.post("http://httpbin.org/post", data=data)
    print(response.text)

    也可以以json格式传入

    import requests
     
    data = {'name': 'germey', 'age': '22'}
    response = requests.post("http://httpbin.org/post", json=data)
    print(response.text)

    三、响应

    response属性

    r.status_code        http请求的返回状态,200表示连接成功,404表示连接失败

    r.text              http响应内容的字符串形式,url对应的页面内容

    r.encoding         从HTTP header中猜测的响应内容编码方式

    r.apparent_encoding      从内容分析出的响应内容的编码方式(备选编码方式)

    r.content          HTTP响应内容的二进制形式

    r.headers          http响应内容的头部内容

    import requests
     
    response = requests.get('http://www.jianshu.com')
    print(type(response.status_code), response.status_code)    #返回状态码
    print(type(response.headers), response.headers)         #放回的头信息
    print(type(response.cookies), response.cookies)         #返回的cookie
    print(type(response.url), response.url)              #返回的url     
    print(type(response.history), response.history)         #返回的历史

    return:

    <class 'int'> 200
    <class 'requests.structures.CaseInsensitiveDict'> {'Date': 'Thu, 01 Feb 2018 20:47:08 GMT', 'Server': 'Tengine', 'Content-Type': 'text/html; charset=utf-8', 'Transfer-Encoding': 'chunked', 'X-Frame-Options': 'DENY', 'X-XSS-Protection': '1; mode=block', 'X-Content-Type-Options': 'nosniff', 'ETag': 'W/"9f70e869e7cce214b6e9d90f4ceaa53d"', 'Cache-Control': 'max-age=0, private, must-revalidate', 'Set-Cookie': 'locale=zh-CN; path=/', 'X-Request-Id': '366f4cba-8414-4841-bfe2-792aeb8cf302', 'X-Runtime': '0.008350', 'Content-Encoding': 'gzip', 'X-Via': '1.1 gjf22:8 (Cdn Cache Server V2.0), 1.1 PSzqstdx2ps251:10 (Cdn Cache Server V2.0)', 'Connection': 'keep-alive'}
    <class 'requests.cookies.RequestsCookieJar'> <RequestsCookieJar[<Cookie locale=zh-CN for www.jianshu.com/>]>
    <class 'str'> https://www.jianshu.com/
    <class 'list'> [<Response [301]>]

    四、高级操作

    (1)、文件上传

    使用 Requests 模块,上传文件也是如此简单的,文件的类型会自动进行处理:

    实例:

    import requests
     
    files = {'file': open('cookie.txt', 'rb')}
    response = requests.post("http://httpbin.org/post", files=files)
    print(response.text)

    (2)、获取cookie

    当需要cookie时,直接调用response.cookie:(response为请求后的返回值)

    import requests
     
    response = requests.get("https://www.baidu.com")
    print(response.cookies)
    for key, value in response.cookies.items():
     print(key + '=' + value)

    (3)、会话维持、模拟登陆

    如果某个响应中包含一些Cookie,你可以快速访问它们:

    import requests
     
    r = requests.get('http://www.google.com.hk/')
    print(r.cookies['NID'])
    print(tuple(r.cookies))

    要想发送你的cookies到服务器,可以使用 cookies 参数:

    import requests
     
    url = 'http://httpbin.org/cookies'
    cookies = {'testCookies_1': 'Hello_Python3', 'testCookies_2': 'Hello_Requests'}
    # 在Cookie Version 0中规定空格、方括号、圆括号、等于号、逗号、双引号、斜杠、问号、@,冒号,分号等特殊符号都不能作为Cookie的内容。
    r = requests.get(url, cookies=cookies)
    print(r.json())

    (4)、证书验证

    因为12306有一个错误证书,我们那它的网站做测试会出现下面的情况,证书不是官方证书,浏览器会识别出一个错误

    import requests
     
    response = requests.get('https://www.12306.cn')
    print(response.status_code)

    怎么正常进入这样的网站了,代码如下:

    import requests
    from requests.packages import urllib3
    urllib3.disable_warnings()
    response = requests.get('https://www.12306.cn', verify=False)
    print(response.status_code)

    urllib3.disable_warnings()这条命令主要用于消除警告信息

    将verify设置位False即可,返回的状态码为200

    (5)、代理设置

    在进行爬虫爬取时,有时候爬虫会被服务器给屏蔽掉,这时采用的方法主要有降低访问时间,通过代理ip访问,如下:

    import requests
     
    proxies = {
     "http": "http://127.0.0.1:9743",
     "https": "https://127.0.0.1:9743",
    }
     
    response = requests.get("https://www.taobao.com", proxies=proxies)
    print(response.status_code)

    ip可以从网上抓取,或者某宝购买

    如果代理需要设置账户名和密码,只需要将字典更改为如下:
    proxies = {
    "http":"http://user:password@127.0.0.1:9999"
    }
    如果你的代理是通过sokces这种方式则需要pip install "requests[socks]"
    proxies= {
    "http":"socks5://127.0.0.1:9999",
    "https":"sockes5://127.0.0.1:8888"
    }

    (6)、超时设置

    访问有些网站时可能会超时,这时设置好timeout就可以解决这个问题

    import requests
    from requests.exceptions import ReadTimeout
    try:
     response = requests.get("http://httpbin.org/get", timeout = 0.5)
     print(response.status_code)
    except ReadTimeout:
     print('Timeout')

    (7)、认证设置

    如果碰到需要认证的网站可以通过requests.auth模块实现

    import requests
     
    from requests.auth import HTTPBasicAuth
     
    response = requests.get("http://120.27.34.24:9001/",auth=HTTPBasicAuth("user","123"))
    print(response.status_code)

    当然这里还有一种方式

    import requests
     
    response = requests.get("http://120.27.34.24:9001/",auth=("user","123"))
    print(response.status_code)

    (8)、异常处理

    遇到网络问题(如:DNS查询失败、拒绝连接等)时,Requests会抛出一个ConnectionError 异常。

    遇到罕见的无效HTTP响应时,Requests则会抛出一个 HTTPError 异常。

    若请求超时,则抛出一个 Timeout 异常。

    若请求超过了设定的最大重定向次数,则会抛出一个 TooManyRedirects 异常。

    所有Requests显式抛出的异常都继承自 requests.exceptions.RequestException 。

    requests.ConnectionError     网络连接错误异常,如DNS查询失败、拒绝连接等

    requests.HTTPError       HTTP错误异常 requests.URLRequired URL缺失异常

    requests.TooManyRedirects    超过最大重定向次数,产生重定向异常

    requests.ConnectTimeout     连接远程服务器超时异常

    requests.Timeout         请求URL超时,产生超时异常

    response.raise_for_status()   调用该方法检测如果不是200,产生异常 requests.HTTPError

    import requests
    
    def getHTMLText(url):
        try:
            r = requests.get(url)
            r.raise_for_status()#如果状态不是200,则会引发HTTPError异常
            r.encoding = r.apparent_encoding
            return r.text
        except:
            return "产生异常"
    
    if __name__=="__main__":
        url = "http://www.baidu.com"
        print(getHTMLText(url))

    摘自:https://blog.csdn.net/byweiker/article/details/79234853

  • 相关阅读:
    PAT (Advanced Level) 1060. Are They Equal (25)
    PAT (Advanced Level) 1059. Prime Factors (25)
    PAT (Advanced Level) 1058. A+B in Hogwarts (20)
    PAT (Advanced Level) 1057. Stack (30)
    PAT (Advanced Level) 1056. Mice and Rice (25)
    PAT (Advanced Level) 1055. The World's Richest (25)
    PAT (Advanced Level) 1054. The Dominant Color (20)
    PAT (Advanced Level) 1053. Path of Equal Weight (30)
    PAT (Advanced Level) 1052. Linked List Sorting (25)
    PAT (Advanced Level) 1051. Pop Sequence (25)
  • 原文地址:https://www.cnblogs.com/lyh233/p/12750578.html
Copyright © 2011-2022 走看看