基本库的使用
使用 requests
基本用法
实例引入
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)
GET 请求
-
首先,构建一个最简单的 GET 请求,请求的链接为 http://httpbin.org/get,该网站会判断如果客户端发起的是 GET 请求的话,它返回相应的请求信息:
import requests r = requests.get('http://httpbin.org/get') print(r.text)
import requests
data = {
'name': 'germey',
'age': 22
}
r = requests.get('http://httpbin.org/get', params=data)
print(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()))
可以发现,调用 json() 方法,就可以将返回结果是 JSON 格式的字符串转化为字典
但需要注意的是,如果返回的结果不是 JSON 格式,便会出现解析错误,抛出 json.decoder.JSONDecodeError 异常
-
抓取二进制数据
import requests r = requests.get('http://github.com/favicon.ico') with open('favicon.ico','wb') as f: f.write(r.content)
这里用了 open() 方法,它的第一个参数是文件名称,第二个参数代表以二进制写的形式打开,可以向文件里写入二进制数据
-
添加 headers
通过 headers 参数来传递头信息
import requests headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36' } r = requests.get('http://www.zhihu.com/explore', headers=headers) print(r.text)
当然,我们可以在 headers 这个参数中任意添加其他的字段信息
POST 请求
使用 requests 实现 POST 请求同样非常简单,示例如下:
import requests
data = {
'name': 'germey',
'age': 22
}
r = requests.post("http://httpbin.org/post", data=data)
print(r.text)
这是还是请求 http://httpbin.org/post,该网站可以判断如果请求是 POST 方式,就把相关请求信息返回
可以发现,我们成功获得了返回结果,其中 form 部分就是提交的数据,这就证明 POST 请求成功发送了
响应
发送请求后,得到的自然就是响应。在上面的实例中,我们使用 text 和 content 获取了响应的内容。此外,还有很多属性和方法可以用来获取其他信息,比如状态码、响应头、Cookies 等,示例如下:
import requests
r = requests.get('http://www.jianshu.com')
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)
这里分别打印输出 status_code 属性得到状态码,输出 headers属性得到响应头,输出 cookies 属性得到 Cookies,输出 url 属性得到 url,输出 history 得到i请求历史
高级用法
文件上传
我们知道 requests 可以模拟提交一些数据。假如有的网站需要上传文件,我们也可以用它来实现,这非常简单,示例如下:
import requests
files = {
'file':open('favicon.ico','rb')
}
r = requests.post('http://httpbin.org/post',files=files)
print(r.text)
文件上传部分会单独有一个 files 字段来标识
Cookies
先用一个实例看一下获取 Cookies 过程:
import requests
r = requests.get('http://www.baidu.com')
print(r.cookies)
for key, value in r.cookies.items():
print(key + '=' + value)
运行结果如下:
这里我们首先调用 cookies 属性即可成功得到 Cookies,可以发现它是 RequestsCookieJar 类型。然后用 items() 方法将其转化为元组组成的列表,遍历输出每一个 Cookie 的名称和值,实现 Cookie 的遍历解析
当然,我们也可以直接使用 Cookie 来维持登录状态,下面以知乎为例来说明。首先登录知乎,将 Headers 中的 Cookie 内容复制下来,将其设置到 Headers 里面,然后发送请求,示例如下:
import requests
headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36',
'cookie': '_zap=1b5925ce-42e7-4df0-88f9-81b87b3908b1; d_c0="APDfRQTSTRSPTgDPgQbUsYPfSKay356x2ok=|1641599820"; _9755xjdesxxd_=32; _xsrf=G3vlQcsHA20VJgaoNGJFDQGGqbbz0EaI; Hm_lvt_98beee57fd2ef70ccdd5ca52b9740c49=1641599822,1641692854,1642040080,1642069199; captcha_session_v2="2|1:0|10:1642069198|18:captcha_session_v2|88:ZkM2VmtzbXd4NklXamYvdUVnUHFGL3ZBQllNbHFtRWxKbXRUSm1ZeHgrTkFwdThiay9JNGRjYytQazNVVS9KVw==|6497f31cdd4c979e09f8a6d2bdcb234cf16772094148e2daffb169ca4d75a7d8"; SESSIONID=9td2XhwiclxSll6UJLIAnrg2JBz1xlRh4VjgPu18pej; __snaker__id=9NqLpytquGYkDiq1; JOID=Wl8VAk_JtM50GI8ANsAHFqeRVlcq_8erQ0zocF6m17Emce85ZA5OFRwbhwYyehZu7UmsGADwlLHefNqtZQC4Cuw=; osd=U18VBUPAtM5zFIYANscLH6eRUVsj_8esT0XocFmq3rEmduMwZA5JGRUbhwE-cxZu6kWlGAD3mLjefN2hbAC4DeA=; gdxidpyhxdE=BRvPGbCe7KH%2F2j9SfmMHd1HwWRU0UnB1mApK7IC9q55upaxUtQPhKeUgKeAuuCT1CgZC71w0TAxNck1MPNfObdMuL%5CpVp0KT%5CIHphh6zqeBni6xT0lNnVWgGQaHuZL12lLkhsvetajmYaMX%5C7%2FHjC3%2BXkQ3Yp6Bm2JUK0BDyvAmck01E%3A1642070099725; YD00517437729195%3AWM_NI=mBE0xhUR8OLpt6OMogHLyJRZEC%2BoBVBLya1nJ26jlmYqMhmfn4mA27j0h5a%2FGH32S6%2BAVr%2FUtB8H6Os9q90TJfKBT3IuXdxoSunxiN8k0dDh0HzRsUnmXF1WeRmDmkKHSHU%3D; YD00517437729195%3AWM_NIKE=9ca17ae2e6ffcda170e2e6ee93b821bbbe9eadbb5aabeb8ea7c85a839e8b85f13e818683ccef7a82ad8695aa2af0fea7c3b92aaf9e8bd1fb64978ef8b0cf7cb8ea81aeee6d8c94b7abd152879de590c15e8294b782b4668aeefa8bef679baf8389f06eaeeca3a2b13daaf0a8d6e4258598fdd3d23ee99f9a93ae5fb89ef8a9b545b1e7bfdab3608aba85a3d7398bab9885fb6591aba299ec46fcb50085c764f498b6b3f25faeb398a7b45da78ea3a5f06189989da9d837e2a3; YD00517437729195%3AWM_TID=pARCxM308NFFAEQVFBZ%2B%2BHNZvg6F4cs%2F; z_c0="2|1:0|10:1642069230|4:z_c0|92:Mi4xa21GM0ZnQUFBQUFBOE45RkJOSk5GQ2NBQUFDRUFsVk43b2tIWWdDWk5waVdmNzlDeEs2a19IeGljSi1jSGg1LUh3|d53537d09526c1b71deb3901afa5194a6be9e9cb283bf94dedbc9158ab13c89c"; Hm_lpvt_98beee57fd2ef70ccdd5ca52b9740c49=1642069232; ariaDefaultTheme=undefined; tst=r; NOT_UNREGISTER_WAITING=1; KLBRSID=dc02df4a8178e8c4dfd0a3c8cbd8c726|1642069234|1642069198'
}
r = requests.get('https://www.zhihu.com/', headers=headers)
print(r.text)
会话维持
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)
运行结果:
所以,利用 Session,可以做到模拟同一个会话而不用担心 Cookies 问题。它通常用于模拟登录成功之后再进行下一步的操作
Session 在平常用得非常广泛,可以用于模拟在一个浏览器中打开同一个站点的不同页面