您好,我是码农飞哥,感谢您阅读本文,欢迎一键三连哦。
本文是爬虫专栏的第二篇,重点介绍requests库的使用。
干货满满,建议收藏,需要用到时常看看。 小伙伴们如有问题及需要,欢迎踊跃留言哦~ ~ ~。
前言(为什么写这篇文章)
上一篇文章简单的介绍了爬虫相关的基础知识点,介绍了一个标准爬虫程序的三个步骤。这篇文章就让我们接着来学习。
本文重点介绍requests库的使用以及爬虫协议。之前也写了一篇Requests库使用的博客,有兴趣的小伙伴可以去看看。
Requests库的介绍
前面介绍了Requests库是用来抓取网页源码,请求接口的利器,整体上是要比urllib库的request更加好用的库。官网上将其称之为唯一一个非转基因的Python HTTP库,人类可以安全享用。
Requests库有7个主要方法。
方法 | 说明 |
---|---|
requests.request() | 构造一个请求,支撑以下各方法的基础方法 |
requests.get() | 获取HTML网页的主要方法,对应于HTTP的GET |
requests.head(() | 获取HTML网页头信息的方法,对应于HTTP的HEAD |
requests.post() | 向服务器指定的接口发起POST请求方法,对应于HTTP的POST |
requests.put() | 向服务器指定的接口发起PUT请求的方法,对应于HTTP的PUT |
requests.patch() | 向服务器指定的接口提供局部修改请求,对应于HTTP的PATCH |
requests.delete() | 向HTML页面提交删除请求,对应于HTTP的DELETE |
不过我们平常最常用的方法还是GET方法和POST方法。
get请求方法(不带参数)
get请求方法是爬虫中最常用到的方法,因为爬虫主要就是爬取网页的信息。最基础的使用是
res = requests.get('https://feige.blog.csdn.net/')
res.encoding = 'utf-8'
print(res.text)
这里需要通过res.encoding='utf-8'
设置响应结果的编码格式是utf-8。不然可能会出现中文乱码
如果响应结果是二进制数据的话则需要通过 res.content
方法来提取响应结果。
设置编码的方式也可以是res.content.decode('utf-8')
。
即
res = requests.get('https://feige.blog.csdn.net/')
print(res.content.decode('utf-8'))
传递URL参数
有时候get请求也需要传入参数,这里可以直接将参数拼接到URL上或者通过params参数传入一个字典。
params = {'id': 12, 'name': 'zhangsan'}
# url拼接
res = requests.get(url='https://feige.blog.csdn.net/', params=params)
# 打印url
print(res.url)
# 或者
res = requests.get(url='https://feige.blog.csdn.net/?id={0}&name={1}'.format(13, 'lisi'))
print(res.url)
运行结果是:
https://feige.blog.csdn.net/?id=12&name=zhangsan
https://feige.blog.csdn.net/?id=13&name=lisi
post请求方法
get请求只能传入简单的参数,如果参数比较复杂或者传入的参数比较多的话则GET请求就不再适用了,这时候就需要适用post请求方法了。
Post请求的请求类型有三种:
-
application/x-www-form-urlencoded
这是以form表单的方式来提交post请求。 -
application/json;charset=utf-8
这是以json字符串的格式,将请求参数放在RequestBody中的方式。 -
form-data
这种方式一般是用来上传文件用的。
以表单的方式提交
以表单的方式提交数据是POST请求的默认的请求格式,只需要将参数放在一个字典中进行传入即可。
url = "http://127.0.0.1:8080/v1/ls/voice/save"
data = {"dst_audio": "9d62ca66-326f-4070-9993-5f89f790dc68.wav"}
res = requests.post(url, data)
content = res.content.decode('utf-8')
print(content)
以json字符串的方式提交
# 自定义Headers
header = {
'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.82 Safari/537.36',
'content-type': 'application/json;charset=utf-8'
}
data = '{\"coupon\": true}'
res = requests.post('https://msg.csdn.net/v1/web/message/view/unread', headers=header, data=data)
print(res.content.decode('utf-8'))
这里将请求头的数据放在一个名为header的字典中,然后在请求时通过headers参数传入。在请求中设置了内容类型是application/json,编码格式是charset=utf-8
传入的是一个json字符串,通过data参数进行传入。json字符串可以直接写也可以通过json.dumps(dict)
方法将一个字典序列化,就像下面这样。
import json
data = json.dumps({'coupon': True})
文件上传
文件上传与本节爬虫的内容无关,在此就不过多介绍了。有兴趣的小伙伴可以看看Python中如何编写接口,以及如何请求外部接口 这篇文章。
重定向
在网络请求中,我们常常会遇到状态码是3开头的重定向问题,在Requests中是默认开启允许重定向的,即遇到重定向时,会自动继续访问。通过将allow_redirects 属性设置为False不允许重定向。
requests.get('https://www.baidu.com/', allow_redirects=False)
设置超时
通过timeout属性可以设置超时时间,单位是秒。get方法和post方法均可设置。
requests.get('https://www.baidu.com/', timeout=0.1)
获取响应码
通过status_code属性可以获取接口的响应码。
# 状态码(status_code)
res = requests.get('https://www.baidu.com/')
print('响应码是=', res.status_code)
禁止证书验证
有时候我们使用了抓包工具,这时候由于抓包证书提供的证书并不是受信任的数字证书颁发机构颁发的,所以证书的验证会失败,所以我们就需要关闭证书验证。在请求的时候把verify参数设置为False就可以关闭证书验证了。
requests.get('https://www.baidu.com/', verify=False)
爬虫协议
爬虫协议也叫做robots协议,告诉网络蜘蛛哪些页面可以爬取,哪些页面不能爬取
爬虫文件的规范是:
- 必须将robots.txt 代码保存为文本文件
- 必须将该文件保存到网站的顶级目录下
- robots.txt 文件必须命名为robots.txt 文件
比如要查看百度网站的robots.txt文件,只需要输入 https://www.baidu.com/robots.txt 即可
拦截所有的机器人:
User-agent:*
Disallow:/
允许所有的机器人
User-agent:*
Disallow:
豆瓣登录案例
import requests
# 登录页面
img_url = "https://accounts.douban.com/j/mobile/login/basic"
# 添加请求头
header = {
'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.82 Safari/537.36'
}
data = {
'ck': '5oo_',
'name': '1211****',
'password': '121211',
'remember': 'false'
}
# 发送登录信息到服务器
images = requests.post(img_url, data=data, verify=False, headers=header)
# 接收服务器返回的cookies
cookies = images.cookies
# 发送请求
idex = requests.get('https://www.douban.com/', headers=header, cookies=cookies)
print(idex.text)
总结
本文详细介绍了Request库的使用
粉丝专属福利
软考资料:实用软考资料
面试题:5G 的Java高频面试题
学习资料:50G的各类学习资料
脱单秘籍:回复【脱单】
并发编程:回复【并发编程】
👇🏻 验证码 可通过搜索下方 公众号 获取👇🏻
全网同名【码农飞哥】。不积跬步,无以至千里,享受分享的快乐
我是码农飞哥,再次感谢您读完本文。