一、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 服务器内容使用的文本编码
二、定制Requests 有些静态网页需要对Requests的参数进行设置才能获取需要的数据,这其中包括超时,URL参数,headers,发送post请求等。

1.传递URL参数

为了请求特定数据,需要我们在url的查询字符中加入某些数据。如果是自己构建的url,那么数据一般会跟在一个问号后,并且以键值对的形式放在url中 。对此是不是有些迷惑?举个例子

哔哩哔哩搜索罗小黑 并拿到他的链接
五,网页抓取_爬虫

 

因为数据比较多不止一页,我们翻下一页
五,网页抓取_python_02

 

是不是发现了什么? 再看看第三页
五,网页抓取_spyder_03

从第二页开始 ,链接末尾有一个&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版本,等等。
对于一些基础的反爬虫,就会通过头部信息来拦截爬虫。

那么我们的头部信息在哪查询呢? 这里还要用到检查。

随便打开一个页面 然后打开检查
五,网页抓取_爬虫_04

点击Network

然后点击name行第一个 就可以看见如下
五,网页抓取_Python爬虫_05
可以看见有一个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请求之前 先向大家推荐一个网站

http://httpbin.org/#/

这个网站可以用来测试爬虫。

如果要实现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"
}

可以看见信息已经传递过去了