request.get()@TOC
request.get()方法详解
声明:此贴为本人学习心得,中间很多内容来自其他老师的帖子,能力有限,代码等实例也是复制的,已尽量表明出处,方便理解学习,并非恶意盗取,特此声明。
毕业十年,最近突然对爬虫感兴趣,略微有些乱七八糟的基础便想强行啃代码,结果啃一鼻子灰,这都是些什么鬼。今天啃到request.get()方法时彻底蒙圈了,request库的get方法,官方是这么说的
url不用说,网址呗
params说是url的额外参数,以字典或字节流的格式,格式好理解,在网上查资料发现,params可以有22个参数可以设置。
**kwargs是控制访问的参数,怎么理解这个东西
import requests
data = {
'name' : 'germey',
'age' : '22'
}
r = requests.get("https://httpbin.org/get",params=data)
print(r.text)
既然是url的参数,应该就是url的一部分,为什么还要搞出来个参数集,经过一番查找,终于在这里找到了答案(https://blog.csdn.net/m0_37959925/article/details/80516915)
也许看文档更有效率,可是本人理解能力有限,看别人的帖子更有助于理解,菜鸟,没办法。书归正传,借用这位大神的例子。
应用requests.get方法中的params参数,目的是让自己的url不再那么臭长,使自己的代码看起来更加整齐。
例如这个网址
res = requests.get(url='https://b.faloo.com/l/0/1.html?t=1&k=%CB%D9%B6%C8')
?后边的就是url的参数,%CB%D9%B6%C8就是速度的意思。那么我们可以将代码改成这样
param={ 't':'1',
'k':'速度'.encode('gb2312')#因为网页的 charset=gb2312
}
res = requests.get(url='https://b.faloo.com/l/0/1.html',params=param)
res_text=res.text
print(res.url)
---------------------
版权声明:本文为CSDN博主「chmod777cj」的原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/m0_37959925/article/details/80516915
#结果输出https://b.faloo.com/l/0/1.html?t=1&k=%CB%D9%B6%C8
就此得出结论
url中出现变量=xxx的这些是参数,可以用params进行连接
那么问题又来了
反爬就要加上headers,那这个headers是params吗,于是接着找,在阿特密斯X老师的帖子里找到了答案,上边是这样说的:
requests.request(method,url,**kwargs)
method:请求方法,对应get/put/post/delete/head/patch/options
url: 模拟获取页面的url连接
**kwrags:控制访问的参数,共13个
kwargs(13个参数):
(一)params
params:字典或者字节序列,作为参数增加到url中
例子:
import requests
kv={“wd”:“你好”}#拼接的内容用字典储存
r=requests.request(“GET”,“http://www.baidu.com/s”,params=kv)
print(r.url)
print(r.text)
运行后拼接的效果:http://www.baidu.com/s?wd=你好
(二)data
data:字典、字节、或文件对象,作为request
例子:
import requests
kv={“key1”:“value1”,“key2”:“value2”}
r=requests.request(“POST”,“http://httpbin.org/post”,data=kv)
print(r.text)
运行结果:
{
“args”: {},
“data”: “”,
“files”: {},
“form”: {
“key1”: “value1”,
“key2”: “value2”
},
“headers”: {
“Accept”: “/”,
“Accept-Encoding”: “gzip, deflate”,
“Connection”: “close”,
“Content-Length”: “23”,
“Content-Type”: “application/x-www-form-urlencoded”,
“Host”: “httpbin.org”,
“User-Agent”: “python-requests/2.18.1”
},
“json”: null,
“origin”: “113.235.118.39”,
“url”: “http://httpbin.org/post”
}
(三)json
json:JSON格式的数据,作为request的内容
(四)header
header:字典,http定制头
例子:
import requests
hd={‘user-agent’:“Chrome/10”}#改变浏览器模拟
r=requests.request(“post”,“http://www.baidu.com”,headers=hd
(五)cookies:
cookies:字典或CookieJar,request中的cookie
(六)auth
auth:元组,支持HTTP认证功能
(七)files:
files:字典类型,传输文件
(八)tiemout
timeout:设定时间
(九)proxies
。。。。。。
上边列举了9个参数,实际上已经足够解惑了,**在requests.request(method,url,**kwargs),params 和 header都是属于 kwargs。而get方法,将params拉出来单独作为第二个参数,其他kwargs是第三个参数,**所以一般看到的request.get是这样写的
r = requests.get(url,params=params,headers=headers)
不知道这样解释是不是片面,反正我是这么理解的。
接下来说说这个 r
这时候的r返回的是一个包含服务器资源的Response对象。包含从服务器返回的所有的相关资源。
上代码:
import requests
res = requests.get("http://127.0.0.1:9092")
print(res.status_code) # 200
print(res.url) # http://127.0.0.1:9092/
print(res.headers) # {'Content-Type': 'application/json; charset=utf-8', 'Content-Length': '10', 'Date': 'Sat, 22 Dec 2018 13:36:16 GMT', 'Connection': 'keep-alive'}
print(res.cookies) # <RequestsCookieJar[<Cookie cid=hello world for 127.0.0.1/>]>
print(res.text) # 8248154254
print(res.content) # b'8248154254' 写图片
print(res.cookies['cid']) # hello world
# 爬取 图片
r1 = requests.get('https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1545496551516&di=8ed19596bc72aa87299ed7f234830128&imgtype=0&src=http%3A%2F%2Fimg5.duitang.com%2Fuploads%2Fitem%2F201107%2F31%2F20110731155631_htMcs.jpg')
b = r1.content
with open('hao.jpg','wb') as f:
f.write(b)
---------------------
版权声明:本文为CSDN博主「adley_app」的原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/adley_app/article/details/85218349
从代码里显示了response的七个属性
r.status_code HTTP请求的返回状态,200表示连接成功,404表示失败
r.text HTTP响应内容的字符串形式,即url对应的页面内容
r.encoding 从HTTP header中猜测的响应内容编码方式(
r.apparent_encoding 从内容中分析出的响应内容编码方式(备选编码方式)
r.content HTTP响应内容的二进制形式
r.url 返回对象的网址
r.cookies 返回对象的cookis
注意r.text 开始看代码怎么也看不懂这个,以为是保存成text文件之类,后来被自己蠢哭了。
那么问题双来了,爬到东西,如何下载下来
下载小文件:
r = requests.get(image_url)
with open("down.png",'wb') as f:
f.write(r.content)
为什么这种模式只能下载小文件呢?
因为这种模式下,从网站接受到的数据是一直储存在你的内存中,只有当你write时才写入硬盘,如果文件很大,那么所占用的内存也是很大的,所以有了以下的大文件下载方法
下载大文件
r = requests.get(image_url, stream=True)
with open("python.pdf", "wb") as f:
for bl in r.iter_content(chunk_size=1024):
if bl:
f.write(bl)
---------------------
版权声明:本文为CSDN博主「chmod777cj」的原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/m0_37959925/article/details/80516915