zoukankan      html  css  js  c++  java
  • python requests模块

    1)导入模块

    import requests

    2)发送请求的简洁

      示例代码:获取一个网页(个人github)

    1 import requests
    2  
    3 r = requests.get('https://github.com/Ranxf')       # 最基本的不带参数的get请求
    4 r1 = requests.get(url='http://dict.baidu.com/s', params={'wd': 'python'})      # 带参数的get请求
    5   

    我们就可以使用该方式使用以下各种方法

    复制代码
    1   requests.get(‘https://github.com/timeline.json’)                                # GET请求
    2   requests.post(“http://httpbin.org/post”)                                        # POST请求
    3   requests.put(“http://httpbin.org/put”)                                          # PUT请求
    4   requests.delete(“http://httpbin.org/delete”)                                    # DELETE请求
    5   requests.head(“http://httpbin.org/get”)                                         # HEAD请求
    6   requests.options(“http://httpbin.org/get” )                                     # OPTIONS请求
    复制代码

    3)为url传递参数

    >>> url_params = {'key':'value'}       #    字典传递参数,如果值为None的键不会被添加到url中
    >>> r = requests.get('your url',params = url_params)
    >>> print(r.url)
      your url?key=value

    4)响应的内容

    复制代码
    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响应)抛出异常
    复制代码

    post发送json请求:

    1 import requests
    2 import json
    3  
    4 r = requests.post('https://api.github.com/some/endpoint', data=json.dumps({'some': 'data'}))
    5 print(r.json())

    5)定制头和cookie信息

    header = {'user-agent': 'my-app/0.0.1''}
    cookie = {'key':'value'}
     r = requests.get/post('your url',headers=header,cookies=cookie) 
    复制代码
    import requests
    import json
     
    data = {'some': 'data'}
    headers = {'content-type': 'application/json',
               'User-Agent': 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:22.0) Gecko/20100101 Firefox/22.0'}
     
    r = requests.post('https://api.github.com/some/endpoint', data=data, headers=headers)
    print(r.text)
    复制代码

    6)响应状态码

    使用requests方法后,会返回一个response对象,其存储了服务器响应的内容,如上实例中已经提到的 r.text、r.status_code……
    获取文本方式的响应体实例:当你访问 r.text 之时,会使用其响应的文本编码进行解码,并且你可以修改其编码让 r.text 使用自定义的编码进行解码。

    1 r = requests.get('http://www.itwhy.org')
    2 print(r.text, '
    {}
    '.format('*'*79), r.encoding)
    3 r.encoding = 'GBK'
    4 print(r.text, '
    {}
    '.format('*'*79), r.encoding)

        示例代码:

    复制代码
    1 import requests
    2 
    3 r = requests.get('https://github.com/Ranxf')       # 最基本的不带参数的get请求
    4 print(r.status_code)                               # 获取返回状态
    5 r1 = requests.get(url='http://dict.baidu.com/s', params={'wd': 'python'})      # 带参数的get请求
    6 print(r1.url)
    7 print(r1.text)        # 打印解码后的返回数据
    复制代码

     运行结果:

    复制代码
    /usr/bin/python3.5 /home/rxf/python3_1000/1000/python3_server/python3_requests/demo1.py
    200
    http://dict.baidu.com/s?wd=python
    ………… Process finished with exit code 0
    复制代码
     r.status_code                      #如果不是200,可以使用 r.raise_for_status() 抛出异常

    7)响应

    r.headers                                  #返回字典类型,头信息
    r.requests.headers                         #返回发送到服务器的头信息
    r.cookies                                  #返回cookie
    r.history                                  #返回重定向信息,当然可以在请求是加上allow_redirects = false 阻止重定向

    8)超时

    r = requests.get('url',timeout=1)           #设置秒数超时,仅对于连接有效

    9)会话对象,能够跨请求保持某些参数

    s = requests.Session()
    s.auth = ('auth','passwd')
    s.headers = {'key':'value'}
    r = s.get('url')
    r1 = s.get('url1') 

    10)代理

    proxies = {'http':'ip1','https':'ip2' }
    requests.get('url',proxies=proxies)

     汇总:

    复制代码
    # HTTP请求类型
    # get类型
    r = requests.get('https://github.com/timeline.json')
    # post类型
    r = requests.post("http://m.ctrip.com/post")
    # put类型
    r = requests.put("http://m.ctrip.com/put")
    # delete类型
    r = requests.delete("http://m.ctrip.com/delete")
    # head类型
    r = requests.head("http://m.ctrip.com/head")
    # options类型
    r = requests.options("http://m.ctrip.com/get")
    
    # 获取响应内容
    print(r.content) #以字节的方式去显示,中文显示为字符
    print(r.text) #以文本的方式去显示
    
    #URL传递参数
    payload = {'keyword': '香港', 'salecityid': '2'}
    r = requests.get("http://m.ctrip.com/webapp/tourvisa/visa_list", params=payload) 
    print(r.url) #示例为http://m.ctrip.com/webapp/tourvisa/visa_list?salecityid=2&keyword=香港
    
    #获取/修改网页编码
    r = requests.get('https://github.com/timeline.json')
    print (r.encoding)
    
    
    #json处理
    r = requests.get('https://github.com/timeline.json')
    print(r.json()) # 需要先import json    
    
    # 定制请求头
    url = 'http://m.ctrip.com'
    headers = {'User-Agent' : 'Mozilla/5.0 (Linux; Android 4.2.1; en-us; Nexus 4 Build/JOP40D) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Mobile Safari/535.19'}
    r = requests.post(url, headers=headers)
    print (r.request.headers)
    
    #复杂post请求
    url = 'http://m.ctrip.com'
    payload = {'some': 'data'}
    r = requests.post(url, data=json.dumps(payload)) #如果传递的payload是string而不是dict,需要先调用dumps方法格式化一下
    
    # post多部分编码文件
    url = 'http://m.ctrip.com'
    files = {'file': open('report.xls', 'rb')}
    r = requests.post(url, files=files)
    
    # 响应状态码
    r = requests.get('http://m.ctrip.com')
    print(r.status_code)
        
    # 响应头
    r = requests.get('http://m.ctrip.com')
    print (r.headers)
    print (r.headers['Content-Type'])
    print (r.headers.get('content-type')) #访问响应头部分内容的两种方式
        
    # Cookies
    url = 'http://example.com/some/cookie/setting/url'
    r = requests.get(url)
    r.cookies['example_cookie_name']    #读取cookies
        
    url = 'http://m.ctrip.com/cookies'
    cookies = dict(cookies_are='working')
    r = requests.get(url, cookies=cookies) #发送cookies
    
    #设置超时时间
    r = requests.get('http://m.ctrip.com', timeout=0.001)
    
    #设置访问代理
    proxies = {
               "http": "http://10.10.1.10:3128",
               "https": "http://10.10.1.100:4444",
              }
    r = requests.get('http://m.ctrip.com', proxies=proxies)


    #如果代理需要用户名和密码,则需要这样:
    proxies = {
        "http": "http://user:pass@10.10.1.10:3128/",
    }

    复制代码

    3、示例代码

    GET请求

    复制代码
    1 # 1、无参数实例
     2   
     3 import requests
     4   
     5 ret = requests.get('https://github.com/timeline.json')
     6   
     7 print(ret.url)
     8 print(ret.text)
     9   
    10   
    11   
    12 # 2、有参数实例
    13   
    14 import requests
    15   
    16 payload = {'key1': 'value1', 'key2': 'value2'}
    17 ret = requests.get("http://httpbin.org/get", params=payload)
    18   
    19 print(ret.url)
    20 print(ret.text)
    
    
    复制代码

    POST请求

    复制代码
    # 1、基本POST实例
      
    import requests
      
    payload = {'key1': 'value1', 'key2': 'value2'}
    ret = requests.post("http://httpbin.org/post", data=payload)
      
    print(ret.text)
      
      
    # 2、发送请求头和数据实例
      
    import requests
    import json
      
    url = 'https://api.github.com/some/endpoint'
    payload = {'some': 'data'}
    headers = {'content-type': 'application/json'}
      
    ret = requests.post(url, data=json.dumps(payload), headers=headers)
      
    print(ret.text)
    print(ret.cookies)
    复制代码

    请求参数

    json请求:

    复制代码
     1 #! /usr/bin/python3
     2 import requests
     3 import json
     4 
     5 
     6 class url_request():
     7     def __init__(self):
     8         ''' init '''
     9 
    10 if __name__ == '__main__':
    11     heard = {'Content-Type': 'application/json'}
    12     payload = {'CountryName': '中国',
    13                'ProvinceName': '四川省',
    14                'L1CityName': 'chengdu',
    15                'L2CityName': 'yibing',
    16                'TownName': '',
    17                'Longitude': '107.33393',
    18                'Latitude': '33.157131',
    19                'Language': 'CN'}
    20     r = requests.post("http://www.xxxxxx.com/CityLocation/json/LBSLocateCity", heards=heard, data=payload)
    21     data = r.json()
    22     if r.status_code!=200:
    23         print('LBSLocateCity API Error' + str(r.status_code))
    24     print(data['CityEntities'][0]['CityID'])  # 打印返回json中的某个key的value
    25     print(data['ResponseStatus']['Ack'])
    26     print(json.dump(data, indent=4, sort_keys=True, ensure_ascii=False))  # 树形打印json,ensure_ascii必须设为False否则中文会显示为unicode
    复制代码

    Xml请求:

    复制代码
     1 #! /usr/bin/python3
     2 import requests
     3 
     4 class url_request():
     5     def __init__(self):
     6         """init"""
     7 
     8 if __name__ == '__main__':
     9     heards = {'Content-type': 'text/xml'}
    10     XML = '<?xml version="1.0" encoding="utf-8"?><soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><Request xmlns="http://tempuri.org/"><jme><JobClassFullName>WeChatJSTicket.JobWS.Job.JobRefreshTicket,WeChatJSTicket.JobWS</JobClassFullName><Action>RUN</Action><Param>1</Param><HostIP>127.0.0.1</HostIP><JobInfo>1</JobInfo><NeedParallel>false</NeedParallel></jme></Request></soap:Body></soap:Envelope>'
    11     url = 'http://jobws.push.mobile.xxxxxxxx.com/RefreshWeiXInTokenJob/RefreshService.asmx'
    12     r = requests.post(url=url, heards=heards, data=XML)
    13     data = r.text
    14     print(data)
    复制代码

    状态异常处理

    复制代码
     1 import requests
     2 
     3 URL = 'http://ip.taobao.com/service/getIpInfo.php'  # 淘宝IP地址库API
     4 try:
     5     r = requests.get(URL, params={'ip': '8.8.8.8'}, timeout=1)
     6     r.raise_for_status()  # 如果响应状态码不是 200,就主动抛出异常
     7 except requests.RequestException as e:
     8     print(e)
     9 else:
    10     result = r.json()
    11     print(type(result), result, sep='
    ')
    复制代码

    上传文件

    使用request模块,也可以上传文件,文件的类型会自动进行处理:

    复制代码
    import requests
     
    url = 'http://127.0.0.1:8080/upload'
    files = {'file': open('/home/rxf/test.jpg', 'rb')}
    #files = {'file': ('report.jpg', open('/home/lyb/sjzl.mpg', 'rb'))}     #显式的设置文件名
     
    r = requests.post(url, files=files)
    print(r.text)
    复制代码

    request更加方便的是,可以把字符串当作文件进行上传:

    复制代码
    import requests
     
    url = 'http://127.0.0.1:8080/upload'
    files = {'file': ('test.txt', b'Hello Requests.')}     #必需显式的设置文件名
     
    r = requests.post(url, files=files)
    print(r.text)
    复制代码

    6) 身份验证

    基本身份认证(HTTP Basic Auth)

    复制代码
    import requests
    from requests.auth import HTTPBasicAuth
     
    r = requests.get('https://httpbin.org/hidden-basic-auth/user/passwd', auth=HTTPBasicAuth('user', 'passwd'))
    # r = requests.get('https://httpbin.org/hidden-basic-auth/user/passwd', auth=('user', 'passwd'))    # 简写
    print(r.json())
    复制代码

    另一种非常流行的HTTP身份认证形式是摘要式身份认证,Requests对它的支持也是开箱即可用的:

    requests.get(URL, auth=HTTPDigestAuth('user', 'pass'))

    Cookies与会话对象

    如果某个响应中包含一些Cookie,你可以快速访问它们:

    import requests
     
    r = requests.get('http://www.google.com.hk/')
    print(r.cookies['NID'])
    print(tuple(r.cookies))

    要想发送你的cookies到服务器,可以使用 cookies 参数:

    复制代码
    import requests
     
    url = 'http://httpbin.org/cookies'
    cookies = {'testCookies_1': 'Hello_Python3', 'testCookies_2': 'Hello_Requests'}
    # 在Cookie Version 0中规定空格、方括号、圆括号、等于号、逗号、双引号、斜杠、问号、@,冒号,分号等特殊符号都不能作为Cookie的内容。
    r = requests.get(url, cookies=cookies)
    print(r.json())
    复制代码

    会话对象让你能够跨请求保持某些参数,最方便的是在同一个Session实例发出的所有请求之间保持cookies,且这些都是自动处理的,甚是方便。
    下面就来一个真正的实例,如下是快盘签到脚本:

    复制代码
    import requests
     
    headers = {'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
               'Accept-Encoding': 'gzip, deflate, compress',
               'Accept-Language': 'en-us;q=0.5,en;q=0.3',
               'Cache-Control': 'max-age=0',
               'Connection': 'keep-alive',
               'User-Agent': 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:22.0) Gecko/20100101 Firefox/22.0'}
     
    s = requests.Session()
    s.headers.update(headers)
    # s.auth = ('superuser', '123')
    s.get('https://www.kuaipan.cn/account_login.htm')
     
    _URL = 'http://www.kuaipan.cn/index.php'
    s.post(_URL, params={'ac':'account', 'op':'login'},
           data={'username':'****@foxmail.com', 'userpwd':'********', 'isajax':'yes'})
    r = s.get(_URL, params={'ac':'zone', 'op':'taskdetail'})
    print(r.json())
    s.get(_URL, params={'ac':'common', 'op':'usersign'})
    复制代码

    requests模块抓取网页源码并保存到文件示例

    这是一个基本的文件保存操作,但这里有几个值得注意的问题:

    1.安装requests包,命令行输入pip install requests即可自动安装。很多人推荐使用requests,自带的urllib.request也可以抓取网页源码

    2.open方法encoding参数设为utf-8,否则保存的文件会出现乱码。

    3.如果直接在cmd中输出抓取的内容,会提示各种编码错误,所以保存到文件查看。

    4.with open方法是更好的写法,可以自动操作完毕后释放资源。

    复制代码
    #! /urs/bin/python3
    import requests
    
    '''requests模块抓取网页源码并保存到文件示例'''
    html = requests.get("http://www.baidu.com")
    with open('test.txt', 'w', encoding='utf-8') as f:
        f.write(html.text)
        
    '''读取一个txt文件,每次读取一行,并保存到另一个txt文件中的示例'''
    ff = open('testt.txt', 'w', encoding='utf-8')
    with open('test.txt', encoding="utf-8") as f:
        for line in f:
            ff.write(line)
            ff.close()
    复制代码

    因为在命令行中打印每次读取一行的数据,中文会出现编码错误,所以每次读取一行并保存到另一个文件,这样来测试读取是否正常。(注意open的时候制定encoding编码方式)

    转载:https://www.cnblogs.com/ranxf/p/7808537.html

  • 相关阅读:
    spark 读取mongodb失败,报executor time out 和GC overhead limit exceeded 异常
    在zepplin 使用spark sql 查询mongodb的数据
    Unable to query from Mongodb from Zeppelin using spark
    spark 与zepplin 版本兼容
    kafka 新旧消费者的区别
    kafka 新生产者发送消息流程
    spark ui acl 不生效的问题分析
    python中if __name__ == '__main__': 的解析
    深入C++的new
    NSSplitView
  • 原文地址:https://www.cnblogs.com/wu-wu/p/11249057.html
Copyright © 2011-2022 走看看