1.概述:
Requests库是目前公认的爬取网页最好的第三方库,Requests库的特点 就是简单、简洁,甚至用一行代码就可以从网页上获取相关的资源。
Requests库更多信息可以在Requests库官网(http://www.python-requests.org)站获得。
通过pip install requests
命令安装Requests库。
2.Requests库使用实例:
使用pip方法安装完requests库,可以通过以下代码查看安装效果。
import requests
r = requests.get('https://www.baidu.com')
# 查看响应的类型,为requests.models.Response
print(type(r))
print('----------')
# 查看响应的状态码,如果返回200说明访问成功
print(r.status_code)
print('----------')
r.encoding = 'utf-8'
# 查看响应体的类型,为字符串str
print(type(r.text))
print('----------')
# 查看响应体部分内容
print(r.text[:100])
print('----------')
# cookies类型为RequestsCookieJar
print(r.cookies)
运行结果如下:
<class 'requests.models.Response'>
----------
200
----------
<class 'str'>
----------
<!DOCTYPE html>
<!--STATUS OK--><html> <head><meta http-equiv=content-type content=text/html;charse
----------
<RequestsCookieJar[<Cookie BDORZ=27315 for .baidu.com/>]>
此时百度的主页已经被我们抓取下来了。
3.HTTP协议:
HTTP,Hypertext Transfer Protocol,超文本传输协议。
HTTP是一个基于“请求与相应”模式的、无状态的应用层协议。
HTTP协议采用URL作为定位网络资源的标识。
3.1 URL格式
URL标准格式为:http://host[:port][path]
,其中:host
——合法的Internet主机域名或IP地址;port
——端口号,缺省端口为80;path
——请求资源的路径。
URL是通过HTTP协议存取资源的Internet路径,一个URL对应一个数据资源。
3.2 HTTP协议对资源的操作
方法 | 说明 |
---|---|
GET | 请求获取URL位置的资源 |
HEAD | 请求获取URL位置资源的相应消息报告,即获得该资源的头部信息 |
POST | 请求向URL位置的资源后附加新的数据 |
PUT | 请求向URL位置存储一个资源,覆盖原URL位置的资源 |
PATCH | 请求局部更新URL位置的资源,即改变该处资源的部分内容 |
DELETE | 请求删除URL位置存储的资源 |
4.Requests库的7个主要方法:
方法 | 说明 |
---|---|
requests.request() | 构造一个请求,支撑以下各方法的基础 |
requests.get() | 获取HTML网页的主要方法,对应HTTP的GET |
requests.head() | 获取HTML网页头信息的方法,对应HTTP的HEAD |
requests.post() | 向HTML网页提交POST请求的方法,对应于HTTP的POST |
requests.put() | 向HTML网页提交PUT请求的方法,对应于HTTP的PUT |
requests.patch() | 向HTML网页提交局部修改请求,对应于HTTP的PATCH |
requests.delete() | 向HTML网页提交删除请求,对应于HTTP的DELETE |
4.1 request()方法
request()方法中参数如下:reques.request(method,url.**kwargs)
其中,method
表示请求方式,对应get/put/post等7种方法;url
表示拟获取页面的url链接;**kwargs
——控制访问的参数,共13个,具体如下所示:
params
参数:将字典或字节序列,作为参数增加到url中
import requests
dict = {'key1':'value1' , 'key2':'value2'}
r = requests.request('GET' , 'http://httpbin.org/get' , params=dict)
print(r.url)
运行结果如下:
http://httpbin.org/get?key1=value1&key2=value2
data
参数:字典、字节序列或文件对象,作为Request的内容,作为向服务器提供、提交资源时使用
import requests
dict = {'key1':'value1' , 'key2':'value2'}
r = requests.request('POST' , 'http://httpbin.org/post' , data=dict)
print(r.text)
print('---------------')
body = '主题内容'.encode("utf-8")
r_2 = requests.request('POST' , 'http://httpbin.org/post' , data=body)
print(r_2.text)
运行结果如下:
{
"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.26.0",
"X-Amzn-Trace-Id": "Root=1-6260c36a-09a44dcf3271df742f6d240f"
},
"json": null,
"origin": "101.86.213.228",
"url": "http://httpbin.org/post"
}
---------------
{
"args": {},
"data": "\u4e3b\u9898\u5185\u5bb9",
"files": {},
"form": {},
"headers": {
"Accept": "*/*",
"Accept-Encoding": "gzip, deflate",
"Content-Length": "12",
"Host": "httpbin.org",
"User-Agent": "python-requests/2.26.0",
"X-Amzn-Trace-Id": "Root=1-6260c36a-2597926935992a8a75c11ad5"
},
"json": null,
"origin": "101.86.213.228",
"url": "http://httpbin.org/post"
}
json
参数:JSON格式的数据,作为Request的内容。作为内容部分向服务器提交
import requests
json = {'key1':'value1'}
r = requests.request('POST' , 'http://httpbin.org/post' , json=json)
print(r.text)
运行结果如下:
{
"args": {},
"data": "{\"key1\": \"value1\"}",
"files": {},
"form": {},
"headers": {
"Accept": "*/*",
"Accept-Encoding": "gzip, deflate",
"Content-Length": "18",
"Content-Type": "application/json",
"Host": "httpbin.org",
"User-Agent": "python-requests/2.26.0",
"X-Amzn-Trace-Id": "Root=1-6260c478-09bab1b36a117322260cf2e5"
},
"json": {
"key1": "value1"
},
"origin": "101.86.213.228",
"url": "http://httpbin.org/post"
}
headers
参数:字典,HTTP定制头,可以通过这个字段来定制访问某个url的协议头
import requests
hd = {'user-agent' : 'Chrome/10'}
r = requests.request('POST' , 'http://httpbin.org/post' , headers=hd)
print(r.text)
运行结果如下:
{
"args": {},
"data": "",
"files": {},
"form": {},
"headers": {
"Accept": "*/*",
"Accept-Encoding": "gzip, deflate",
"Content-Length": "0",
"Host": "httpbin.org",
"User-Agent": "Chrome/10",
"X-Amzn-Trace-Id": "Root=1-6260c502-492981870ed3aec039450c90"
},
"json": null,
"origin": "101.86.213.228",
"url": "http://httpbin.org/post"
}
cookies
参数:字典或CookieJar,Requests中的cookiesauth
参数:元组,支持HTTP认证功能files
参数:字典类型,传输文件
import requests
fs = {'file' : open('data.xls','rb')}
r = requests.request('POST' , 'http://httpbin.org/post' , files=fs)
print(r.text)
运行结果如下:
{
"args": {},
"data": "",
"files": {
"file": "data:application/octet-stream;base64,0M8R4KGxGuEAAAAAAAAAAAAAAAAAAA..."
},
"form": {},
"headers": {
"Accept": "*/*",
"Accept-Encoding": "gzip, deflate",
"Content-Length": "25232",
"Content-Type": "multipart/form-data; boundary=b940463548694b5e9b7619a723c592ca",
"Host": "httpbin.org",
"User-Agent": "python-requests/2.26.0",
"X-Amzn-Trace-Id": "Root=1-6260c62b-4c073d0a6ef4e9c33ada287f"
},
"json": null,
"origin": "101.86.213.228",
"url": "http://httpbin.org/post"
}
timeout
参数:设定超时时间,以秒为单位
import requests
r = requests.request('GET' , 'http://www.baidu.com' , timeout=0.01)
proxies
参数:字典类型,设定访问代理服务器,可以增加登陆认证
import requests
pxs = {
'http':'代理链接',
'https':'代理链接'
}
r = requests.request('GET','http://www.baidu.com',proxies=pxs)
allow_redirects
参数:True/False,默认为True,重定向开关stream
参数:True/False,默认为True,获取内容立即下载开关verity
参数:True/False,默认为True,认证SSL证书开关cert
参数:本地SSL证书路径
4.2 get()方法
reques.get(url,params=None.**kwargs)
url
——拟获取页面的url链接;params
——url中的额外参数,字典或字节流格式,可选(同request方法中的params);**kwargs
——12个控制访问的参数(同request中除去params的其他12个参数)。
4.2.1 添加参数到url中
params
参数可以将字典或字节序列,作为参数增加到url中。
import requests
dict = {'key1':'value1' , 'key2':'value2'}
r = requests.get('http://httpbin.org/get' , params=dict)
print(r.url)
print('------')
print(r.text)
运行结果如下:
http://httpbin.org/get?key1=value1&key2=value2
------
{
"args": {
"key1": "value1",
"key2": "value2"
},
"headers": {
"Accept": "*/*",
"Accept-Encoding": "gzip, deflate",
"Host": "httpbin.org",
"User-Agent": "python-requests/2.26.0",
"X-Amzn-Trace-Id": "Root=1-6260d2b5-2eeabb521c7292a057358c10"
},
"origin": "101.86.213.228",
"url": "http://httpbin.org/get?key1=value1&key2=value2"
}
4.2.2 抓取二进制文件
图片、音频、视频等文件都是由二进制码组成的,因此要想抓取这些文件,就需要抓取相对应的二进制文件。
import requests
url = 'https://www.baidu.com/img/PCtm_d9c8750bed0b3c7d089fa7d55720d6cf.png'
r = requests.get(url)
print(r.text)
print('------')
print(r.content)
运行结果如下:
�PNG
IHDR ��...
------
b'\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x02\x1c\x00\x00\x01\x02\x08\...'
可以看出,r.text
出现了乱码,这是因为图片是二进制数据,调用text属性时,会在打印时转换为str类型,因此会出现乱码。
而r.content
显示的是bytes类型数据。
下面将抓取的图片保存到本地,代码如下所示:
import requests
url = 'https://www.baidu.com/img/PCtm_d9c8750bed0b3c7d089fa7d55720d6cf.png'
r = requests.get(url)
# 使用open方法向文件中写入二进制数据。第一个参数为文件名称,第二个参数为文件写入方式,wb代表以二进制写入方式打开一个文件
with open('baidu.png' , 'wb') as f:
f.write(r.content)
运行之后再文件中会出现名为baidu.png
的图片。
4.2.3 添加请求头
在发起请求时,会有一个请求头Request Headers,使用headers
参数可以设置请求头信息。
import requests
hd = {'User-Agent':'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'}
r = requests.get('http://httpbin.org/get' , headers=hd)
print(r.text)
运行结果如下:
{
"args": {},
"headers": {
"Accept": "*/*",
"Accept-Encoding": "gzip, deflate",
"Host": "httpbin.org",
"User-Agent": "Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)",
"X-Amzn-Trace-Id": "Root=1-6260d75c-58446a4c7eb103d3521f4d40"
},
"origin": "101.86.213.228",
"url": "http://httpbin.org/get"
}
4.2.4 设置Cookie
- 获取cookie:
调用cookie属性获得网站cookie,属于RequestsCookieJar类型。
import requests
r = requests.get('https://www.baidu.com')
print(r.cookies)
# 使用item方法,将cookie转化为由元祖构成的类别,然后遍历输出每一个cookie条目的名称和值
for k , v in r.cookies.items():
print(k + '=' + v)
运行结果如下:
<RequestsCookieJar[<Cookie BDORZ=27315 for .baidu.com/>]>
BDORZ=27315
- 使用cookie来维持网站登陆状态:
以豆瓣为例,首先登陆豆瓣网,然后通过浏览器检查工具查看请求头中的Cookie内容,将其复制下来,然后设置到请求头中,然后发送请求,查看往回结果,可以看到包含了登陆后才有的内容,此时就说明通过设置Cookie成功模拟了登陆状态。
import requests
headers = {
'Cookie':'网页上复制的cookie内容',
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.75 Safari/537.36'
}
r = requests.get('https://www.douban.com/' , headers=headers)
print(r.text)
4.2.5 Session维持
利用Session对象可以很方便的维护一个Session,而且不用担心Cookie问题。通常在模拟登陆成功后,进行下一步操作时用到。
import requests
# 请求网址时,设置了一个cookie条目,名称为num、内容为123456
requests.get('https://www.httpbin.org/cookies/set/num/123456')
# 再次请求该网址,能否获取当前Cookie信息
r = requests.get('https://www.httpbin.org/cookies')
print(r.text)
运行结果如下:
{
"cookies": {}
}
可以看出采用之前的方法并不能获取cookie信息。
下面,采用Session对象来尝试。
import requests
s = requests.Session()
s.get('https://www.httpbin.org/cookies/set/num/123456')
r = s.get('https://www.httpbin.org/cookies')
print(r.text)
运行结果如下:、
{
"cookies": {
"num": "123456"
}
}
4.2.6 身份认证
在访问某些网站时,会弹出验证窗口,表明该网站启用了基本身份认证(HTTP Basic Access Authentication)。作为一种网站登录验证方式,需要在请求网站时提供用户名和密码形式的身份凭证。
import requests
from requests.auth import HTTPBasicAuth
url='https://ssr3.scrape.center/'
# 用户名
username = 'admin'
# 密码
password = 'admin'
r = requests.get(url , auth=HTTPBasicAuth(username , password))
print(r.status_code)
如果用户名。密码正确,那么请求会自动认证成功,会返回200状态码。如果认证不成功,则会返回401状态码。
此外,requests库还提供了一个更简单的写法,,可以直接传入一个元祖,会默认使用HTTPBasicAuth类来认证。
import requests
url='https://ssr3.scrape.center/'
# 用户名
username = 'admin'
# 密码
password = 'admin'
# 直接传入一个元祖,会默认使用HTTPBasicAuth类来认证
r = requests.get(url , auth=(username , password))
print(r.status_code)
另外,requests库还提供了OAuth认证,不过需要预先安装oauth包,安装命令为pip install requests_oauthlib
。
相关内容可以查看官方文档。
4.2.7 超时设置
为了防止服务器不能及时响应,一般都会设置一个超时时间,超过该时间还没有得到响应,程序就会报错。
通过timeout
参数设置超时时间,该参数默认值为None
。
r = requests.get('https://www.baidu.com' , timeout=10)
timeout设置的时间为连接和读取的时间总和,如果需要分别制定用作连接和读取的时间,可以传入一个元祖。
r = requests.get('https://www.baidu.com' , timeout=(10,30))
4.2.8 设置代理
使用proxies
参数设置代理。
import requests
proxies = {
'http':'代理链接',
'https':'代理链接'
}
r = requests.get('https://www.baidu.com' , proxies=proxies)
除了基本的HTTP代理,requests库还支持SOCKS协议的代理。但是,需预先安装socks
库。
pip install "requests[socks]"
此时就可以使用socks协议代理:
import requests
proxies = {
'http':'socks5://user:password@host:port',
'https':'socks5://user:password@host:port'
}
r = requests.get('https://www.baidu.com' , proxies=proxies)
4.2.9 SSL证书验证
有时使用浏览器打开网站时会出提示:“您的连接不是私密连接”这样的错误。
直接请求该类网站,会抛出SSLError
。
如果需要继续请求该网站,可以使用verify
参数来控制是否验证证书,默认值为True
,即自动验证证书。如果不需要验证,可以设置该参数为False
。
r = requests.get('https://ssr2.scrape.center/' , verify=False)
4.3 post()方法
reques.post(url,data=None,json=None,**kwargs)
url
——拟更新页面的url链接;data
——字典、字节序列或文件,Request的内容;json
——JSON格式的数据,Request的内容;**kwargs
——11个控制访问的参数(同request)。
Requests库的post()方法:根据用户提交内容的不同,在服务器上会做相关的数据整理。
- post一个字典,自动编码为form表单
import requests
dict = {'key1':'value1','key2':'value2'}
r = requests.post('http://httpbin.org/post',data = dict)
print(r.text)
运行结果如下:
{
"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.26.0",
"X-Amzn-Trace-Id": "Root=1-6260cb01-3c15352211e713244095d20f"
},
"json": null,
"origin": "101.86.213.228",
"url": "http://httpbin.org/post"
}
- post一个字符串自动编码为data
import requests
r = requests.post('http://httpbin.org/post',data='ABC')
print(r.text)
运行结果如下:
{
"args": {},
"data": "ABC",
"files": {},
"form": {},
"headers": {
"Accept": "*/*",
"Accept-Encoding": "gzip, deflate",
"Content-Length": "3",
"Host": "httpbin.org",
"User-Agent": "python-requests/2.26.0",
"X-Amzn-Trace-Id": "Root=1-6260cb5c-19fc072255c247536ba48e95"
},
"json": null,
"origin": "101.86.213.228",
"url": "http://httpbin.org/post"
}
- post一个文件,自动编码为files
import requests
fs = {'file' : open('data.xls','rb')}
r = requests.post('http://httpbin.org/post' , files=fs)
print(r.text)
运行结果如下:
{
"args": {},
"data": "",
"files": {
"file": "data:application/octet-stream;base64,0M8R4KGxGuEAAAAAAAAAAAAA..."
},
"form": {},
"headers": {
"Accept": "*/*",
"Accept-Encoding": "gzip, deflate",
"Content-Length": "25232",
"Content-Type": "multipart/form-data; boundary=449738c3d31b4ccd9499d53f2b10d38c",
"Host": "httpbin.org",
"User-Agent": "python-requests/2.26.0",
"X-Amzn-Trace-Id": "Root=1-6260ccc9-18306b29141e0d212a38aa4d"
},
"json": null,
"origin": "101.86.213.228",
"url": "http://httpbin.org/post"
}