《python3网络爬虫开发实战 第二版》之基本库的使用-requests的使用 详解

news2024/11/16 5:47:10

文章目录

  • 1 requests库的使用
    • 1.1 准备工作
    • 1.2 实例引入
    • 1. 3 GET请求
      • 1.3.1 基本实例
      • 1.3.2 抓取网页
      • 1.3.3 抓取二进制数据
      • 1.3.4 添加请求头
    • 1.4 POST请求
    • 1.5 响应
    • 1.6 高级用法
      • 1.6.1 文件上传
      • 1.6.2 Cookie设置
      • 1.6.3 Session维持
      • 1.6.4 SSL证书验证
      • 1.6.5 超时设置
      • 1.6.6 身份认证
      • 1.6.7 代理设置
      • 1.6.8 Prepared Request

1 requests库的使用

使用urllib库处理页面验证和Cookie时,需要写Opener类和Handler类来处理,
此外实现POST、PUT等请求时的写法也不太方便
requests库比urllib库更为强大,Cookie、登录验证、代理设置都很简单。

1.1 准备工作

requests是第三方库,是需要安装的,
可以使用pip3来进行安装
pip3 install requests
更多安装信息可以参考 https://setup.scrape.center/requests

1.2 实例引入

urllib库中的urlopen方法实际上是以GET方式请求网页,
requests库中相应的方法就是get方法
代码如下:

def get_base():
    import requests
    r = requests.get('https://www.baidu.com')
    print(type(r))  # 响应的类型
    print(r.status_code)  # 响应状态码
    print(type(r.text))  # 响应体的类型
    print(r.text[:100])  # 响应体内容
    print(r.cookies)  # cookie

运行结果如下图所示:
在这里插入图片描述
可以发现,返回的响应的类型是requests.models.Response
响应体的类型是字符串
Cookie的类型是RequestsCookieJar

与get方法相似,同样可以采用一句话完成post、put、delete、patch等请求。

1. 3 GET请求

HTTPS请求中最常见的就是GET请求,先详细了解一个利用requests库构建GET请求。

1.3.1 基本实例

首先我们想向测试网站发送一个GET请求,
测试网站会测试发起的是否是GET请求,如果是将返回响应的请求信息。
代码如下:

def get_test():
    import requests
    r = requests.get('https://www.httpbin.org/get')
    print(r.text)

运行结果如下图所示:
在这里插入图片描述
发送GET请求时,我们可以利用get方法中的params参数来直接传递参数,而不必再进行格式转换。
代码如下:

def get_test():
    import requests
    data = {
        'name': '我是测试数据',
        'aget': 13
    }
    r = requests.get('https://www.httpbin.org/get', params=data)
    print(r.text)

运行结果如下:
在这里插入图片描述
响应体的类型虽然是str类型,但是是JSON格式的,如果想直接解析返回结果,得到一个JSON格式的数据,可以直接调用json方法
代码如下:

def get_test():
    import requests
    data = {
        'name': '我是测试数据',
        'aget': 13
    }
    r = requests.get('https://www.httpbin.org/get', params=data)
    print(type(r.text))
    print(r.json())
    print(type(r.json()))

运行的结果如下:
在这里插入图片描述
从运行结果可以看出,json 方法可以把返回结果转为字典。
但如果返回结果不是JSON格式,就会出现解析错误,抛出json.decoder.JSONDecodeError异常

1.3.2 抓取网页

我们以一个实例页面作为演示,向里面加入一点提取信息的逻辑
使用正则表达式匹配所有的电影标题。
代码如下:

def get_h2():
    import requests
    import re
    r = requests.get('https://ssr1.scrape.center/')
    patters = re.compile('<h2.*?>(.*?)</h2>', re.S)
    titles = re.findall(patters, r.text)
    print(titles)

运行结果如下图所示:
在这里插入图片描述

1.3.3 抓取二进制数据

上面是抓取了网站的一个页面,实际上返回的是一个HTML文档,如果想要抓取图片、音频、视频等文件,怎么办?
图片、音频、视频本质上都是二进制码组成,有特定的保存格式和对应得解析方式。
因此我们想要抓取它们,必须拿到它们的二进制数据。

以网站的站点图标为例
代码如下:

def get_ico():
    import requests
    r = requests.get('https://scrape.center/favicon.ico')
    print(r.content)

运行的结果如下图所示:
在这里插入图片描述
其输出的结果,最前面有一个b,说明这是bytes类型的数据。

实际上,我们不用管其输出的是什么,只需要将提取到的信息保存下来就行了
代码如下:

def get_ico():
    import requests
    r = requests.get('https://scrape.center/favicon.ico')
    with open('favicon.ico', 'wb') as f:  # 以二进制写的形式打开文件favicon.ico。如果不存在文件,就会新建。
        f.write(r.content)  # 将二进制数据写入到打开的文件中

运行之后,我目录中出现一个favicon.ico的图标,如下图所示。
这就是把二进制图片保存成了一张图片。

在这里插入图片描述

可以利用同样的方法来保存音频和视频

1.3.4 添加请求头

在进行爬虫时,我们通常会设置请求头
get方法中有一个参数是headers,便是用来添加请求头信息的。
传入的参数是字典。
代码如下:

def get_set_headers():
    import requests
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) '
                      'AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36'
    }
    r = requests.get('https://ssr1.scrape.center/', headers=headers)
    print(r.text)

1.4 POST请求

HTTP中另一种常见的请求方式是POST
使用requests来进行POST请求同样很简单

以测试网站为例。
该网站判断请求是否是POST方式,如果是,返回相关的请求信息。
代码如下:

def post_test():
    import requests
    data = {
        'name': 'wo shi post',
        'get': 33
    }
    r = requests.post('https://www.httpbin.org/post', data=data)
    print(r.text)

运行结果如下图所示:
在这里插入图片描述
可以看出 我们传入的data参数在form部分显示,这就表明data参数是提交的数据,这就证明POST方法请求成功了。

1.5 响应

请求发送之后,会得到响应,在之前的实例中,我们通过text、content获取了响应的内容。
除了这两个之外还有很多的属性和方法可以获得其他信息
如状态码(status_code)、响应头(headers)、Cookie(cookies)、URL(url)、请求历史(history)等等

状态码是来表示响应状态的,除了通过判断状态码是不是200,可以知道爬虫是否成功
requests库提供了一个内置的状态码查询对象requests.codes
实例如下:

def codes_test():
    import requests
    r = requests.get('https://ssr1.scrape.center/')
    exit() if not r.status_code == requests.codes.ok else print('Request Successful')

这里通过比较返回码(statue_code)和内置的表示成功的状态码(ok)来保证请求是否得到了正常响应。
如果是,就输出请求成功的消息,否则程序终止运行。

更多的返回码和相应的内置状态码见链接

1.6 高级用法

1.6.1 文件上传

requests库还可以实现文件上传功能
我们利用之前保存的文件favicon.ico来模拟文件上传过程
代码如下:


def file_up():
    import requests
    files = {'file': open('favicon.ico', 'rb')}
    r = requests.post('https://www.httpbin.org/post', files=files)
    print(r.text)

执行的结果如下图所示:
因为file参数值太长,因此截取了一下。

在这里插入图片描述

1.6.2 Cookie设置

Cookie的获取
代码如下:


def get_cookie():
    import requests
    r = requests.get('https://baidu.com')
    print(r.cookies)
    for key, item in r.cookies.items():
        print(key + '=' + item)

运行结果如图所示:
在这里插入图片描述
可以使用Cookie来维持登录状态,
先登录百度,将请求头中的Cookie复制下来,
然后设置headers里的Cookie,最后发送请求。

还可以通过RequestsCookieJar来设置cookie
代码如下:
其中cookie的值是从百度请求头中的cookies复制下来的,这里进行了缩减。实际运行代码时要原封不动传入进去。

def set_cookie():
    from requests import cookies
    import requests

    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36'
    }
    cookies = 'BIDUPSID=B58F86B023F80C9FC948C08AFE0EBE75; PSTM=1668075804; BDUSS=V........'
        jar = requests.cookies.RequestsCookieJar()  # 新建一个RequestCookieJar对象
    for cookie in cookies.split(';'):  # 利用split方法对复制下来的Cookie内容做分隔
        key, value = cookie.split('=', 1)
        jar.set(key, value)  # 利用set方法设置好每个Cookie条目的键名和键值,
    r = requests.get('https://baidu.com', cookies=jar, headers=headers)  # 设置cookie、headers 发送get请求
        print(r.content)

其输出结果如下图所示:
在这里插入图片描述
显然我们成功获取到了网页信息,
此处是存在编码问题的,但是目前我尚未解决!!!!!!

1.6.3 Session维持

利用Session可以做到模拟同一个会话而不用担心Cookie的问题,
通常在模拟登录成功之后,进行下一步操作时用到

请求一个测试网址 https://www.httpbin.org/cookies/set/number/123456789
在请求网址时,设置了一个Cookie条目,名称是number,内容是123456789
随后用请求了https://www.httpbin.org/cookies,来获取网站的cookie
代码如下:

def session_test():
    import requests
    s = requests.Session()
    s.get('https://www.httpbin.org/cookies/set/number/123456789')
    r = s.get('https://www.httpbin.org/cookies')
    print(r.text)

运行的结果如下:
在这里插入图片描述

1.6.4 SSL证书验证

现在很多网站使用HTTPS协议,但是有些网站可能并没有设置好HTTPS证书,或者网站的HTTPS证书可能不被CA机构认可,这时这些网站就可能出现SSL证书错误的提示

例如实例网站,使用Chrome浏览器啊打开事,会提示"您的连接不是私密连接"这样的错误。
如下图所示:
在这里插入图片描述
在浏览器中我们可以通过一些设置来忽略证书的验证
如果用requests库请求这类网站,会抛出SSLError错误
代码如下:

def SSL_test():
    import requests
    r = requests.get('https://ssr2.scrape.center')
    print(r.status_code)

输入的错误信息如下:
在这里插入图片描述
代码抛出SSLError错误,是因为我们请求的URL的证书是无效的
我们通过设置verify参数,来控制是够验证证书,
将其设置为False,那么请求时就不会再验证证书是否有效
改写上述代码:

def SSL_test():
    import requests
    r = requests.get('https://ssr2.scrape.center', verify=False)
    print(r.status_code)

运行结果如下图所示:

在这里插入图片描述

可以看出,已经打印出请求成功的状态码了,但是也报了一个警告
它建议我们给它指定证书,同样的,我们可以通过设置忽略警告的方式来屏蔽这个警告
修改上述代码如下:

def SSL_test():
    import requests
    import urllib3
    urllib3.disable_warnings()
    r = requests.get('https://ssr2.scrape.center', verify=False)
    print(r.status_code)

或者通过捕获警告到日志的方式忽略警告
代码如下:

def SSL_test():
    import requests
    # import urllib3
    # urllib3.disable_warnings()
    import logging
    logging.captureWarnings(True)
    r = requests.get('https://ssr2.scrape.center', verify=False)
    print(r.status_code)

当然还可以通过cert参数指定一个本地证书用作客户端证书,这可以是单个文件(包含密钥和证书)或者一个包含两个文件路径的元组
此外,本地私有证书的key必须是解密状态。

1.6.5 超时设置

在本机网络状态不好或者服务器网络响应太慢甚至无响应时, 我们可能会等待很久才能接到响应,甚至因为接收不到响应而报错。
为了防止服务器不能及时响应,通常设置一个超时时间,如果超过这个时间还没有得到响应,就报错
这就需要用到timeout参数,其值是从发出请求到服务器返回响应的时间
代码如下

def timeout_test():
    import requests
    r = requests.get('https://www.httpbin.org/get', timeout=1)
    print(r.text)

实际上,请求分为两个阶段:连接(connection)和读取(read)
如果想要分别指定用作连接和读取的timeout,可以传入一个元组
代码如下:

def timeout_test():
    import requests
    r = requests.get('https://www.httpbin.org/get', timeout=(0.4, 0.7))
    print(r.text)

如果想要永久等待,可以将timeout设置为None或者不设置。

1.6.6 身份认证

在访问启用了基本身份认证的网站时,会首先弹出一个认证窗口,让我们输入用户名和密码
在requests库中,我们可以通过auth参数进行设置
以网站为例
代码如下:

def auth_test():
    import requests
    r = requests.get('https://ssr3.scrape.center', auth=('admin', 'admin'))
    print(r.status_code)

我们在auth参数中传入的是HTTPBasicAuth类,
实际上,我们可以直接传入一个元组,会默认使用HTTPBasicAuth这个类来认证

requests库还提供其他的认证方式,如OAuth认证,但是此时需要安装oauth包

1.6.7 代理设置

为了防止在爬虫过程中,由于请求次数过多而被封IP,我们可以通过proxies设置代理防止IP被封
除了基本的HTTP代理之外,requests库还支持SOCKS协议的代理,但是需要安装socks库

1.6.8 Prepared Request

我们可以通过requests库中的get和post方法发送请求。
requests内部,在发送请求时,构造了一个Request对象,并给其赋予个各种参数
然后把这个Request对象发送出去,请求成功后会得到一个Response对象,最后解析这个对象

Request对象,实际上就是Prepared Request
我们之后构造一个Prepared Request对象来发送一个post请求
代码如下:

def my_post():
    from requests import Request, Session
    url = 'https://www.httpbin.org/post'
    data = {'name': 'germey'}
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36'
    }
    s = Session()
    req = Request('POST', url, data=data, headers=headers)
    prepped = s.prepare_request(req)
    r = s.send(prepped)
    print(r.text)

程序运行的结果如下图所示:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/359212.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

旅游地如何搭好影视剧“顺风车”

新春伊始&#xff0c;《满江红》《三体》《狂飙》等影视剧给影片取景地带来的关注和旅游热潮引人瞩目——从太原古县城到襄阳古城墙上的“岳”字砖、从宁波博物馆到江门的历史文化街区乃至地方特产新会陈皮……都被影视剧带上了热搜。影视作品与取景地的相互成全由来已久&#…

JavaWab开发的总括以及HTML知识

一、Web开发的总括在这里我来给大家介绍一下Wab开发需要配合哪些前后端的对应语言:首先是Java(Java通常的工作):Wab开发android开发大数据开发另外,Wab开发想要学好就需要配合之前博客中的内容,如:多线程/IO/网络/数据结构/数据库......这里建议学懂前面的内容再往下走.JavaWab…

2023年,都在说软件测试饱和了,大环境不好?为何每年还会增加40万测试员?

最近和一些刚进入软件测试行业的朋友交流&#xff0c;发现了一个有趣的现象&#xff0c;那就是对这个行业很多问题的认识是一致的、片面的&#xff0c;也可以理解为误解。利用你的时间列出他们对这个行业的所有误解&#xff0c;然后结合你多年的工作经验和你交流。毕竟你是从这…

栈的压入,弹出序列-剑指Offer-java

一、题目描述输入两个整数序列&#xff0c;第一个序列表示栈的压入顺序&#xff0c;请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如&#xff0c;序列 {1,2,3,4,5} 是某栈的压栈序列&#xff0c;序列 {4,5,3,2,1} 是该压栈序列对应的一个弹出序列&a…

2019蓝桥杯真题修改数组 C语言/C++

题目描述 给定一个长度为 N 的数组 A [A_1,A_2, ,A_N]&#xff0c;数组中有可能有重复出现的整数。 现在小明要按以下方法将其修改为没有重复整数的数组。小明会依次修改A_2,A_3, ,A_N当修改 A_i时&#xff0c;小明会检查 A_i是否在 A_1 ∼ A_i−1中出现过。如果出现过&#…

2023年2月访问学者博士后热门国家出入境政策变化汇总

近期关于出国的咨询量日益增多&#xff0c;出入境政策也是其中之一。所以本期知识人网小编汇总了最新访问学者和博士后关注的热门国家及地区入境政策变化&#xff0c;提供给大家。目前各国入境政策大致分为三种&#xff1a;一、 无法入境的国家如&#xff1a;摩洛哥、朝鲜等。二…

iconfont 图标如何在uniapp中的tabBar使用

注意&#xff1a; 小程序并不支持tabBar中 设置 iconfont 1. 材料准备 首先进入字体图标网址&#xff1a;iconfont-阿里巴巴矢量图标库&#xff1b;&#xff08;如果你没有登入&#xff0c;记得登入一下&#xff09; 把图标添加入购物车 添加到购物车之后-&#xff08;右上角…

逻辑回归—分类问题的操作顺序

对于二元分类问题来说&#xff0c;分类的结果和数据的特征之间仍呈现相关关系&#xff0c;但是y的值不再是连续的&#xff0c;是0&#xff5e;1的跃迁。但是在这个过程中&#xff0c;什么仍然是连续的呢&#xff1f;”是概率&#xff0c;概率是逐渐升高的&#xff0c;当达到一个…

JVM12 字节码指令集

1. 概述 2. 加载与存储指令 2.1. 局部变量压栈指令 iload 从局部变量中装载int类型值 lload 从局部变量中装载long类型值 fload 从局部变量中装载float类型值 dload 从局部变量中装载double类型值 aload 从局部变量中装载引用类型值&#xff08;refernce&#xff09; iload_0 从…

从交换机安全配置看常见局域网攻击

前言 构建零信任网络&#xff0c;自然离不开网络准入(NAC)&#xff0c;这就涉及到交换机的一些安全测试&#xff0c;于是有了此文《从交换机安全配置看常见局域网攻击》。 交换机安全配置 如本文标题所说从交换机安全配置看常见的局域网攻击&#xff0c;那么下面提到的各种攻…

leaflet 绘制多个点的envelope矩形(082)

第082个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+leaflet中如何根据多边形的几个坐标点来绘制envelope矩形。 直接复制下面的 vue+openlayers源代码,操作2分钟即可运行实现效果. 文章目录 示例效果配置方式示例源代码(共78行)安装插件相关API参考:专栏目标示例…

【Java】线程的生命周期和状态

一、通用的线程的生命周期&#xff0c;简称&#xff1a;五态模型&#xff1a; 初始状态&#xff1a;指语言层面上的创建线程&#xff0c;操作系统中还没有创建。可运行状态&#xff1a;指线程可以分配CPU执行&#xff0c;这时线程已经在系统中创建成功。运行状态&#xff1a;指…

0元搭建linux服务器(windows笔记本)

0元搭建linux服务器一.windows装Centos71.1 centos7 iso镜像1.2 准备U盘1.3 UltraISO 启动盘制作工具安装1.4 准备一台windows 机器1.5 安装过程二 、连接无线wifi三、固定wifi ip3.1 查看网络状态3.2 查看DNS3.3 查看GATEWAY3.4 设置静态IP四、一键快速安装单机版k8s五、申请域…

基于CCG算法的IEEE33配电网两阶段鲁棒优化调度matlab

目录 1 前言 2基本内容 2.1 配网两阶段鲁棒模型 2.2 求解步骤 3部分程序 4程序结果 5程序链接 1 前言 鲁棒优化是电力系统研究的热点&#xff0c;而两阶段鲁棒和分布鲁棒研究就成为各类期刊&#xff08;sci/ei/核心&#xff09;的宠儿&#xff0c;最简单的思路是通过改…

CACTER云网关无缝对接O365系统,反垃圾实力强硬!

01 客户背景 某IT互联网企业是国家认定的高新技术企业、上海市重点大数据企业。自成立以来&#xff0c;坚持以自主研发为本&#xff0c;以客户为中心&#xff0c;专注汽车保险科技&#xff0c;具备强大的研发实力&#xff0c;致力为行业提供数字化智能化车商保险业务管理综合解…

python采集最新世界大学排名, 来看看你的母校上榜没~

前言 大家早好、午好、晚好吖 ❤ ~ 本次内容: Python 采集世界大学排行榜 并做数据可视化 知识点: 动态数据抓包 requests发送请求 结构化非结构化数据解析 开发环境: python 3.8 运行代码 pycharm 2021.2 辅助敲代码 requests 第三方模块 pip install 模块名 本次文…

基于 DSP+FPGA 的高清图像跟踪系统研制

目标识别与跟踪技术是目前图像处理研究的重点方向&#xff0c;在军事和民用领域中 具有广泛的应用价值&#xff0c;如精确制导武器、导弹飞机预警等军事领域&#xff0c;如交通管理、 刑事侦查等民用领域。其中&#xff0c;如何在复杂的背景中&#xff0c;提取、识别与跟踪特定…

File类的用法和InputStream,OutputStream的用法

这里写自定义目录标题一、File类1.构造方法2.普通方法二、InputStream1.方法2.FileInputStream3.Scanner类的应用三、OutputStream1.方法2.FileOutputStream3.PrintWriter类的应用一、File类 1.构造方法 签名说明File(File parent, Stringchild)根据父目录 孩子文件路径&…

车载前摄像头学习笔记 ———— 视频编码格式

文章目录简介格式H.26XH.261H.263H.264/AVCNALU HeaderNALU PayloadSODBRBSPEBSPMPEG-XMPEG-1MPEG-2MPEG-4MPEG-7MPEG-21简介 视频是可以理解为连续的图像序列。获取的一帧即为一幅图像&#xff0c;在每一帧的数据中&#xff0c;所有的内容都是静止的。为什么看起来是运用的呢&…

c/c++开发,无可避免的模板编程实践(篇六)

一、泛型算法 1.1 泛型算法概述 c标准库不仅包含数据结构&#xff08;容器、容器适配器等&#xff09;&#xff0c;还有很多算法。数据结构可以帮助存放特定情况下需要保存的数据&#xff0c;而算法则会将数据结构中存储的数据进行变换。标准库没有给容器添加大量的功能函数&am…