您好,我是码农飞哥,感谢您阅读本文,欢迎一键三连哦。
本文是爬虫专栏的第二篇,重点介绍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请求方法是爬虫中最常用到的方法,因为爬虫主要就是爬取网页的信息。最基础的使用是
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'))
有时候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
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)
# 自定义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})
文件上传与本节爬虫的内容无关,在此就不过多介绍了。
在网络请求中,我们常常会遇到状态码是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协议,告诉网络蜘蛛哪些页面可以爬取,哪些页面不能爬取
爬虫文件的规范是:
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库的使用