Loading

requests模块

  • 导入

使用import requests进行导入

  • 基本的请求
requests.get(‘https://github.com/timeline.json’)                                # GET请求
requests.post(“http://httpbin.org/post”)                                        # POST请求
requests.put(“http://httpbin.org/put”)                                          # PUT请求
requests.delete(“http://httpbin.org/delete”)                                    # DELETE请求
requests.head(“http://httpbin.org/get”)                                         # HEAD请求
requests.options(“http://httpbin.org/get” )                                     # OPTIONS请求

也可以添加参数进行请求,增加params这个参数即可,里面放入一个字典

同时也有参数headers(用于定制头)和参数cookies(用于设置cookie信息)参数proxies(用于设置代理),均要求字典形式

同时有参数timeout,用于设定超时的上限秒数

请求的方式解释

GET: 请求指定的页面信息,它本质就是发送一个请求来取得服务器上的某一资源。资源通过一组HTTP头和呈现数据(如HTML文本,或者图片或者视频等)返回给客户端。GET请求中,永远不会包含呈现数据。

HEAD: 只请求页面的首部,HEAD和GET本质是一样的,区别在于HEAD不含有呈现数据,而仅仅是HTTP头信息,用于检查对象是否存在,以及得到对象的元数据。

POST: 向服务器提交数据,请求服务器接受所指定的文档作为对所标识的URI的新的从属实体。

PUT: 从客户端向服务器传送的数据取代指定的文档的内容,PUT和POST极为相似,都是向服务器发送数据,但它们之间有一个重要区别,PUT通常指定了资源的存放位置,而POST则没有,POST的数据存放位置由服务器自己决定。

DELETE: 请求服务器删除指定的页面或某一个资源。

OPTIONS: 允许客户端查看服务器的性能。

增(put)删(delete)改(post)查(get)

GET和POST的区别使用:

1)如果要传递大量数据,比如文件上传,只能用POST请求

2)GET的安全性比POST要差些,如果包含机密\敏感信息,建议用POST

3)如果仅仅是索取数据(数据查询),建议使用GET

4)如果是增加、修改、删除数据,建议使用POST

有一些网址会直接返回数据(比如某些专门用于请求数据而不是用于前端可视化的网址),此处直接使用get方法即可

如果需要提交表单信息,有两种可能,一种是上文所述的使用params参数,另一种就是直接在网址上添加参数(一般在?以后,多个参数用&隔开),此处相当于打开了一个二级页面

  • 请求之后的响应

上述的请求方式都会返回一个响应response对象

这个响应对象具有很多属性,这些属性就是我们想要得到的结果,可以进行查看和更改

r.encoding                       #获取当前的编码
r.encoding = 'utf-8'             #设置编码
r.text                           #以encoding解析返回内容。字符串方式的响应体,会自动根据响应头部的字符编码进行解码。
r.content                        #以字节形式(二进制)返回。字节方式的响应体,会自动为你解码 gzip 和 deflate 压缩。

r.headers                        #以字典对象存储服务器响应头,但是这个字典比较特殊,字典键不区分大小写,若键不存在则返回None

r.status_code                     #响应状态码
r.raw                             #返回原始响应体,也就是 urllib 的 response 对象,使用 r.raw.read()   
r.ok                              # 查看r.ok的布尔值便可以知道是否登陆成功
 #*特殊方法*#
r.json()                         #Requests中内置的JSON解码器,以json形式返回,前提返回的内容确保是json格式的,不然解析出错会抛异常
r.raise_for_status()             #失败请求(非200响应)抛出异常
  • 会话维持
s = requests.Session()
s.auth = ('auth','passwd')
s.headers = {'key':'value'}
r = s.get('url')
r1 = s.get('url1') 

requests库的session会话对象可以跨请求保持某些参数,说白了,就是比如你使用session成功的登录了某个网站,则在再次使用该session对象求求该网站的其他网页都会默认使用该session之前使用的cookie等参数

尤其是在保持登陆状态时运用的最多,在某些网站抓取,或者app抓取时,有的时强制登陆,有的是不登陆返回的数据就是假的或者说是不完整的数据,那我们不可能去做到每一次请求都要去登陆一下怎么办,就需要用到保持会话的功能了,我们可以只登陆一次,然后保持这种状态去做其他的或者更多的请求。

使用Session类来实例化一个会话对象

对这个会话对象进行参数设置(也就是更改其属性)

之后直接使用会话对象(而不是之前的requests)进行get请求,其就会一致沿用之前的登录状态

  • 响应式工作流
r = requests.get(url, stream=True)

设置stream为True,此时就会推迟响应内容的下载

其不会立即开始下载,当你使用iter_content或iter_lines遍历内容或访问内容属性时才开始下载

r.iter_content(chunk_size=512)
# 一块一块的遍历下载内容,此处设置了chunk_size,
# 相当于返回了一个块的迭代器,可以进行遍历
r.iter_lines()
# 一行一行的遍历下载内容
# 相当于返回一个行的迭代器
content = r.content
# 访问内容属性时才会进行下载

可以将其放入函数,使用yield包装成一个生成器

  •  JSON数据的下载和上传
    r = requests.get(url,stream=True)
    for line in r.iter_lines():
        if line:
            print('----downloading----')
            print(line)
            yield json.loads(line)

通过get方法来获得响应对象

使用for遍历属性r.iter_lines(),然后可以使用wite来写入本地文件

        headers = {'Content-Type': 'application/json'}
        file_upload = requests.post(url,data=line,headers=headers).text
        print(file_upload)

使用post方法来进行数据上传

上传数据之前首先处理header,指定请求的标头

此处的line为循环中的遍历元素,一次只会传入一条line,也就是一条json数据(使用json.dumps()进行了处理或者是直接来自于json文件)

使用data来接收数据(注意数据一定要格式对应,否则会报错)

text会输出上传之后的返回信息,比如上传成功等等

  • 爬取网站数据的基本流程

 

posted @ 2020-11-09 11:04  lixin2020  阅读(110)  评论(0)    收藏  举报