首页Python2.请求库——Reques...

2.请求库——Requests库

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中的cookies
  • auth参数:元组,支持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"
}
RELATED ARTICLES

欢迎留下您的宝贵建议

Please enter your comment!
Please enter your name here

- Advertisment -

Most Popular

Recent Comments