Python爬虫:requests模块的基本使用

学习目标:

  1. 了解 requests模块的介绍
  2. 掌握 requests的基本使用
  3. 掌握 response常见的属性
  4. 掌握 requests.text和content的区别
  5. 掌握 解决网页的解码问题
  6. 掌握 requests模块发送带headers的请求
  7. 掌握 requests模块发送带参数的get请求

1 为什么要重点学习requests模块,而不是urllib

  • requests的底层实现就是urllib
  • requests在python2 和python3中通用,方法完全一样
  • requests简单易用
  • Requests能够自动帮助我们解压(gzip压缩的等)响应内容

2 requests的作用

作用:发送网络请求,返回响应数据

补充:Python爬虫踩坑:UnicodeEncodeError: 'gbk' codec can't encode character 全有效解的决方法

  • PyCharm设置
  • 我注意到,我已经用utf-8来解码了,但是解释器的报错信息还是暴出gbk方面的解码错误。
  • 会对这串二进制流进行处理的只有三方,一方是Chrome浏览器,一方是Python解释器,另一方是PyCharm,事实证明Chrome浏览器用utf-8格式是可以解析的,那么格式肯定是对的,StreamReader类已经考虑到了异常字符的处理方式,所以Python本身也不会有问题,那么问题只有可能出在PyCharm的设置上了。
  • 点击File -> Settings...

将下面的GBK改成UTF-8就可以解决这个问题了:

大功告成:

3 requests模块发送简单的get请求、获取响应

需求:通过requests向百度首页发送请求,获取百度首页的数据

python 复制代码
import requests

# 目标url
url = 'https://www.baidu.com'

# 向目标url发送get请求
response = requests.get(url)

# 打印响应内容
print(response.text)

response的常用属性:

  • response.text 响应体 str类型
  • respones.content 响应体 bytes类型
  • response.status_code 响应状态码
  • response.request.headers 响应对应的请求头
  • response.headers 响应头
  • response.request._cookies 响应对应请求的cookie
  • response.cookies 响应的cookie(经过了set-cookie动作)

思考:text是response的属性还是方法呢?

  • 一般来说名词,往往都是对象的属性,对应的动词是对象的方法

3.1 response.text 和response.content的区别

  • response.text

    • 类型:str
    • 解码类型: requests模块自动根据HTTP 头部对响应的编码作出有根据的推测,推测的文本编码
    • 如何修改编码方式:response.encoding="gbk"
  • response.content

    • 类型:bytes
    • 解码类型: 没有指定
    • 如何修改编码方式:response.content.deocde("utf8")

获取网页源码的通用方式:

  1. response.content.decode()
  2. response.content.decode("GBK")
  3. response.text

以上三种方法从前往后尝试,能够100%的解决所有网页解码的问题

所以:更推荐使用response.content.deocde()的方式获取响应的html页面

3.2 练习:把网络上的图片保存到本地

我们来把www.baidu.com的图片保存到本地

思考:

  • 以什么方式打开文件
  • 保存什么格式的内容

分析:

python 复制代码
import requests

# 图片的url
url = 'https://www.baidu.com/img/bd_logo1.png'

# 响应本身就是一个图片,并且是二进制类型
response = requests.get(url)

# print(response.content)

# 以二进制+写入的方式打开文件
with open('baidu.png', 'wb') as f:
    # 写入response.content bytes二进制类型
    f.write(response.content)

4 发送带header的请求

我们先写一个获取百度首页的代码

python 复制代码
import requests

url = 'https://www.baidu.com'

response = requests.get(url)

print(response.content)

# 打印响应对应请求的请求头信息
print(response.request.headers)

为什么请求需要带上header?

模拟浏览器,欺骗服务器,获取和浏览器一致的内容

4.1 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.2 用法

requests.get(url, headers=headers)

4.3 完整的代码

python 复制代码
import requests

url = 'https://www.baidu.com'

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"}

# 在请求头中带上User-Agent,模拟浏览器发送请求
response = requests.get(url, headers=headers)

# print(response.content)

# 打印请求头信息
print(response.request.headers)

5 发送带参数的请求

我们在使用百度搜索的时候经常发现url地址中会有一个 ?,那么该问号后边的就是请求参数,又叫做查询字符串

5.1 什么叫做请求参数:

例1:https://blog.csdn.net/weixin_51390582

例2:https://blog.csdn.net/weixin_51390582?spm=1011.2415.3001.5343

例1中没有请求参数!例2中?后边的就是请求参数

5.2 请求参数的形式:字典

kw = {'wd':'长城'}

5.3 请求参数的用法

requests.get(url,params=kw)

5.4 关于参数的注意点

在url地址中, 很多参数是没有用的,比如百度搜索的url地址,其中参数只有一个字段有用,其他的都可以删除

如何确定那些请求参数有用或者没用:挨个尝试!

对应的,在后续的爬虫中,越到很多参数的url地址,都可以尝试删除参数

5.5 两种方式:发送带参数的请求

https://www.baidu.com/s?wd=python发起请求可以使用requests.get(url, params=kw)的方式

python 复制代码
# 方式一:利用params参数发送带参数的请求
import requests

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"}

# 这是目标url
# url = 'https://www.baidu.com/s?wd=python'

# 最后有没有问号结果都一样
url = 'https://www.baidu.com/s?'

# 请求参数是一个字典 即wd=python
kw = {'wd': 'python'}

# 带上请求参数发起请求,获取响应
response = requests.get(url, headers=headers, params=kw)

# 当有多个请求参数时,requests接收的params参数为多个键值对的字典,比如 '?wd=python&a=c'-->{'wd': 'python', 'a': 'c'}

print(response.content)

也可以直接对https://www.baidu.com/s?wd=python完整的url直接发送请求,不使用params参数

python 复制代码
# 方式二:直接发送带参数的url的请求
import requests

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"}

url = 'https://www.baidu.com/s?wd=python'

# kw = {'wd': 'python'}

# url中包含了请求参数,所以此时无需params
response = requests.get(url, headers=headers) 

小结

  1. requests模块的介绍:能够帮助我们发起请求获取响应
  2. requests的基本使用:requests.get(url)
  3. 以及response常见的属性:
  • response.text 响应体 str类型
  • respones.content 响应体 bytes类型
  • response.status_code 响应状态码
  • response.request.headers 响应对应的请求头
  • response.headers 响应头
  • response.request._cookies 响应对应请求的cookie
  • response.cookies 响应的cookie(经过了set-cookie动作)
  1. 掌握 requests.text和content的区别:text返回str类型,content返回bytes类型
  2. 掌握 解决网页的解码问题:
  • response.content.decode()
  • response.content.decode("GBK")
  • response.text
  1. 掌握 requests模块发送带headers的请求:requests.get(url, headers={})
  2. 掌握 requests模块发送带参数的get请求:requests.get(url, params={})
相关推荐
深蓝海拓5 分钟前
Pyside6(PyQT5)中的QTableView与QSqlQueryModel、QSqlTableModel的联合使用
数据库·python·qt·pyqt
无须logic ᭄12 分钟前
CrypTen项目实践
python·机器学习·密码学·同态加密
百流25 分钟前
scala文件编译相关理解
开发语言·学习·scala
Channing Lewis25 分钟前
flask常见问答题
后端·python·flask
Channing Lewis27 分钟前
如何保护 Flask API 的安全性?
后端·python·flask
水兵没月1 小时前
钉钉群机器人设置——python版本
python·机器人·钉钉
Evand J2 小时前
matlab绘图——彩色螺旋图
开发语言·matlab·信息可视化
我想学LINUX2 小时前
【2024年华为OD机试】 (A卷,100分)- 微服务的集成测试(JavaScript&Java & Python&C/C++)
java·c语言·javascript·python·华为od·微服务·集成测试
深度混淆2 小时前
C#,入门教程(04)——Visual Studio 2022 数据编程实例:随机数与组合
开发语言·c#