前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python-走进Requests库(推荐) 原

Python-走进Requests库(推荐) 原

作者头像
晓歌
发布2018-08-15 14:53:35
3.9K0
发布2018-08-15 14:53:35
举报
文章被收录于专栏:破晓之歌破晓之歌

课程地址:https://www.imooc.com/learn/736

一、安装准备

文档地址:http://docs.python-request.org/en/master

Kenneth Reitz: http://www.kennethreitz.org

request库代码:http://github.com/kennethreitz/requests

查看安装哪些库

代码语言:javascript
复制
python freeze

一、安装

1.安装python,pip

启动terminal。

改自动-启动

2.windows平台下安装terminal软件

这里我选的是cmder,网上有推荐wsl-terminal,为了小简而言,我选择了前者,不过貌似不好看倒是真的

使用参考:https://zhuanlan.zhihu.com/p/28400466

安装地址:http://cmder.net/(电脑上已经有git,所以安装mini版本)

解压后

双击启动exe文件,360会提醒是否阻止,全部不阻止,就可以使用啦

可以使用啦

查看python和pip安装版本,已经安装的包

代码语言:javascript
复制
python --version
pip --version
pip freeze

3.安装虚拟环境

代码语言:javascript
复制
pip install virtualenv

放在当前目录

代码语言:javascript
复制
virtualenv .env

4.激活虚拟环境

mac下:

代码语言:javascript
复制
source .env/bin/active

win下:

代码语言:javascript
复制
cd .env\Scripts
activate

5.安装requests库

代码语言:javascript
复制
pip install requests

可以交互python使用

已经安装过,所以会在cache中,不会耗费网络资源

引入requests库,帮助文档

代码语言:javascript
复制
import requests
help(requests)

“crtl+c”退出

服务端代码:http://httpbin.org

搭载在美国服务器上,访问比较慢

6.自己在本地搭建服务器环境(windows下暂未找到gunicorn httpbin的安装方法)

代码语言:javascript
复制
pip install gunicorn httpbin

mac成功

————————————————————————————————————

win下失败截图:

安装包错,百度后说是可能3.5的模块没有该安装包原因所致

先用国内源安装gunicorn

代码语言:javascript
复制
pip install -i https://pypi.mirrors.ustc.edu.cn/simple/  gunicorn

安装到是成功了,但是。。。

启动服务器

代码语言:javascript
复制
gunicorn httpbin:app

在慕课网问答中看到:gunicorn只支持linux系统 不支持windows系统

所以我也很郁闷!

后来找到方法说是网上下载fcntl.py模块放在lib里就可以,但是还有问题……

在github上下载fcntl的安装包:https://github.com/irtnog/dummy-fcntl.py

管理员命令依次执行

代码语言:javascript
复制
python setup.py build
python setup.py install

获取成功

文件夹下增加dist和build目录

——————————————————————————

windows下寻找其他本地搭建服务器环境方法:

方法一:安装Tornado(这个支持python3,安装比较简单)

代码语言:javascript
复制
pip install tornado

方法二:安装twisted(python3.5下报错,无法安装)

百度其他方法安装:

先下载相应安装文件:https://www.lfd.uci.edu/~gohlke/pythonlibs/#twisted

用pip执行安装whl的命令

A.全局安装方式:

放到C盘根目录下

代码语言:javascript
复制
pip install C:\Twisted-17.9.0-cp35-cp35m-win_amd64.whl

安装成功

B.虚拟环境安装方式:

把whl文件放在虚拟环境下的Script的文件加下

在虚拟环境路径中执行pip安装

代码语言:javascript
复制
pip install Twisted-17.9.0-cp35-cp35m-win_amd64.whl

安装成功

——————————————————————————

7.启动服务器

mac下:

代码语言:javascript
复制
gunicorn httpbin:app

mac正常访问:http:127.0.0.1:8000

访问成功

win下:

方法一:使用tornado

写一个hello.py的demo

代码语言:javascript
复制
#!/usr/bin/env python
# -*- coding:utf-8 -*-

import tornado.ioloop
import tornado.web


class MainHandler(tornado.web.RequestHandler):
    def get(self):
        self.write("Hello, world")


application = tornado.web.Application([
    (r"/index", MainHandler),
])

if __name__ == "__main__":
    application.listen(8888)
    tornado.ioloop.IOLoop.instance().start()

退回到hello.py所在路径,执行脚本

代码语言:javascript
复制
python hello.py

访问:http://127.0.0.1:8888/index,运行成功

方法二:使用twister

备注:

代码语言:javascript
复制
 deactivate

退出虚拟环境

二、了解HTTP协议

使用curl命令访问网站:

代码语言:javascript
复制
curl --help
curl -v http://www.imooc.com > tmp.txt

response返回内容

启动服务器

退出,执行

代码语言:javascript
复制
##-*- coding:utf-8 -*-
import  urllib2

URL_IP = 'HTTP://127.0.0.1:8000/ip'
URL_GET = 'HTTP://127.0.0.1:8000/get'


def use_simple_urllib2():
    response = urllib2.urlopen(URL_IP)
    print '>>>>Response Headers:'
    print response.info()
    print '>>>>Response Body:'
    print ''.join([line for line in response.readines()])
    print '>>>>Response Body:'
    print ''.join([line for line in response.readines()])


def use_params_urllib2():
    #构建请求参数
    params = urllib.urlencode({'param1':'hello','param2':'world'})
    print 'Request Params:'
    print params
    #发送请求
    response = urllib2.urlopen('?'.join([URL_GET,'%s']) % params)
    #处理响应
    print '>>>>Response Headers:'
    print response.info()
    print '>>>>Status Code:'
    print response.getcode()
    print '>>>>Response Body:'
    print ''.join([line for line in response.readines()])



if __name__ == '__main__':
    print ('>>>>User simple urllib2:')
    #use_simple_urllib2()
    print ('>>>>User params urllib2:')
    use_params_urllib2()

python2可使用

代码语言:javascript
复制
#-*- coding:utf-8 -*-
# 以下是python3
import urllib.request
from urllib import request
from urllib import parse
from urllib.request import urlopen

resp = urllib.request.urlopen('http://127.0.0.1:8888/index')
html1 = resp.info()
print('info:')
print(html1)

html2 = resp.getcode()
print('getcode:')
print(html2)

URL_GET = 'http://httpbin.org/get'
params = urllib.parse.urlencode({'param1':'hello','param2':'world'})
response = urllib.request.urlopen('?'.join([URL_GET,'%s']) % params)
print('params:')
print(response.read().decode())

python3可使用,需要先启动tornado

以上为原生url库

reason

状态码

代码语言:javascript
复制
#-*- coding:utf-8 -*-
import  requests

URL_IP = 'HTTP://127.0.0.1:8000/ip'
URL_GET = 'HTTP://127.0.0.1:8000/get'

def use_simple_requests():
    response = requests.get(URL_IP)
    print '>>>>Response Headers:'
    print response.headers
    print '>>>>Response Body:'
    print response.text

def use_params_requests():
    #构建请求参数
    params = {'param1':'hello','param2':'world'}
    print 'Request Params:'
    print params
    #发送请求
    response = requests.get(URL_IP,params = params)
    #处理响应
    print '>>>>Response Headers:'
    print response.headers
    print '>>>>Status Code:'
    print response.status_code
    print response.readon
    print '>>>>Response Body:'
    print response.json()

python2

代码语言:javascript
复制
#-*- coding:utf-8 -*-
import  requests

URL_IP = 'http://httpbin.org/ip'
URL_GET = 'http://httpbin.org/get'

# 以下是python3
def use_simple_requests():
    response = requests.get(URL_IP)
    print ('>>>>Response Headers:')
    print (response.headers)
    print ('>>>>Response Body:')
    print (response.text)

def use_params_requests():
    #构建请求参数
    params = {'param1':'hello','param2':'world'}
    print ('Request Params:')
    print (params)
    #发送请求
    response = requests.get(URL_IP,params = params)
    #处理响应
    print ('>>>>Response Headers:')
    print (response.headers)
    print ('>>>>Status Code:')
    print (response.status_code)
    print (response.reason)
    print ('>>>>Response Body:')
    print (response.json)

if __name__ == '__main__':
    print ('>>>>User simple requests:')
    use_simple_requests()
    print ('>>>>User params requests:')
    use_params_requests()

python3

三、发送请求

Developer:https://developer.github.com/

https://developer.github.com/v3/users

方式1:

方式2:

修改

修改

增加创建

常见异常:

第一个过程等待不超过3秒,第二个等待不超过7秒

两次等待不超过10秒

10秒没通过

没有认证-处理异常

代码语言:javascript
复制
#-*- coding:utf-8 -*-
import json
import requests
from requests import exceptions

URL = 'https://api.github.com'

def build_uri(endpoint):
    return '/'.join([URL,endpoint])

def better_print(json_str):
    return json.dumps(json.loads(json_str),indent=4)

def request_method():
    response = requests.get(build_uri('users/imoocdemo'))
    # response = requests.get(build_uri('users/emails'),auth=('imoocdemo','imoocdemo123'))
    # print (better_print(response.text))
    print (better_print(response.text))


def params_request():
    response = requests.get(build_uri('users'),params = {'since':11})
    print (better_print(response.text))
    print (response.request.headers)
    print (response.url)
    print(response.status_code)

def json_request():
    headers={"Accept":"text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8","User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 SE 2.X MetaSr 1.0"}
    # headers={"Accept":"application/vnd.github.jean-grey-preview+json"}
    # 修改
    response = requests.patch(build_uri('user'),auth=('imoocdemo','imoocdemo123'),json={'name':'babymooc2','email':'hello-world@imooc.org'})
    # 增加创建
    # response = requests.post(build_uri('users/emails'),auth=('imoocdemo','imoocdemo123'),json=['hello'])
    print (better_print(response.text))
    print (response.request.headers)
    print (response.request.body)
    print (response.status_code)
    print (response.reason)

def timeout_request():
    try:
        response = requests.get(build_uri('user/emails'),timeout = 10)
        response.raise_for_status()
    except (exceptions.Timeout) as e:
        print (e.message)
    except exceptions.HTTPError as e:
        #print (e.message)#no
        print (e)
    else:
        print (response.text)
        print (response.status_code)

if __name__=='__main__':
    # request_method()#可以
    # params_request()#可以
    # json_request()#422
    timeout_request()#404+no attribute

状态码422,请求格式正确,但是由于含有语义错误,无法响应。

经过试验,应当是讲课的人关闭了邮箱认证之类的

使用自己真实可登录的用户名,密码即可修改。查看页面在

https://github.com/你的用户名字

写法问题

避免多次握手

上下问管理

body里面沙溢没有

认证未通过

代码语言:javascript
复制
#-*- coding:utf-8 -*-
URL = 'https://api.github.com'

def build_uri(endpoint):
    return '/'.join([URL,endpoint])

def hard_request():
    from requests import Request,Session
    s = Session()
    headers = {'User-Agent':'fake1.3.4'}
    req = Request('GET',build_uri('user/email'),auth = ('imoocdemo','imoocdemo123'),headers = headers)
    prepped = req.prepare()
    print(prepped.body)
    print(prepped.headers)

    resp = s.send(prepped, timeout=5)
    print(resp.status_code)
    print(resp.request.headers)
    print(resp.text)



if __name__=='__main__':
    hard_request()#404和401

404还没查出问题

四、处理响应

状态码查找说明(需要访问外国网站):https://zh.wikipedia.org/zh/HTTP%E7%8A%B6%E6%80%81%E7%A0%81

utf-8转成unicode格式

代码语言:javascript
复制
#-*- coding:utf-8 -*-
import requests
response = requests.get('https://api.github.com')
response.status_code
response.reason
response.headers
response.url
response.history
response = requests.get('http://api.github.com')
response.history
response = requests.get('https://api.github.com')
dir(response)
response.elapsed
response.request.headers
response.encoding
response.raw.read(10)
response.content
response.json()
response.json()['team_url']

被拒绝:没有权限

查看code和头部信息

开发者工具查看差别,推测可能是user-agent的原因

伪造一个user-agent

状态码改变

试着打印图片

一直在响,乱码,图片不能被打印

支持流传输,写入文件

图片打开了

代码语言:javascript
复制
#-*- coding:utf-8 -*-
import requests
def download_image():
    '''
    demo:下载图片
    :return:
    '''
    headers = {'User-Agent':'Mozilla/5.0 (Linux; Android 5.0; SM-G900P Build/LRX21T) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Mobile Safari/537.36'}
    url = 'http://pic1.win4000.com/wallpaper/b/5476e87e6d29d.jpg'
    response = requests.get(url)
    print(response.content)
    print(response.status_code,response.reason)
    with open('demo.jpg','wb') as fd:
        for chunk in response.iter_content(128):
            fd.write(chunk)

download_image()

改进的方法:关闭了流,contextlib-上下文语法糖

代码语言:javascript
复制
#-*- coding:utf-8 -*-
import requests
def download_image():
    '''
    demo:下载图片
    :return:
    '''
    headers = {'User-Agent':'Mozilla/5.0 (Linux; Android 5.0; SM-G900P Build/LRX21T) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Mobile Safari/537.36'}
    url = 'http://pic1.win4000.com/wallpaper/b/5476e87e6d29d.jpg'
    response = requests.get(url,headers = headers, stream = True)
    print(response.content)
    print(response.status_code,response.reason)
    with open('demo.jpg','wb') as fd:
        for chunk in response.iter_content(128):
            fd.write(chunk)

def download_image_improved():
    '''
    demo:下载图片
    :return:
    '''
    headers = {'User-Agent':'Mozilla/5.0 (Linux; Android 5.0; SM-G900P Build/LRX21T) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Mobile Safari/537.36'}
    url = 'http://pic1.win4000.com/wallpaper/b/5476e87e6d29d.jpg'
    response = requests.get(url)
    from contextlib import closing
    with closing(requests.get(url,headers = headers, stream = True)) as response:
        with open('demo2.jpg', 'wb') as fd:
            for chunk in response.iter_content(128):
                fd.write(chunk)

# download_image()
download_image_improved()

很多事件基于回调,引起一些列动作

先发,拿到响应后处理

代码语言:javascript
复制
#-*- coding:utf-8 -*-
import requests

def get_key_info(response,*arg,**kwargs):
    '''
    回调函数
    '''
    print(response.headers['Content-Type'])

def main():
    '''
    主程序
    :return:
    '''
    requests.get('https://www.baidu.com',hooks=dict(response = get_key_info))

main()

参考代码:https://github.com/jian-en/imooc-requests

问题本身很复杂比解释的很嘈杂要好

五、进阶

1.HTTP代理

(1)auth

代码语言:javascript
复制
#-*- coding:utf-8 -*-
import requests
BASE_URL = 'https://api.github.com'

def construct_url(end_point):
    return '/'.join([BASE_URL, end_point])

def basic_auth():
    '''
    基本认证
    '''
    response = requests.get(construct_url('user'),auth=('imoocdemo','imoocdemo123'))
    print(response.text)
    print(response.request.headers)

basic_auth()

安装bpython

bpython安装参考文档:http://www.cnblogs.com/zhaojiedi1992/p/zhaojiedi_python_006_bpython.html

pip安装成功后,启动报错

原因:缺少一个包

下载curses包地址:https://www.lfd.uci.edu/~gohlke/pythonlibs/#curses

安装成功

修改启动位置

结果运行还是一闪而过,win10,python35的暂时不能用

——————————————————————————————

bpython-交互解释器

base64解码

(2)OAUTH

网站地址:http://www.codewars.com/

可以帮助编代码,这个网站相当于对github应用

登录会有个选项,用github方式

获取公共信息

用github举例:

拷贝token

方式一:

获得到信息

代码语言:javascript
复制
#-*- coding:utf-8 -*-
import requests
BASE_URL = 'https://api.github.com'

def construct_url(end_point):
    return '/'.join([BASE_URL, end_point])

def basic_auth():
    '''
    基本认证
    '''
    response = requests.get(construct_url('user'),auth=('imoocdemo','imoocdemo123'))
    print(response.text)
    print(response.request.headers)

basic_auth()

方式二:

加了语法糖,优化代码

结果一样

代码语言:javascript
复制
#-*- coding:utf-8 -*-
import requests
BASE_URL = 'https://api.github.com'

def construct_url(end_point):
    return '/'.join([BASE_URL, end_point])

# def basic_oauth():
#     headers = {'Authorization':'token ed375f28dfcc7d0f410877你自己的token'}
#     response = requests.get(construct_url('user/emails'),headers = headers)
#     print(response.request.headers)
#     print(response.text)
#     print(response.status_code)
# basic_oauth()

from requests.auth import AuthBase
class GithubAuth(AuthBase):
    def __init__(self,token):
        self.token = token

    def __call__(self, r):
        r.headers['Authorization'] = ' '.join(['token ', self.token])
        return r

def oauth_advanced():
    auth = GithubAuth('ed375f28dfcc7d0f41087你自己的token')
    response = requests.get(construct_url('user/emails'),auth=auth)
    print(response.text)


oauth_advanced()

相对基本认证,安全一些,不是明文用户名,密码

2.代理(Proxy)

安装requeats【socksv5】库的支持

代码语言:javascript
复制
pip install 'requests[socksv5]'

有防火墙

启动代理服务器,成功

代码语言:javascript
复制
#-*- coding:utf-8 -*-
import requests
proxies = {'http':'socks5://127.0.0.1:1080','https':'socks5://127.0.0.1:1080'}
url = 'https://www.facebook.com'
response = requests.get(url, proxies=proxies, timeout=10)
print(response.status_code)

windows上貌似不支持proxies,所以失败

(3)Session和Cookie

缺点:

A.每次请求都要带着cookie,带宽受影响

B.cookie是在浏览器端的,明文,很多请求可以伪造不安全

存储压力转移到服务器上,安全一些

requests库主要支持是客户端编程

服务端主要是:flask,django等实现cookie和session

用第一原理去思考问题,多问几个为什么,思考底层原理

参考文档:

1.Tornado基本使用:https://www.cnblogs.com/chenchao1990/p/5413547.html

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、安装准备
  • 一、安装
    • 1.安装python,pip
      • 2.windows平台下安装terminal软件
        • 3.安装虚拟环境
          • 4.激活虚拟环境
            • 5.安装requests库
              • 6.自己在本地搭建服务器环境(windows下暂未找到gunicorn httpbin的安装方法)
                • 7.启动服务器
                • 二、了解HTTP协议
                • 三、发送请求
                • 四、处理响应
                • 五、进阶
                  • 1.HTTP代理
                    • (1)auth
                    • (2)OAUTH
                  • 2.代理(Proxy)
                    • (3)Session和Cookie
                • 参考文档:
                相关产品与服务
                云开发 CLI 工具
                云开发 CLI 工具(Cloudbase CLI Devtools,CCLID)是云开发官方指定的 CLI 工具,可以帮助开发者快速构建 Serverless 应用。CLI 工具提供能力包括文件储存的管理、云函数的部署、模板项目的创建、HTTP Service、静态网站托管等,您可以专注于编码,无需在平台中切换各类配置。
                领券
                问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档