• Python网络编程、爬虫之requests模块使用


    一、python操作网络,也就是打开一个网站,或者请求一个http接口,使用urllib模块。

    urllib模块是一个标准模块,直接import urllib即可,在python3里面只有urllib模块,在python2里面有urllib模块和urllib2模块。

         import json
            from urllib import request
            from urllib import parse
            pay_url = 'http://szz.xxxx.cn/pay'
            balance_url = 'http://szz.xxxx.cn/get_balance'
            balance_data = {'user_id':1}
            new_balance_data = parse.urlencode(balance_data)#把请求参数变成xx=11这样的
            balance_req = request.urlopen(balance_url+'?'+new_balance_data)#发送get请求
            print(balance_req.read().decode())
            #获取接口返回的结果,返回的结果是bytes类型的,需要使用decode方法解码,变成一个字符串
            pay_data ={"user_id":1,"price":"999"}
            new_pay_data = parse.urlencode(pay_data)#把请求参数变成xx=11这样的
            pay_req = request.urlopen(pay_url,new_pay_data.encode())#发送post请求,传入参数的话
            #参数必须是bytes类型,所以需要先encode一下,变成bytes类型
            print(pay_req.read().decode())#获取接口返回的结果,返回的结果是bytes类型的
            #需要使用decode方法解码,变成一个字符串
            res = json.loads(pay_req.read().decode())
            #因为返回的是一个json传,想把json串转成字典的话,久使用json模块转成一个字典
            print(res)

    二、上面是使用python自带的urllib模块去请求一个网站,或者接口,但是urllib模块太麻烦了,传参数的话,都得是bytes类型,返回数据也是bytes类型,还得解码,想直接把返回结果拿出来使用的话,还得用json,发get请求和post请求,也不通,使用比较麻烦,还有一个比较方便的模块,比urllib模块方便很多,就是requests模块,它是基于python自带的urllib模块封装的,用来发送http请求和获取返回的结果,操作很简单,它使用比较方便,需要安装,pip install requests即可,下面是requests模块的实例

     

    import requests        
    pay_url = 'https://www.cnblogs.com/feng0815/pay'
    balance_url = 'https://www.cnblogs.com/feng0815/get_balance' 
    balance_data = {'user_id':1} 
    pay_data ={"user_id":1,"price":"999"} 
    balance_res = requests.get(balance_url,balance_data).text #发送get请求,并获取返回结果,text获取的结果是一个字符串 
    print(balance_res) 
    balance_res = requests.get(balance_url,balance_data).json() #发送get请求,并获取返回结果,json()方法获取的结果直接是一个字典 
    print(balance_res)
    pay_res = requests.post(pay_url,pay_data).json()#调用post方法 print(pay_res) #====入参是json串的==== url = 'http://api.xxxxx.cn/getmoney' data = {"userid":1} res = requests.post(url,json=data).json()#指定入参json print(res) #======添加cookie===== url = 'http://api.xxxxxx.cn/setmoney2' data = {'userid':1,"money":9999} cookie = {'token':"token12345"} res = requests.post(url,data,cookies=cookie).json()#使用cookies参数指定cookie print(res) #=====添加权限验证===== url = 'http://api.xxxxxx.cn/setmoney' data = {'userid':1,"money":91999} res = requests.post(url,data,auth=('admin','123456')).json() #使用auth参数指定权限验证的账号密码,auth传的是一个元组 print(res)
    #======发送文件===== url = 'http://api.xxx.cn/uploadfile' res = requests.post(url,files={'file':open('api11.py')}).json() #指定files参数,传文件,是一个文件对象 print(res) #=====发送header====== url = 'http://api.xxx.cn/getuser2' data = {'userid':1} header = {'Content-Type':"application/json"} res = requests.post(url,headers=header).json() #指定headers参数,添加headers print(res)

     beautifulsoup

    import requests
     
    req = requests.get('http://www.xxx.cn',data={'username':'xxx'},cookies={'k':'v'},
                       headers={'User-Agent':'Chrome'},verify=False,timeout=3)  #发送get请求,data是请求数据,
                            # cookies是要发送的cookies,headers是请求头信息,verify=False是https请求的时候要加上,要不然会报错。
                            #timeout参数是超时时间,超过几秒钟的话,就不再去请求它了,会返回timeout异常
                            #这些都可以不写,如果有的话,可以加上
    req2 = requests.post('http://www.xxx.cn',data={'username':'xxx'},cookies={'k':'v'},
                        headers={'User-Agent':'Chrome'},files={'file':open('a.txt')},timeout=3) #发送post请求,data是请求数据,
                        # cookies是要发送的cookies,headers是请求头信息,files是发送的文件,verify=False是https请求的时候要加上,
                        # 要不然会报错,timeout参数是超时时间,超过几秒钟的话,就不再去请求它了,会返回timeout异常
                        #这些都可以不写,如果有的话,可以加上 
    req3 = requests.put('http://www.xxx.cn') #put方式请求
    req4 = requests.patch('http://www.xxx.cn')#patch方式请求
    req5 = requests.delete('http://www.xxx.cn')#delete方式请求
    req6 = requests.options('http://www.xxx.cn')#options方式请求,用法和上面的get、post都一样
     
    print(req.status_code) #获取返回状态码
    print(req.content)#获取返回的内容,二进制格式,一般下载图片、视频用这个
    print(req.text) #获取返回的内容,字符串格式
    print(req.json())#获取返回的内容,json格式,这个必须是返回的是json才可以使用,否则会报错
    print(req.headers)#获取响应头
    print(req.cookies)#获取返回的cookie
    print(req.encoding)#获取返回的字符集

     

    http权限认证

    有一些网站,比如说下载东西的时候有http的权限验证,没有验证话就返回401 请求未经授权这种错误的。一般都是需要http权限验证,下面是怎么添加http权限验证。

    当然这个http权限认证是http本身的,和你那些登陆请求那些不一样,比如说你要调一个登陆接口,传入的账号密码,和那个不是一回事,要区别开。

    举个例子呢就是商场的大门上的锁就是这个http权限验证,这个锁是人家商场的,而你的店铺的锁才是你登陆接口,你输入的账号密码。一般你一打开一个网站直接弹出来一个窗口让你输入账号密码,你都看不到页面,这种就是http权限验证。而那种你打开网站之后,直接就能看到页面,你要登录的时候,输入账号密码然后点登录的,这种的就是正常的登陆请求。这种http权限验证的比较少见。

    http会话保持

    什么是会话保持,就是有一些操作需要登录之后才操作的,你得先登录,然后才能做其他的操作。那咱们做的时候怎么做,先发送登陆的请求,获取到登录的cookie信息,(因为登录之后它的身份验证信息都是放在cookie里面的),然后把cookie传给下一个你要请求的url,这样就ok了,看下面代码。

    正常的话咱们要

    import requests
    r1=requests.post('https://www.cnblogs.com/feng0815/login',data={'username':'chenshifeng','password':'123456'})#登陆请求
    login_cookies = r1.cookies #获取到登陆请请求返回的cookie
    r2 = requests.post('https://www.cnblogs.com/feng0815/create_user',
                       data={'title':'测试测试','content':'发送文章测试'},
                       cookies=login_cookies)
        #把登陆获取到的cookie,传给发表文章的这个请求,就ok了
    print(r2.text)

    这么做,requests模块给咱们提供了更简单的方式,就是使用requests.session这个方法,它会自动帮咱们管理cookie,不需要咱们自己再获取到登陆的cookie,传给创建文件的请求,代码如下:

    http代理设置

    我们在写爬虫的时候,如果都用同一个ip访问多次访问某个网站,经常ip会被封,这样我们就访问不了了,那怎么解决呢,就得用ip代理了,代理的意思就是咱们把请求先发到代理上,然后再由代理帮咱们把请求发送出去,这样最终访问网站的ip就不是咱们自己的ip了。网上代理有很多,大多数收费的代理网站上每天都会有几个免费的代理,我先从https://www.kuaidaili.com/free/inha/ 这个里面找了几个免费的代理,设置代理的代码如下

  • 相关阅读:
    vs报错“以下文件中的行尾不一致,是否将行尾标准化”
    redis配置
    C#中保留两位小数但不四舍五入的最优做法
    jMeter 监控cpu、内存
    project 2010 使用技巧
    JMeter2.13 连接 sql server
    JMeter2.13进行压力测试
    freefilesync 7 使用
    cmd中无法运行svn命令
    MongoDB 3 + Windows 7 X64安装及配置
  • 原文地址:https://www.cnblogs.com/feng0815/p/7856794.html
Copyright © 2020-2023  润新知