运行环境:win10 + python36
参考文档:
http://www.python-requests.org/en/master/
http://docs.python-requests.org/en/master/api/#requests.Session
模块安装:pip install requests
开始前例行导入模块:
import requests as rq
一个简单的访问网页例子:
r = rq.get("http://www.baidu.com.cn")
同理还有发送数据的post:
#
r = rq.post(posturl,data={'key':'value'})
#如果发送的数据是json格式的,那么data是要变通的,比如
#(2.4.2版新功能...现在都2.19了,原来是用json模块的json.dumps(data)格式化数据再发送的)
r = rq.post(posturl,json={'key':'value'})
请求数据的时候需要文件头:大概长这样
#文件头的作用我所知的只有反扒。
headers = {
"Content-Type": "application/json;charset=UTF-8",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:56.0) Gecko/20100101 Firefox/56.0",
}
#访问
r = rq.post(posturl,data={'key':'value'},headers=headers)
#还有请求超时设置(要知道有这回事,有需求时候再百度怎么用吧)
r = rq.post(posturl,data={'key':'value'},headers=headers,timeout=0.001)
请求之后,就是返回结果了,返回结果都在请求里,上例用r表示,结果的内容可以这样查看
print(r.text)
#如果请求失败呢?请看
print(r.status_code)
#还可以查看文件头
r.headers
#查看cookies
r.cookies
#回头看请求的网址
r.url
如果返回的是JSON数据,还可以格式化,同时赋值给j变量,然后就可以按json的取数方式取数了:
j = r.json()
#先看一下r的结构
print(r.text)
#假如r是这样的{"total": 1,"status": "200","rows": [{"accountAmount": 0.0,"amount": "4358.0","approve": true}]}
#那么数据可以这样取
print(j["total"])
print(j["rows"][0]["accountAmount"])
#如果是网页格式,一般可以用正则或者xpath进行取数
import re
from lxml import etree
etree.HTML()
如果 返回的结果r有乱码怎么办
#先查看编码
print(r.encoding)
#然后更改编码
r.encoding = "utf-8"
提一下,遇到过一种情形,r返回的是json数据,编码是utf-8,然后r.text是乱码,但用json方法取数后是正常的,不知道原因。
下面说说session,用于跨请求保持某些参数,具体不懂,这里使用它来登陆网址,然后继续请求这个网站下的其他网址。
#首先是设置连接
conn = rq.session()
#然后是get一下这个网站的主页,这样就获取了这个网址的cookies了.
#有些登陆问题很烦的,百度是各种招数,太烦了,这里直接先get一下,获取了cookies。那么还需要设置其他吗?反正我登陆的网址不用了。
#忘了是什么问题导致我先get一下这个网址了。反正后来能登陆了,我把这个删了也没影响登陆成功了。有机会以后一定要好好研究一下
#半路出家的麻烦就在于基础太挫了,常识都没有。也就是说,这里先get可能是不需要的步骤。
conn.get("URL")
#再然后就是正式登陆网站了
login = conn.post(login_url, data={'key':'value'})
#查看一下请求结果
print(login.text)
#登陆成功的就可以在这个网站上遨游了,通常,这样搜索的请求类型就算是post,也可以用get来获取了(唔,我想当然的,也不知道说的对不对)。
search = conn.get(post_url&参数)