【python】爬虫系列Day02--requests库

🙋作者:爱编程的小贤
⛳知识点: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去发送网络请求 首先先回顾一下爬虫的工作原理:

  1. 确定url(无论是爬取什么数据,首先都要确定好你要下载的数据的url)
  2. 发起请求
  3. 获取响应数据
  4. 提取数据
  5. 存入数据

1. requests模块发送get请求

  1. 需求:通过requests向百度首页发送请求,获取该页面的源码
  2. 运行下面的代码,观察打印输出的结果
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()) # 注意这里!

在这里插入图片描述

  1. response.text是requests模块按照chardet模块推测出的编码字符集进行解码的结果
  2. 网络传输的字符串都是bytes类型的,所以response.text = response.content.decode(‘推测出的编码字符集’)
  3. 我们可以在网页源码中搜索 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)

✨总结

本文到这里就结束啦👍👍👍 ,如果有帮到你欢迎给个三连支持一下哦❤️ ❤️ ❤️
文章中有哪些不足需要修改的地方欢迎指正啦!!!让我们一起加油👏👏👏

最最最后还是要提示一下啦!!!!!🔺🔺🔺

提示:做爬虫一定要**注意**如果涉及到私人信息或者公司单位的机密信息就不要去碰,爬虫开发过程中意外拿到了用户私人信息或者公司机密,千万不要交易!!!!掌握好爬虫的度就没有任何问题!!!!!!

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

奋斗中的小贤

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值