🙋作者:爱编程的小贤
⛳知识点:python爬虫—requests库
🥇:每天学一点,早日成大佬
文章目录
👊 前言
💎 💎 💎今天为大家介绍爬虫的requests库啦!!! 这是爬虫的第二讲咯!!!🚀 🚀 🚀
如果你看完感觉对你有帮助,,,欢迎给个三连哦💗!!!您的支持是我创作的动力。🌹 🌹 🌹 🌹 🌹 🌹 感谢感谢!!!😘😘😘
✨一、requests模块介绍
1、了解requests
- requests是一个用python编写的基于Apache2 licensed许可证的HTTP库,它比urllib2更佳简洁。
- Request支持HTTP连接保持和连接池,支持使用cookie保持会话,支持文件上传,支持自动响应内容的编码,支持国际化的URL和POST数据自动编码。
- 在python内置模块的基础上进行了高度的封装,从而使得python进行网络请求时,变得人性化,使用Requests可以轻而易举的完成浏览器可有的任何操作。
2、安装requests
pip install requests
换源pip install requests -i https://pypi.douban.com/simple
更新pip:python -m pip install --upgrade pip
✨二、requests的作用
1.作用
发送网络请求,返回响应数据
2.requests文档
http://docs.python-requests.org/zh_CN/latest/index.html
通过观察文档来学习:如何使用requests来发送网络请求
✨三、request请求
爬虫:模拟客户端,发送网络请求,获取响应 在python中,使用第三方库requests去发送网络请求
接下来我们来使用requests去发送网络请求 首先先回顾一下爬虫的工作原理:
- 确定url(无论是爬取什么数据,首先都要确定好你要下载的数据的url)
- 发起请求
- 获取响应数据
- 提取数据
- 存入数据
1. requests模块发送get请求
- 需求:通过requests向百度首页发送请求,获取该页面的源码
- 运行下面的代码,观察打印输出的结果
import requests
# 目标url
url = 'https://www.baidu.com'
# 向目标url发送get请求
response = requests.get(url)
# 打印响应内容
print(response.text)
观察上边代码运行结果发现,有好多乱码;这是因为编解码使用的字符集不同早造成的;我们尝试使用下边的办法来解决中文乱码问题
2. response响应对象
"""下载百度首页"""
# 1. 确认目标url: www.baidu.com
url = "https//www.baidu.com" # 字符串形式呈现
response = requests.get(url) # 使用requests库发送网络请求,然后会从服务器接收到一个响 应对象
print(response) # 注意是一个对象,包含响应状态码
这样仅仅是拿到响应对象,并不是我们期望的数据,那么要如何才能够拿到数据呢
import requests
# 目标url
url = 'https://www.baidu.com'
# 向目标url发送get请求
response = requests.get(url)
# 打印响应内容
# print(response.text)
print(response.content.decode()) # 注意这里!
- response.text是requests模块按照chardet模块推测出的编码字符集进行解码的结果
- 网络传输的字符串都是bytes类型的,所以response.text = response.content.decode(‘推测出的编码字符集’)
- 我们可以在网页源码中搜索 charset ,尝试参考该编码字符集,注意存在不准确的情况 response.text 返回字符串类型,默认”iso-8859-1”编码,服务器不指定的话是根据网页的响应来进行编 码。
3.response.text 和response.content的区别
- response.text
- 类型:str
- 解码类型: requests模块自动根据HTTP头部对响应的编码作出有根据的推测,推测的文本编码
- response.content
- 类型:bytes
- 解码类型: 没有指定
4. 对response.content进行decode,来解决中文乱码
- response.content.decode() 默认utf-8
- response.content.decode(“GBK”)
- 常见的编码字符集
- utf-8
- gbk/gb2312
- ascii
- iso-8859-1(最多能表示的字符范围是0-255,应用于英文系列)
import requests # 1.确认目标得url,注意:url从network里面寻找,因为网页时由network里面所有数据构成的
url = "https://www.baidu.com/" # 字符串的方式进行呈现
# 2.发送网络请求,得到请求的数据
response = requests.get(url) # 目标的url 利用requests库发送网络请求,最终得到一个响应对象
print(response) # 响应对象 对象的形式
# 仅仅拿到响应对象没有用,我们要的是里面的数据
print(response.text) # 得到该url对象的响应代码(数据)字符串类型
print(type(response.text)) # 响应response的text属性 得到是string字符串类型的数据
print(response.content) # 得到该url对象的响应代码(数据) 字节类型
print(type(response.content)) # 得到的是字节类型
我们目前获取到了数据,但是怎么把数据保存在成文件呢?
with创建临时运行环境
作用:with用于创建一个临时的运行环境,运行环境中的代码执行完后自动安全退出环境。
文件操作:使用open进行文件操作使建议使用with创建运行环境,可以不用close()方法关闭文件,无论在文件使用中遇到什么问题都能安全的退出,即使发生错误,退出运行时环境时也能安全退出文件并给出报错信息。
语法:
with open("文件","标识符",encoding="UTF-8") as 变量名:
import requests # 1. 确认目标url
url = "https://www.baidu.com/" # 字符串的方式进行呈现
# 2.发送网络请求,得到响应数据
response = requests.get(url) # 得到字符串类型 str_data =
response.text
# 4.保存数据
with open("baidu.html", 'w') as f:
f.write(str_data)
# f = open("baidu_01.html",'w',encoding='utf-8')
#f.write(str_data)
#f.close()
UnicodeEncodeError: ‘gbk’ codec can’t encode character ‘\xe7’ in position 318: illegal multibyte sequence 一旦出现UnicodeEncodeError错误,就在open后面加上 encoding=‘utf-8’
import requests
# 1. 确认目标url
url = "https://www.baidu.com/" # 字符串的方式进行呈现
# 2.发送网络请求,得到响应数据
response = requests.get(url)
# 得到字符串类型
str_data = response.text
# 4.保存数据 #-----------
with open("baidu_01.html", 'w', encoding='utf-8') as f:
f.write(str_data)
查看保存下来的文件发现,中文出现了乱码,这是为什么呢?
前面讲text的时候说过服务器不指定的话是根据网页的响应来猜测编码。
乱码的原因:从网络请求拿下来的数据都是字节类型 我们使用text直接拿到的是字符串类型并没
有进行解码操作 注意:使用text会自动进行解码操作 编解码格式问题,text会自动识别编解码格式进行解码,但是不一定正确 text检测错了编解码的格式,导致我们拿到的就是乱码
既然text会出现乱码,那我们就换种方式,用content直接获取字节类型的数据就是了嘛
解决方式:可以使用response.content直接获取字节类型的数据
# 1.确认目标得url,注意:url从network里面寻找,因为网页时由network里面所有数据构成的
url = "https://www.baidu.com/" # 字符串的方式进行呈现
# 2.发送网络请求,得到请求的数据
response = requests.get(url) # 目标的url 利用requests库发送网络请求,最终得到一个响应 对象# 得到字节类型 bytes_data = response.content #
# 4.保存 由于text得到的是str类型,因此用w写入
with open('baidu_02.html', 'wb') as f:
f.write(bytes_data) # 字节类型的数据
我们刚刚是偷了个小懒,换了一种方式,但是text的乱码我们还是要解决的啦
那么我们怎么解决呢?现在是编码错误,那么我们编码解码改一下不就行了嘛?
如果从网上获取的数据,我们要根据他的编码就行解码
问题又来了,我们怎么知道它的编码呢?那么我们就来学习一下新函数,确定网上数据的编码格 式
response.encoding 获取response对象的编码
import requests
# 1. 确认目标url
url = "https://www.baidu.com/" # 字符串的方式进行呈现
# 2.发送网络请求,得到响应数据
response = requests.get(url)
#-----------
print(response.encoding)
# text自动检测到的编码解码格式 ISO-8859-1
#--------------
# 得到字符串类型
str_data = response.text
# 4.保存数据
with open("baidu_03.html", 'w', encoding='utf-8') as f:
f.write(str_data)
现在我们知道编码格式了,是不是就可以进行编码解码数据了呢?
# 1.确认目标得url,注意:url从network里面寻找,因为网页时由network里面所有数据构成的
url = "https://www.baidu.com/" # 字符串的方式进行呈现
# 2.发送网络请求,得到请求的数据
response = requests.get(url) # 目标的url 利用requests库发送网络请求,最终得到一个响应 对象
print(response.encoding) # text自动检测到的编码解码格式 ISO-8859-1
# 方式一:
data = response.text # 得到 ISO-8859-1
# 中文出现乱码
print(type(data))
# print(data)
# 通过如下两步解决乱码
bytes_data = data.encode("ISO-8859-1") # 使用他检测到的格式变成字节类型
# 拿到了字节类型的数据,使用utf-8进行解码,是不是就变成了我们看的懂得字符串
str_data =bytes_data.decode()
print(str_data) # 字符串类型的数据
# 我们发现encode就是为了把数据变成字节类型,但我们的content本身获取的数据就是字节类型,所以就 可以省略encode了
# 方式二:
bytes_data = response.content # 得到字节类型的数据
# 拿到了字节类型的数据,直接进行解码,默认使用的utf-8格式
str_data = bytes_data.decode() # decode解码
print(type(str_data))
print(str_data) # 字符串类型的数据
在浏览器查看下载的文件 通过network的解析,已经提前知道了他是html格式的数据了 打开网页的两种方法
方法一:.点击文件=》右键=》点击Open in Brower=>选择浏览器
方法二:在Terminal =>在html文件路径下=>start 文件名.html
结果分析:
方法一pycharm直接打开的本地html文件会自动渲染一下,会自动请求某些需要的部分(图片部 分:比如百度logo)
方法二使用终端start打开的话,是什么就打开什么,没有的就没有,不会请求
✨四、常用属性
- response.text 响应体 str类型
- respones.content 响应体 bytes类型
- response.status_code 响应状态码
- response.request._cookies 响应对应请求的cookie
- response.cookies 响应的cookie(经过了set-cookie动作)
- response.headers 响应头
- response.request.headers 响应对应的请求头
# # 1.确认需要数据的url,目标url需要是一个字符串
url = "https://www.baidu.com/"
# 2.发送响应请求,获取响应对象
response = requests.get(url)
# print(response)
# # 响应状态码 200请求成功 301跳转 400页面找不到 500服务器出现了错误
# print(response.status_code)
# 响应头
print(response.headers)
# response.request._cookies 响应对应请求的cookie
print(response.request._cookies)
# 这是一个CookieJar对象
print(response.cookies)
# # 响应对象的请求头,响应对象里面还包含了请求头(重点)
print(response.request.headers)
输出结果:
{'User-Agent': 'python-requests/2.25.1',
'Accept-Encoding': 'gzip, deflate',
'Accept': '*/*',
'Connection': 'keep-alive'}
注意:'User-Agent': 'python-requests/2.25.1' 代表百度的服务器已经知道了我们是python爬虫
那么我们怎么不让它知道我们是python爬虫呢?
我们可以使用浏览器的用户代理,假装我们是浏览器#正常的使用浏览器访问,用户代理(代理请求的身份)
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25
Safari/537.36 Core/1.70.3870.400 QQBrowser/10.8.4405.400
✨五、用户代理User-Agent
1.思考
对比浏览器上百度首页的网页源码和代码中的百度首页的源码,有什么不同?
代码中的百度首页的源码非常少,为什么?
2.为什么请求需要带上header?
模拟浏览器,欺骗服务器,获取和浏览器一致的内容
3.header的形式:字典
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36"}
4.用法
requests.get(url, headers=headers)
""" 演示用户代码的使用User-Agent """
# 我们使用爬虫去访问百度首页,其实已经是被检测到了是爬虫的身份
# 百度首页已经知道了我们是爬虫程序的情况下,为啥还是给我们返回了数据
# 1.拒绝我们的访问
# 2.数据不重要的
# 3.返回给你假数据
import requests
# 1.确认目标的url
url = "https://www.baidu.com/"
# 2.发送网络请求
# 2.1 实现User-Agent 用户代理,隐藏爬虫身份,使用正常浏览器的身份
# 键名:User-Agent: 值 headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3861.400 QQBrowser/10.7.4313.400" }
# 2.2 发送网络请求,把用户代理User-Agent带上,参数名称固定,headers
response = requests.get(url, headers=headers)
bytes_data = response.content # 获取字节类型的数据
str_data = bytes_data.decode() # 进行数据的解码
print(str_data)
# 4.保存数据到本地,如果写入的str类型出现了乱码,就加上utf-8
with open("D:/Django/Study_Django/test/爬虫/requests模块/baidu_04.html", 'w', encoding='utf-8') as f:
f.write(str_data)
""" 对比爬取的网页和打开的网页:
发现爬取的网页少了很多数据,被识别成爬虫了
尽可能模式正常的用户,模拟客户端去发送请求
解决:隐藏爬虫身份
"""
# 正常用户的身边:
# Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3861.400 QQBrowser/10.7.4313.400
5.User-Agent池
前面我们使用User-Agent模拟浏览器访问,那么如果我访问多次呢?难不成就写多个?那如果访问上百次怎么办?
问题就是同一个User-Agent 访问上百次… 非正常用户行为, 以此来判断你是一个爬虫程序
解决方法:创建一个列表,里面放100个User-Agent池,每一次请求时,都随机从里面拿数据比
如张三,李四,王五。。。
# 简单演示如何使用
# import random #
# 1.使用列表,,里面存放很多的user-agent的值
user_agent_list = [
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36',
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4183.121 Safari/537.36',
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4183.121 Safari/537.36',
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/82.0.4183.121 Safari/537.36'
]
这样手动生成太笨拙了,那么我们可不可以随机生成呢?
fake_useragent 用来随机生成用户代理
# import random
# 呈现的是一个灰色,, 那么就代表没有被使用
# 2. 一个第三方库可以提供
pip install fake-useragent -i https://pypi.douban.com/simple
# 一般使用是下划线, 下载的时候都是中横线
from fake_useragent import FakeUserAgent # 注意此处的random不是随机函数
user_agent_demo = FakeUserAgent().random
print(user_agent_demo)
✨总结
本文到这里就结束啦👍👍👍 ,如果有帮到你欢迎给个三连支持一下哦❤️ ❤️ ❤️
文章中有哪些不足需要修改的地方欢迎指正啦!!!让我们一起加油👏👏👏
最最最后还是要提示一下啦!!!!!🔺🔺🔺
提示:做爬虫一定要**注意**如果涉及到私人信息或者公司单位的机密信息就不要去碰,爬虫开发过程中意外拿到了用户私人信息或者公司机密,千万不要交易!!!!掌握好爬虫的度就没有任何问题!!!!!!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/100727.html