文章目录
- 前言
- 一、Request库的使用?
- 二、响应Response中的属性
- 3.用户代理(User-Agent)
前言
Request库是一个Python的第三方库,用于发送HTTP请求和处理HTTP响应
。它提供了简单而方便的接口,使得发送HTTP请求变得容易。
Request库具有以下特点
:
-
简单易用:Request库提供了简洁的API,使得发送HTTP请求变得非常简单。只需编写几行代码,就可以发送GET、POST等类型的请求。
-
支持各种请求方法:Request库支持常见的HTTP请求方法,如GET、POST、PUT、DELETE等。
-
支持多种协议:Request库支持HTTP协议和HTTPS协议,可以处理普通的HTTP请求和加密的HTTPS请求。
-
提供丰富的请求参数:Request库允许设置各种请求参数,包括请求头、请求体、查询参数、Cookie等。可以通过设置这些参数,来模拟登录、传递参数等操作。
-
支持文件上传:Request库支持文件上传,可以方便地上传文件到服务器。
-
支持会话管理:Request库可以维持一个会话,在多次请求之间保持一些信息的状态,如Cookie等。这样可以实现模拟登录、保持会话等功能。
-
提供错误处理机制:Request库提供了异常处理机制,可以捕获请求过程中的异常,进行错误处理。
总之,Request库是一个功能强大、易用性高的HTTP请求库,适用于各种爬虫和网络请求的场景。无论是发送简单的GET请求还是复杂的POST请求,Request库都能够满足需求,并且提供了丰富的功能和接口,使得开发变得更加便捷。
一、Request库的使用?
Request库的作用:在爬虫中利用它去发送网络请求
代码演示:
import requests
# 程序入口
if __name__ == '__main__':
# 1.确定哦url
url_ = 'https://www.baidu.com/' # 以字符串的形式呈现
# 2.发送网络请求
response_ = requests.get(url_) #目标的url,利用requests发送网络请求,最终得到一个响应对象
# print(response_.encoding) # ISO-8859-1
# print(response_) # <Response [200]> 对象的形式
bytes_data = response_.content
str_data = bytes_data.decode('utf-8') # 使用正确的编码方式去解码,将字节数据解码成看得懂的字符数据
# 仅仅拿到响应对象没有用,我们要的是里面的数据
print(type(response_.text), response_.text) # 得到该url对应的相应数据 得到的是字符串类型的数据
print(type(response_.content), response_.content) # 得到该url对应的相应数据 但是得到的是字节类型的数据
# 3.解析数据
#这里用到的知识我们还没有学习到,因此我们这里就不做过多的介绍,后面再详细叙述。
# 4.保存
# 第一种保存方式
with open('baidu_02.html', 'w', encoding='utf-8') as f: # 常用的格式:html,json,mp3,MP4,jpg
f.write(str_data)
# 第二种保存方式
# 由于content得到的是字节类型的数据,是二进制模式,因此用wb进行写入,并且不需要encodeing
with open('baidu_01.html', 'wb') as f: # 常用的格式:html,json,mp3,MP4,jpg
f.write(bytes_data)
结果
:
二、响应Response中的属性
分类
- 1.respose.text 响应str类型
- 2.response.content 响应tybes类型
- 3.response.status_code 响应状态码
- 4.response.request.headers 响应对象的请求头
- 5.response.headers 响应头
- 6.response.request.cookie 响应对象请求的cookie
- 7.response.cookie 响应cookie (经历了set-cookie)
代码演示:
if __name__ == '__main__':
# 1.确定哦url
url_ = 'https://www.baidu.com/' # 以字符串的形式呈现
# 2.发送网络请求
response = requests.get(url_)
print(response.status_code) # 响应状态码 200成功 301跳转 400页面找不到 500服务器出现问题
print(response.request.headers) # 响应对象的请求头,响应对象还包括了我们的请求信息(已经被服务端解析了一次的请求信息)
# {'User-Agent': 'python-requests/2.31.0', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive'}
# 正常访问浏览器 用户代理(代表请求者的身份)(重点)
# User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36
print(response.headers) # 响应头
# {'Cache-Control': 'private, no-cache, no-store, proxy-revalidate, no-transform', 'Connection': 'keep-alive', 'Content-Encoding': 'gzip', 'Content-Type': 'text/html', 'Date': 'Sun, 17 Mar 2024 06:25:15 GMT', 'Last-Modified': 'Mon, 23 Jan 2017 13:24:17 GMT', 'Pragma': 'no-cache', 'Server': 'bfe/1.0.8.18', 'Set-Cookie': 'BDORZ=27315; max-age=86400; domain=.baidu.com; path=/', 'Transfer-Encoding': 'chunked'}
# 响应对应请求的cookie
print(response.request._cookies) # <RequestsCookieJar[]> CookieJar对象
# 响应对象的Cookie(经历了set-Cookie动作)
print(response.cookies) # <RequestsCookieJar[<Cookie BDORZ=27315 for .baidu.com/>]>
3.用户代理(User-Agent)
定义
:用户代理(User Agent)是指在网络中使用HTTP协议的客户端,通常是指网络浏览器。用户代理在发送请求时会在请求头中包含一个User-Agent字段,用来标识发送请求的客户端的信息。
作用
:
-
标识客户端:用户代理可以告诉服务器发送请求的客户端是什么类型的设备,例如是PC端的浏览器、移动端的浏览器还是爬虫程序。服务器可以根据不同的用户代理来返回不同的页面或者进行不同的处理。
-
支持不同的内容格式:用户代理可以告诉服务器它所支持的内容格式,如HTML、XML、JSON等。服务器可以根据用户代理的设置来返回适合的内容格式。
-
适配不同设备:用户代理可以告诉服务器发送请求的客户端的设备特性,如屏幕尺寸、分辨率、操作系统等。服务器可以根据这些信息进行适配,返回适合不同设备的页面或者资源。
-
防止网站屏蔽或限制:有些网站可能会根据特定的用户代理来屏蔽或限制访问。通过设置合适的用户代理,可以绕过这些限制。
-
跟踪用户行为:用户代理中的User-Agent字段还可以包含一些其他的信息,如操作系统版本、浏览器版本等。这些信息可以被网站用于跟踪用户的行为。
在爬虫中我们为什么要使用用户代理:
假设一种情况,我们需要爬取某网页的数据,就需要去填写http协议,这里面就包含了用户代理的各种信息。但是在爬虫中,我们往往不会只取一个或者两个数据,我们需要的是得到大量的数据,但是服务器并不傻,我们用一个用户在短时间内多次访问,比如1s访问100次,那么显然这不是一个正常的人可以做到的,很容易被检测出是一个爬虫程序,从而禁止我们进行访问,这就是服务端的反爬。在这种情况下我们就不得不去换用户代理,因此在一次性多次访问统一页面的时候,需要不断去更换用户代理,才能尽可能避免去被检测。
那么又有一个新的问题,我们再上面也进行了网页数据的爬取,没有使用用户代理,那我们为什么还可以得到数据呢?
这就可能对于不同的网站有不同的效果,有的网站会返回给你一些不重要的数据进行敷衍一下,而有的网站更可怕的是会返回给你一些错误的数据,因此用户代理就显得尤为重要了。
代码实现:
if __name__ == '__main__':
# 1.确定哦url
url_ = 'https://www.baidu.com/' # 以字符串的形式呈现
# 2.1通过User-Agent,隐藏爬虫身份
# 利用键值对:{'User-Agnet':'User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36'}
# 注意点1:横杠必须是英文状态下的
# 注意点2:横杠前后不能加空格,键值前面也不能有空格
# 注意点3:键名和键值都必须要有引号
# 注意点4:User-Agent首字母必须大写
# 注意点5:用户代理和代理IP不是同一个概念,用户代理代表客户端身份,代理Ip代表的是一个IP地址
headers_ = {
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36'
}
# 2.发送网络请求
response_ = requests.get(url_, headers=headers_) # 目标的url,利用requests发送网络请求,最终得到一个响应对象
bytes_data = response_.content
str_data = bytes_data.decode('utf-8')
# 4.保存
with open('baidu_03.html', 'w', encoding='utf-8') as f: # 常用的格式:html,json,mp3,MP4,jpg
f.write(str_data) # 这样我们就可以得到完整的数据了
User-Agent对于服务端是一个反爬点,对于爬虫来说是一个模拟正常用户的一部分
结果展示
每个梦想,都是在现实中坚持不懈才实现的。