zoukankan      html  css  js  c++  java
  • 9.Python爬虫利器一之Requests库的用法(一)

    requests 官方文档:

    http://cn.python-requests.org/zh_CN/latest/user/quickstart.html

    request 是一个第三方的HTTP库

    1.发起请求

    发起GET请求非常简单,直接使用requests的get方法即可。比方说下面的代码获取百度首页的信息。

    1 import requests
    2 
    3 baidu_url = 'https://www.baidu.com'
    4 
    5 response = requests.get(baidu_url)
    6 print(response.content.decode())
    如果要在URL上附加参数,也非常简单,使用params参数传入字典即可。参数会自动附加到URL上,列表参数也会正确的附加。这里这个网站是一个HTTP调试网站,值得收藏。如果我们访问这个网站,它会将浏览器发送的请求头,用户代理、表单参数等信息以格式化JSON形式返回,对HTTP调试非常有帮助。
    1 #基本Get请求
    2 r = requests.get('http://httpbin.org/get')
    3 #如果要加参数,可以利用params参数
    4 payload = {'key1':'values','key2':'valus'}
    5 r = requests.get('http://httpbin.org/get',params=payload)
    6 print r.url

    其他常用的HTTP操作例如PUT、DELETE、HEAD、OPTIONS等也支持,调用相应方法即可。

    获取结果

    发起请求之后,返回值是一个Response对象,利用它我们可以方便的获取结果。

    响应对象的常用属性和方法如下。

    属性名结果
    text HTTP字符
    encoding 响应编码,这个值可以改变,改变之后text属性也会根据编码而变化
    content 未编码的二进制数据
    json() 返回JSON数据
    raw 结果的原始字节流
    url 请求的URL
    status_code 状态码
    headers 请求头字典
    cookies cookies字典
    history 如果发生重定向,所有请求对象都会保存到这里
    r.status_code #响应状态码
    r.raw #返回原始响应体,也就是 urllib 的 response 对象,使用 r.raw.read() 读取
    r.content #字节方式的响应体,会自动为你解码 gzip 和 deflate 压缩
    r.text #字符串方式的响应体,会自动根据响应头部的字符编码进行解码
    r.headers #以字典对象存储服务器响应头,但是这个字典比较特殊,字典键不区分大小写,若键不存在则返回None
    #*特殊方法*#
    r.json() #Requests中内置的JSON解码器
    r.raise_for_status() #失败请求(非200响应)抛出异常

    自定义header

    如果要在请求上添加请求头,也非常简单。有些网站对客户端的限制比较严格,所以我们必须伪装header。

    1 #如果想添加headers 可以传入headers参数
    2 headers = {'content-type':'application/jason'}
    3 r = requests.get('http://httpbin.org/get',headers = headers)
    4 print r.url

    假如使用自带的urllib标准库,那么代码就比较复杂了。从这里我们可以看到requests确实非常方便。

    headers = {'content-type':'application/jason'}
    r = urllib2.request(url,headers = headers)
    response = urllib2.urlopen(r)
    print response.read().decode()

    POST数据

    如果我们要发送复杂的表单,就需要POST数据了。和GET传送数据一样,想方法中额外添加一个data参数的事儿。这种方式相当于你在表单中填写这些数据,然后点击表单的提交。

    data = {
        'name': 'yitian',
        'age': 22,
        'friends': ['zhang3', 'li4']
    }
    response = requests.post(f'{base_url}post', data=data)
    print(response.text)

    有时候POST数据不是使用表单方式,而是直接在请求体中附加参数。那么我们在发送参数的时候不能向data参数添加字典了,而应该传递字符串。

    import json
    
    data = {
        'name': 'yitian',
        'age': 22,
        'friends': ['zhang3', 'li4']
    }
    response = requests.post(f'{base_url}post', data=json.dumps(data))
    print(response.text)

    备注: json的几个常用方法 json.load(), json.dump() ,json.loads(), json.dumps()

    json.loads() : 将json结构转变成Python数据结构

    json.dumps():将Python数据结构转变成json结构

    json.load(): 读取json文件转成Python数据结构

    json.dumps():写入jason文件

    参考自: https://python3-cookbook.readthedocs.io/zh_CN/latest/c06/p02_read-write_json_data.html

    有些程序(例如Github的API)需要将JSON字符串直接当做请求体发送,比如说上面这种将字典转换为JSON的例子。在这种情况下,我们可以直接将字典的引用传递给方法的json参数,这样就不需要我们手动转换,requests会自动转换。

    response = requests.post(f'{base_url}post', json=data)

    上传文件

    在网页上,上传头像等操作都需要上传multipart/form-data类型的表单。使用requests也非常简单。需要注意打开文件的时候最好使用二进制模式,使用文本模式打开文件可能导致requests不能正确计算文件的大小。

    file = open(r'c:WindowsSystem32driversetchosts', mode='rb')
    
    data = {
        'file': file
    }
    
    response = requests.post(f'{base_url}post', files=data)
    print(response.text)
    
    #requests 支持流失上传的,允许发送大的数据流或文件而无需先把他读入内存。需使用流式上传
    with open('massive-body') as f:
        requests.post('http://some.url/streamed',data=f)

    cookies

    如果要获取响应的cookies,调用cookies属性即可,它会返回一个RequestsCookieJar对象,它实现了标准库的http.cookiejar。所以我们可以按照cookiejar的方法来使用RequestsCookieJar。比如说访问百度的时候,它会分配一个cookie,所以我们可以使用下面的代码获取Cookie。

    response = requests.get(baidu_url)
    print(response.cookies)

    如果要在发送数据的时候向服务器传递cookie,需要实例化一个RequestsCookieJar,然后传递给发送方法的cookies参数。

    import requests.cookies
    
    cookies = requests.cookies.RequestsCookieJar()
    cookies.set('name', 'yitian')
    response = requests.get(f'{base_url}cookies', cookies=cookies)
    print(response.text)

    以上就是requests的快速入门。具体的高级应用可以参考官方文档。




  • 相关阅读:
    国家电网 ERP系统
    小亚通SaaS ERP & 小鹅通 Education
    CRM User(Customer) Employee
    Docker ERP CRM
    OA、CRM、ERP之间的区别和联系是什么?
    基于jfinal开发的12306抢票软件
    15款优质Spring开源项目 脚手架
    Echart 跨域 Data Demo
    区块链+金融,带你直击实践应用中的需求和痛点
    thinkphp 5.0报错pcntl_signal() has been disabled for security reasons问题解决
  • 原文地址:https://www.cnblogs.com/stephenmc/p/7544063.html
Copyright © 2011-2022 走看看