requests库的应用

首先就不介绍怎么取下载requests库了,这篇文章就是如何介绍怎么去应用,主要针对小白

python中提供了urllib、urllib2的方法,为什么还是要requests库,那是因为前者的API接口太差,说白了就是发一个简单的请求,需要写大量的代码(如下)

import urllib2
import json
import cookielib


def urllib2_request(url, method="GET", cookie="", headers={}, data=None):
    """
    :param url: 要请求的url
    :param cookie: 请求方式,GET、POST、DELETE、PUT..
    :param cookie: 要传入的cookie,cookie= 'k1=v1;k1=v2'
    :param headers: 发送数据时携带的请求头,headers = {'ContentType':'application/json; charset=UTF-8'}
    :param data: 要发送的数据GET方式需要传入参数,data={'d1': 'v1'}
    :return: 返回元祖,响应的字符串内容 和 cookiejar对象
    对于cookiejar对象,可以使用for循环访问:
        for item in cookiejar:
            print item.name,item.value
    """
    if data:
        data = json.dumps(data)

    cookie_jar = cookielib.CookieJar()
    handler = urllib2.HTTPCookieProcessor(cookie_jar)
    opener = urllib2.build_opener(handler)
    opener.addheaders.append(['Cookie', 'k1=v1;k1=v2'])
    request = urllib2.Request(url=url, data=data, headers=headers)
    request.get_method = lambda: method

    response = opener.open(request)
    origin = response.read()

    return origin, cookie_jar


# GET
result = urllib2_request('http://127.0.0.1:8001/index/', method="GET")

# POST
result = urllib2_request('http://127.0.0.1:8001/index/',  method="POST", data= {'k1': 'v1'})

# PUT
result = urllib2_request('http://127.0.0.1:8001/index/',  method="PUT", data= {'k1': 'v1'})

上面就是应用前者的来发送请求,是不是体验感太差啦,那么requests就是将python内置的模块高度封装,从而可以让我们更加美好的可以应用它。如果用requests想要达到上面的需求,只要如下写法:

import requests




# GET
result = requests.request('http://127.0.0.1:8001/index/', method="GET")
#或者
result = requests.get('http://127.0.0.1:8001/index/')

# POST
result = requests.request('http://127.0.0.1:8001/index/',  method="POST", data= {'k1': 'v1'})
#或者
result = requests.post('http://127.0.0.1:8001/index/',data= {'k1': 'v1'})

# PUT
result = requests.request('http://127.0.0.1:8001/index/',  method="PUT", data= {'k1': 'v1'})
#或者
result = requests.put('http://127.0.0.1:8001/index/', data= {'k1':'v1'})

是的没有看错就是这个简单,你不经会问requests有多少重方法,其实有很多,如下:

import requests

requests.get(url, params=None, **kwargs)
requests.post(url, data=None, json=None, **kwargs)
requests.put(url, data=None, **kwargs)
requests.head(url, **kwargs)
requests.delete(url, **kwargs)
requests.patch(url, data=None, **kwargs)
requests.options(url, **kwargs)
 
# 以上方法均是在此方法的基础上构建
requests.request(method, url, **kwargs)

我们常用的就是get和post,那么我就以这两个为例。首先get中的参数post中都有,那么我们就以post为例!

url:就是你要请求的url,参数类型字符串

headers:就是设置请求头,参数类型字典

cookies:就是设置请求的cookies值,参数类型字典

params:就是给这个url重新设定,参数类型字典,如:

requests.post(
            url='http://www.baidu.com',
            params={'k1':'v1','k2':'v2'},
               )
#那么访问的地址就会变成http://www.baidu.com?k1=v1&k2=v2

 

data:就是给这个请求设置请求体,就是/r/n/r/n后面的内容,参数类型字典

requests.request(

            url=http://www.baidu.com,
            mathod='Post'
            data={'k1':'v1'}

                )

那么发过去的内容就是:GET/index http1.1\r\n...\r\nhonst:http://www.baidu.com\r\n\r\nk1=v1

json:也是发送请求体,但是格式和data是有区别的,会在请求头中加入一个Content-Type:appcation/json,告诉服务器发送的请求体是一个json数据,注意解析!(比较人性化)

requests.request(

            url=http://www.baidu.com,
            mathod='Post'
            json={'k1':'v1'}

                )

那么发过去的内容就是:GET/index http1.1\r\n...\r\nhonst:http://www.baidu.com\r\nContent-Type:appcation/json\r\n\r\n{'k1':'v1'}

proxies:代理用的

               代理:就是怕服务器发现自己是一个爬虫,用一个代理的IP来访问这个网站,就算封IP也不是自己的!

#代理用法:
proxy_dict = {
            'http':'72.35.58.234:8888',#举例ip瞎写的
            'https':'23.44.55.66:8888'
}
#如果访问http类型的网站,那么就会用第一个代理ip
#如果访问https类型的网站,那么就会用第二个代理ip
#当然你也可以这样用如下:
'''
proxy_dict = {
            'http://www.baidu.com':'72.35.58.234:8888',#举例ip瞎写的
            'https':'23.44.55.66:8888'
}


'''
#上面这个的意思就是当访问百度这个网站时,指定应用后面的ip
res = requests.request('https://www.weibo.com', proxies=proxy_dict)

                     想要用代理就要代价,那么代理不是随便用的,有些好的代理需要账号和密码,那么我们就要将用户名和密码发给                代理服务器才可以!(如下)

import requests
from requests.auth import HTTPProxyAuth

proxyDict = {
        'http':'77.75.105.165',
        'https':'77.75.105.165'

}

auth = HTTPProxyAuth('写入用户名','写入密码')

res = requests.get(url='http://www.baidu.com',proxies=proxyDict, auth=auth)
'''
那么上面访问的网站是不需要登入,如果我现在需要代理访问的网站也是需要登入密码的怎么办(如下)
res = requests.get(url='http://www.baidu.com',data={'网站的登入用户名':'网站的登入密码'}, proxies=proxyDict, auth=auth)
'''

auth:认证

不知道你有没有遇到过这样一种用户名的登入方式,再html源码中你是找不到input框来输入用户名和密码的,其实这种是你的浏览器发出来的弹框,其实这种是将你的用户名和密码以一种请求头的方式(可以模拟登入路由器),发送给了服务器,才实现了用户的登入,我现在是说的这种登入方式!(前面也讲的是代理认证)代码发送如下

from requests.auth import HTTPBasicAuth,HTTPSigestAuth

res = requests.get('请求地址', auth=HTTPBasicAuth('用户名', '密码'))

'''
首先我们要将我们的用户名和密码拿到手进行base64进行加密
name_password = b64encode(b'用户名:密码')
之后字符串拼接
param = 'Basic {}'.format(name_password)
再然后放到请求头中:
        Authorization:paramd

注意:
    这种事情是浏览器给你弄了一个弹窗,才会有以上的操作!
'''

 

files:是专门文件上传用的

file_dict = {
        'f1':open('text.txt', 'r') #如果你想你上传的文件重新命名就可以'f1'('新的名字',open('text.txt', 'r'))}

}

res = requests.request(url='...', mathod='POST', files=fil_dict)

timeout:访问超时的设置,参数类型数字或元祖

#与服务器建立连接超过5秒就放弃
res = requests.post(url='http://www.baidu.com', timeout=5)

#与服务器建立连接超过3秒或返回数据超过1秒就放弃
res = requests.post(url='http://www.baidu.com', timeout=(3, 1))

allow_redirects:是否允许重定向,如果允许就True,否则False

verify:是否验证SSL证书。还可以提供CA_BUNDLE路径。默认为True(用的非常少)

stream:是否支持大文件下载,如果为False,那么文件会立即下载,那么就会保存到我们的内存里,如果这个文件很大,超过我们的内存,那么我们就要将这个参数改成True,这样就会一点一点下载

cert:如果字符串,则路径到ssl客户机证书文件(.pem)。如果Tuple ('证书路径', '证书密钥')

requests.Session()的用法

import requests
from bs4 import BeautifulSoup
 
url = "http://www.v2ex.com/signin"
UA = "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.13 Safari/537.36"
 
header = { "User-Agent" : UA,
           "Referer": "http://www.v2ex.com/signin"
           }
 #首先创建一个session对象
v2ex_session = requests.Session()
#访问相应的网站
f = v2ex_session.get(url,headers=header)
 #爬去用户信息
soup = BeautifulSoup(f.content,"html.parser")
once = soup.find('input',{'name':'once'})['value']
print(once)
 
postData = { 'u': 'whatbeg',
             'p': '*****',
             'once': once,
             'next': '/'
             }
#将爬取的用户信息,然后去访问网站,这个时候会有一个cookies,然后v2ex_session对象会将这cookie
#保存起来,方便用这个新的cookie去再次访问网站
v2ex_session.post(url,
                  data = postData,
                  headers = header)
 #用新的cookie去访问这个网站,返回数据
f = v2ex_session.get('http://www.v2ex.com/settings',headers=header)
print(f.content.decode())
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值