二、基本库之requests

基本库之requests

urllib库中的urlopen()实际上是以GET方法请求网页,而requests中相应的方法就是get()方法。

import requests
r=requests.get('https://www.baidu.com/')
print(type(r))
print(r.status_code)
print(type(r.text))
print(r.text)
print(r.cookies)

<class ‘requests.models.Response’>
200
<class ‘str’>
r.text省略
<RequestsCookieJar[<Cookie BDORZ=27315 for .baidu.com/>]>

get()方法实现与urlopen()相同的操作,得到一个Response对象。

r=requests.post('url')
r=requests.put('url')
r=requests.delete('url')
r=requests.head('url')
r=requests.options('url')

其他的请求类型依旧可以用一句话来完成。

一.GET请求

1.对get请求附加额外的信息

import requests
r=requests.get('http://httpbin.org/get')
print(r.text)

{
“args”: {},
“headers”: {
“Accept”: “/”,
“Aceept-Encoding”: “gzip, deflate”,
“Host”: “httpbin.org”,
“User-Agent”: “python-requests/2.22.0”,
“X-Amzn-Trace-Id”: “Root=1-5eee2665-721b61da02d639d61157de60”
},
“origin”: “171.41.57.237”,
“url”: “http://httpbin.org/get”
}

结果中可以看到成功构造了get请求,返回结果中包含请求头,URL,IP等信息。
对于get请求,如果要附加额外的信息,利用params这个参数。

import requests
#r=requests.get('http://httpbin.org/get')
#print(r.text)
data={'name':'germey','age':22}
r1=requests.get('http://httpbin.org/get',params=data)
print(r1.text)

要补充的额外信息用字典存储,通过params参数传入。

2.得到字典格式的结果

r.text实际上是str类型,是json格式的。如要以字典格式输出,直接**调用json()**方法。

import requests
r=requests.get('http://httpbin.org/get')
print(type(r.text))
print(r.json())
print(type(r.json()))

<class ‘str’>
{‘args’: {}, ‘headers’: {‘Acccpt-Encoding’: ‘gzip, deflate’, ‘Accept’: ‘/’, ‘Host’: ‘httpbin.org’, ‘User-Agent’: ‘python-requests/2.22.0’, ‘X-Amzn-Trace-Id’: ‘Root=1-5eee29b1-71d1a0be268e388420e53b31’}, ‘origin’: ‘171.41.57.237’, ‘url’: ‘http://httpbin.org/get’}
<class ‘dict’>

调用json()方法可以将结果是json格式的字符串转化为字典

3.抓取二进制数据

抓取网页返回的是一个HTML文档。抓取图片、音频、视频,要拿到它们的二进制码。
获取github的站点图标

import requests
r=requests.get('https://github.com/favicon.ico')
with open('favicon.ico',wb) as f:
f.write(r.content)
print(r.text)
print(r.content)

这里打印了Response对象的两个属性,一个是text,一个是content。
r.text的结果出现了乱码,因为图片是二进制数据,在打印时前者转化为str类型,图片直接转化为字符串,所以出现了乱码
后者结果前带有一个b,代表是bytes类型的数据
用open()方法保存后,可以看到在该.py的同文件夹下,出现了favicon.ico文件。
音视频也可以用这种方法获取。

4.添加headers

有的网站如果不传递headers,就不能正常请求。

import requests
headers={'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36 Edge/18.18363'}
r=requests.get('https://www.zhihu.com/explore',headers=headers)
print(r.text)

二.POST请求

import requests
data={'name':'germey','age':22}
r=requests.post('http://httpbin.org/post',data=data)
print(r.text)

{
“args”: {},
“data”: “”,
“files”: {},
“form”: {
“age”: “22”,
“name”: “germey”
},
“headers”: {
“Accept”: “/”,
“Accept-Encoding”: “gzip, deflate”,
“Content-Length”: “18”,
“Content-Type”: “application/x-www-form-urlencoded”,
“Host”: “httpbin.org”,
“User-Agent”: “python-requests/2.22.0”,
“X-Amzn-Trace-Id”: “Root=1-5eeed3b3-7fb750356146cbb347600bb5”
},
“json”: null,
“origin”: “171.41.57.237”,
“url”: “http://httpbin.org/post”
}

form部分是提交的数据,证明post请求成功发送了。

三.响应

text和content可以获取响应的内容。还有其他属性和方法获取其他信息,例如状态码,响应头,Cookies等。

import requests
r=requests.get('http://www.baidu.com')
exit() if not r.status_code == requests.codes.ok else print('Request Successfully')
print(type(r.status_code),r.status_code)
print(type(r.headers),r.headers)
print(type(r.cookies),r.cookies)
print(type(r.url),r.url)
print(type(r.history),r.history)

Request Successfully
<class ‘int’> 200
<class ‘requests.structures.CaseInsensitiveDict’> {‘Cache-Control’: ‘private, no-cache, no-store, proxy-revalidate, no-transform’, ‘Connection’: ‘keep-alive’, ‘Content-Encoding’: ‘gzip’, ‘Content-Type’: ‘text/html’, ‘Date’: ‘Sun, 21 Jun 2020 03:38:58 GMT’, ‘Last-Modified’: ‘Mon, 23 Jan 2017 13:27:56 GMT’, ‘Pragma’: ‘no-cache’, ‘Server’: ‘bfe/1.0.8.18’, ‘Set-Cookie’: ‘BDORZ=27315; max-age=86400; domain=.baidu.com; path=/’, ‘Transfer-Encoding’: ‘chunked’}
<class ‘requests.cookies.RequestsCookieJar’> <RequestsCookieJar[<Cookie BDORZ=27315 for .baidu.com/>]>
<class ‘str’> http://www.baidu.com/
<class ‘list’> []

r的属性有status_code,headers,url,cookies,history。
requests提供了一个内置的状态码查询对象requests.codes,通过比较返回码和内置的成功的返回码,判断请求是否得到了正常响应。

#部分状态码
200:('ok','okay','all_okay','all_good','\\o/','√')
403:('forbidden')
404:('not_found')
……

四.高级用法

requests的基础用法:GET,POST请求以及Requests对象,requests的高级用法:文件上传、Cookies设置、代理设置

1.文件上传

requests可以模拟提交一些数据,如果有的网站需要上传文件,也可以用它来实现。

import requests
files={'file':open('favicon.ico','rb')}
r=requests.post('http://httpbin.org/post',files=files)
print(r.text)

{
“args”: {},
“data”: “”,
“files”: {
“file”: “data:application/octet-stream;base64,AAABAAIAEBAAAAEAIAAoBQAAJ……=”
},
“form”: {},
“headers”: {
“Accept”: “/”,
“Accept-Encoding”: “gzip, deflate”,
“Content-Length”: “6665”,
“Content-Type”: “multipart/form-data; boundary=8bddc0bc8769598b05135679b505268b”,
“Host”: “httpbin.org”,
“User-Agent”: “python-requests/2.22.0”,
“X-Amzn-Trace-Id”: “Root=1-5eeedbd8-303455d6647fe6459f64da23”
},
“json”: null,
“origin”: “171.41.57.237”,
“url”: “http://httpbin.org/post”
}

favicon.ico需要和当前脚本在同一目录下
这个网站返回的响应里面包含了files字段(省略了一部分),而form字段是空的。

2.Cookies

用urllib处理Cookies写法比较复杂,用requests获取和设置Cookies只需要一步。
获取Cookies

import requests
r=requests.get('https://www.baidu.com')
print(r.cookies)
for key,value in r.cookies.items():    
print(key + '=' + value)

<RequestsCookieJar[<Cookie BDORZ=27315 for .baidu.com/>]>
BDORZ=27315

用Cookie来维持登录状态
以知乎为例,首先登录知乎,将Headers中的Cookie内容复制下来。

import requests 
headers={'Cookie': '_xsrf=uRasNdyUg5irutCrxOWRnruqfkhRCaqw; cap_id="OWJlODVmZmE3MjgwNDkxYWIzOTJjNTg4MzFjZGE2Mjc=|1590916567|68dba777d9943f7c79d8ce8aec1af94ff36480c5"; z_c0=Mi4xTXlVT0F3QUFBQUFBRUZ1Y3VaUmFFUmNBQUFCaEFsVk41TVBBWHdCcDl3ZThnNGJrb1M5ZVJwQVlNRGJOZWRvRFpR|1590916580|b7f021d51e59ed23bf58eae0d081c26e590bf368;l_cap_id="ZmEyNzA0ZDQzMjc0NGU5YjkwN2ZlNTM1MGY3ZDIyNzQ=|1590916567|d554c7694145c2635fd8ed93f97a6fc17e9de323"; q_c1=848ce98d0fce4e5494f293106b637321|1591235448000|1591235448000; r_cap_id="Zjk4Nzg2YTgzYWRmNDhmMWJjZmFmNDY4NmQ0ZDFkNjQ=|1590916567|4a9c8b45dd4e946c845015f24cf685a99e280f64"; tst=r; d_c0="ABBbnLmUWhGPTml5LA0toDWSKmJj2NTOZks=|1590916561"; Hm_lvt_98beee57fd2ef70ccdd5ca52b9740c49=1590916590,1591235335,1592668128,1592713328; capsion_ticket="2|1:0|10:1590916561|14:capsion_ticket|44:ZjBlZTdhM2I5Njg2NGM1ZGEwODRkMzY2YTk0Mzc0ZDg=|fb767ca1f1e417e9143b76a5bf3ac0b0102a34659d6b61c0ec4def4c12381a3a";_zap=cf6992ec-9510-4cb7-98a4-6c8f0aa27789; Hm_lpvt_98beee57fd2ef70ccdd5ca52b9740c49=1592713573; KLBRSID=0a401b23e8a71b70de2f4b37f5b4e379|1592713570|1592713318; SESSIONID=6Ua1GPRPVcvTXMWtlVaH9h7yviQV74X6FxngUecEzMK; JOID=U1kcBEkhmLg6hRjgDCfbIsJSRJYVF8XXDsFIulJ0-8Zg2Fa3cF1-XWKGEOYHFF6L0fr8QYHP2uhoZougz0xuBfI=;osd=U1kWBkIhmLI4jhjgBiXQIsJYRp0VF8_VBcFIsFB_-8Zq2l23cFd8VmKGGuQMFF6B0_H8QYvN0ehobImrz0xkB_k=',
'Host':'www.zhihu.com',
'User-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36 Edge/18.18363'}
r=requests.get('https://www.zhihu.com',headers=headers)
print(r.text)

Cbr\u002F\u003E\u003C\u002Fp\u003E\u003Cp\u003E我一问话,就会显示我的头像的,果然有人立即说,这个美女头像很漂亮啊,是本人么。我回答是,然后群里问我问题的就更多了,问我是不是会弹钢琴之类的。对于他们的问
题,我也是很有选择的回答,有些关键性的问题,我直接不回答。那天,有好几个人对我明显的表示想交个朋友,想约我见面的。我肯定是没有答应。接下来的几天,我看似无意,其实是有意的说一些今天去看了什么画展啊之类
的话,有点卖弄的意思吧,
……

输出中包含了登录后的结果。

3.回话维持

利用Session模拟在一个浏览器中打开同一个的不同同一个回话而不用担心Cookies的问题,,通常用于模拟登录成功后的下一步操作。

import requests
s=requests.Session()
s.get('http://httpbin.org/cookies/set/number/123456789')
r=s.get('http://httpbin.org/cookies')
print(r.text)

{
“cookies”: {
“number”: “123456789”
}
}

Session对象可以维持同一个对象,相当于打开一个新的浏览器选项卡而不是新开一个浏览器

4.SSL证书验证

requests提供了证书验证的功能。当发送HTTP请求的时候,它会检查ssl证书,可以使用verify参数控制是否检查此参数,不加verify参数,默认是True,会自动验证。

如果某个网站的证书没有被官方CA机构信任,会出现证书验证错误的结果。
不加verify参数会返回一个SSLError错误,表示证书验证错误。
避免这个错误,把verify参数设置为False即可

import requests
r=requests.get('https://www.12306.cn',verify=False)
print(r.status_code)

C:\Users\azya\Anaconda3\lib\site-packages\urllib3\connectionpool.py:847: InsecureRequestWarning: Unverified HTTPS request is being made. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/latest/advanced-usage.html#ssl-warnings
InsecureRequestWarning)
200

(12306此时证书已被信任)
这样就会打印出请求成功的状态码,但是报了一个警告,建议我们给它指定证书。可以通过设置忽略警告的方式来屏蔽这个警告

import requests
from requests.packages import urllib3
urllib3.disable_warnings()
r=requests.get('http://www.12306.cn',verify=False)
print(r.status_code)

此时输出就只有200。

5.代理设置

对于一些网站,大规模爬取时,对于大规模且频繁的请求,网站可能会弹出验证码或者转到登录认证页面,甚至会封禁客户端的IP,导致一段时间内无法访问。
通过设置代理可以解决这个问题,需要用到proxies参数

基本的HTTP代理

import requests
proxies={'http':'http://user:password@10.10.1.10:3128/'}
r=requests.get('https://www.taobao.com',proxies=proxies)

用类似于http://user:password@host:port这样的语法来设置代理。
SOCKS协议的代理
首先要安装socks这个库。

…………

6.超时设置

在本机网络不好或者服务器响应太慢甚至无响应时会报错,为避免应设置一个超时时间,即超过了这个时间还没有得到响应就报错。
需要用到timeout参数,这个时间的计算是发出请求到服务器返回响应的时间。

import requests
r=requests.get('https://www.taobao.com',timeout=1)
print(r.status_code)

将超时时间设置为1,如果1s内没有响应就抛出异常。
此时输出为200。
如果将超时时间设置为0.01,可以看到抛出异常。
如果想永久等待,可以将timeout设置为None,或者不设置直接留空(默认为None)

7.身份验证

网站需要输入用户名和密码时,此时可以使用requests自带的身份认证功能。

import requests
from requests.auth import HTTPBasicAuth
r=requests.get('url',auth=HTTPBasicAuth('username','password'))
print(r.status_code)

如果用户名和密码正确,请求时就会自动认证成功,返回200状态码,认证失败,就会返回401状态码。

requests提供了一个更简单的写法,可以直接传一个元组,它默认使用HTTPBasicAuth这个类来认证
简写如下:

import requests
r=requests.get('url',auth=('username','password'))
print(r.status_code)

还可以使用OAuth认证,此时需要安装oauth包。
安装命令:
pip3 intall requests_oauthlib

8.Prepared Request

urllib.request中的Request类可以用来传headers等信息,在requests中同样可以做到。

from requests import Request,Session
url='http://httpbin.org/post'
data={'name':'germey'}
headers={'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64;x64)','HOST':'httpbin.org'}
s=Session()
req=Request('POST',url,data=data,headers=headers)
prepped=s.prepare_request(req)
r=s.send(prepped)
print(r.text)

用url,data,headers参数构造了一个Request对象,再调用Session的prepare_request()方法将其转化为一个Prepare Request对象,最后调用send()方法发送。

{
  "args": {},       
  "data": "",       
  "files": {},      
  "form": {
    "name": "germey"
  },
  "headers": {
    "Accept": "*/*",
    "Accept-Encoding": "gzip, deflate",
    "Content-Length": "11",
    "Content-Type": "application/x-www-form-urlencoded",
    "Host": "httpbin.org",
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64;x64)",
    "X-Amzn-Trace-Id": "Root=1-5ef0aeb7-341a424b1cbe4e8b0bf34cce"
  },
  "json": null,
  "origin": "171.41.57.176",
  "url": "http://httpbin.org/post"
}

这样达到了和urllib.request的Request相同的结果。

附:requests的官方文档

Tips

import requests
from requests.auth import HTTPBasicAuth
r=requests.get(url,params=,headers=,proxies=,verify=,timeout=,files=,auth=HTTPBasicAuth('username','password'))
#url/上传附加信息/添加headers/设置代理/ssl证书验证/设置超时时间/上传文件/身份验证)
#headers={'Cookie':'','Host':'','User-agent':''}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值