一、Requests库的使用
在静态网页抓取中,Requests是一个非常完善,而且操作简单的强大库。它可以很简单的发送http请求。
requests库也可以通过pip下载 cmd终端键入
pip install requests
获取响应内容
在requests中 最常用的功能是获取某个网页内容
现在以我csdn博客主页为例
import requests r=requests.get('https://blog.csdn.net/weixin_51852924?spm=1011.2124.3001.5343') print('网页编码',r.encoding) print('响应状态码',r.status_code) print('字节方式响应体',r.content)
结果:
网页编码 None 响应状态码 200 字节方式响应体 b''
从字节响应可以看出是字节,所以网页编码为none。
使用方法 | 说明 |
---|---|
r.text | 服务器响应内容,会自动根据响应头部的字符编码进行解码 |
r.status_code | 检测响应状态码。如果返回200,表示请求成功;如果返回的是4xx,表示客户端错误;返回5xx表示服务器错误响应 |
r.content | 字节方式响应体,自动解码gzip和deflate编码的响应数据 |
r.json | 是requests中内置的json解码器 |
r.encoding | 服务器内容使用的文本编码 |
1.传递URL参数
为了请求特定数据,需要我们在url的查询字符中加入某些数据。如果是自己构建的url,那么数据一般会跟在一个问号后,并且以键值对的形式放在url中 。对此是不是有些迷惑?举个例子
哔哩哔哩搜索罗小黑 并拿到他的链接
因为数据比较多不止一页,我们翻下一页
是不是发现了什么? 再看看第三页
从第二页开始 ,链接末尾有一个&page=2 第三页是&page=3
这就是一个url传递的参数
在requests中可以直接把这些参数保存至字典中,用params(参数)构建到url中。
这里还是使用我的博客首页做演示
import requests k_dict={'key1':'value1','key2':'value2'} r=requests.get('https://blog.csdn.net/weixin_51852924?spm=1011.2124.3001.5343',params=k_dict) print('url编码',r.url) print('响应状态码',r.status_code)
结果
url编码 https://blog.csdn.net/weixin_51852924?spm=1011.2124.3001.5343&key1=value1&key2=value2 响应状态码 200
可以看见结果最后有&key1=value1&key2=value2
2.定制请求头
请求头Headers提供了关于请求,响应或其它发送实体的信息。对于爬虫而言,请求头十分重要。因为请求头可以反映出一些基础信息,包括浏览器的型号,版本,或者是爬虫python版本,等等。
对于一些基础的反爬虫,就会通过头部信息来拦截爬虫。
那么我们的头部信息在哪查询呢? 这里还要用到检查。
随便打开一个页面 然后打开检查
点击Network
然后点击name行第一个 就可以看见如下
可以看见有一个Request Headers 下拉 可以看见Request Headers
请求的头部信息,提取其中重要信息
:authority: search.bilibili.com
:method: GET
accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,/;q=0.8,application/signed-exchange;v=b3;q=0.9
accept-encoding: gzip, deflate, br
upgrade-insecure-requests: 1
user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36
提取其中重要部分,把代码改为
import requests k_dict={'key1':'value1','key2':'value2'} headers={'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36','authority': 'search.bilibili.com'} r=requests.get('https://blog.csdn.net/weixin_51852924?spm=1011.2124.3001.5343',params=k_dict,headers=headers) print('url编码',r.url) print('响应状态码',r.status_code)
结果:
url编码 https://blog.csdn.net/weixin_51852924?spm=1011.2124.3001.5343&key1=value1&key2=value2 响应状态码 200
这里可能你体会不到什么因为结果没什么变化,实际上有些网站会根据头信息判断反爬虫,没有头部信息的爬虫会被拦截拿不到任何信息。
3.设置超时
有时候爬虫会遇到服务器长时间不返回,这时候如果没有设置超时,爬虫就会一直等待。
在Requests中有一个timeout函数,可以设置超时,程序在timeout内没有应答就终止程序并返回异常。
异常内可能包含requests.exceptions.ConnectTimeout:
时间限制在timeout秒内,连接到某网站时间已到。
2.发送post请求
除了GET请求以外还有Post请求。因为有时需要发送一些编码为表单形式的数据,比如说在登陆的时候需要账号密码就是用post请求发送的,因为如果用get请求密码就会显示在URL中,这是极其不安全的。
比如上述代码的这一行就是用get发送的请求。
r=requests.get('https://blog.csdn.net/weixin_51852924?
那么如何实现post请求呢 ?把get改为post?No!No!No!
在介绍post请求之前 先向大家推荐一个网站
这个网站可以用来测试爬虫。
如果要实现post请求需要传递一个字典给requests中的data函数,这个数据就会在发出请求的时候自动编码为表单形式。
http://httpbin.org/#/这个是网站网址 想要测试post请求就在网址后面加上post
import requests k_dict={'key1':'value1','key2':'value2'} r=requests.post('http://httpbin.org/post',data=k_dict,timeout=5) print(r.text)
其中,data=k_dict 是把表单信息传递过去
timeout=5 是设置了一个超时。
结果:
{ "args": {}, "data": "", "files": {}, "form": { "key1": "value1", "key2": "value2" }, "headers": { "Accept": "*/*", "Accept-Encoding": "gzip, deflate", "Content-Length": "23", "Content-Type": "application/x-www-form-urlencoded", "Host": "httpbin.org", "User-Agent": "python-requests/2.24.0", "X-Amzn-Trace-Id": "Root=1-60ab8cec-23ead91523ee6f843804cb81" }, "json": null, "origin": "117.158.213.170", "url": "http://httpbin.org/post" }
可以看见信息已经传递过去了