半个小时学会requests

半个小时学会requests

  • requests是python的网络请求库,有非常强大的功能。而且比urllib更加简单、好用
  • requests 的安装非常方便:直接pip直接安装

      pip install requests

    requests 的基本用法

  • 实现get请求

      import requests
    
      r = requests.get('https://www.baidu.com')
      print(type(r))
      print(r.status_code)  # 重点 ,查看状态吗
      print(r.text)
      print(r.cookies)
  • 如果要在url附加额外的信息

      data = {
          'name':'germey',
          'age':'22'
      }
      r = requests.get('http://httpbin.org/get',params = data)
      print(r.url)   
      # 这样参数就非常简单的添加到url里面去了,用过 urllib的同学应该知道,在urllib里添加信息又要转字节流。
      print(r.text)
      ##########################
      运行结果:
      http://httpbin.org/get?name=germey&age=22
      {
        "args": {
          "age": "22", 
          "name": "germey"
        }, 
        "headers": {
          "Accept": "*/*", 
          "Accept-Encoding": "gzip, deflate", 
          "Connection": "close", 
          "Host": "httpbin.org", 
          "User-Agent": "python-requests/2.18.4"
        }, 
        "origin": "121.17.176.240", 
        "url": "http://httpbin.org/get?name=germey&age=22"
      }
  • 我们观察上面的返回结果,发现结果是json格式的。但是它实际上的类型是 str类型。有么有一种方法直接返回字典格式的结果。

      print(type(r.text))
      print(r.json())
      print(type(r.json()))
      a = r.json()
      print(a['args'])
      # 这样就可以很方便的提取网页中的 json 数据了。 但是要注意的是,如果返回结果不是json格式,就会出现解析错误。
      *******************************
      运行结果:
      <class 'str'>
      {'args': {'age': '22', 'name': 'germey'}, 'headers': {'Accept': '*/*', 'Accept-Encoding': 'gzip, deflate', 'Connection': 'close', 'Host': 'httpbin.org', 'User-Agent': 'python-requests/2.18.4'}, 'origin': '121.17.176.240', 'url': 'http://httpbin.org/get?name=germey&age=22'}
      <class 'dict'>
  • 在服务端一般都会读取网页的 headers请求头,如果发现请求头为一些网络爬虫的请求头,就或拒绝访问,如下:

      import requests
      r  = requests.get('https://www.zhihu.com/explore')
      print(r.text)
      '''
      看下面结果,就会发现给出了请求错误的提示信息
      '''
      ***************************
      <html>
      <head><title>400 Bad Request</title></head>
      <body bgcolor="white">
      <center><h1>400 Bad Request</h1></center>
      <hr><center>openresty</center>
      </body>
      </html>
  • 修改请求头:
    • chrome 的请求头

        User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36
    • 火狐浏览器的请求头

        User-Agent:Mozilla/5.0 (X11; Ubuntu;) Gecko/20100101 Firefox/61.0
      
        *************************
        headers = {
        'User-Agent':'Mozilla/5.0 (X11; Ubuntu;) Gecko/20100101 Firefox/61.0'
        }
        r = requests.get('https://www.zhihu.com/explore',headers=headers)
        print(r.status_code)
        print(r.text)
        # 这样我们就可以非常轻松的得到知乎的结果了。
  • 抓取网络上的图片

      import requests
    
      r = requests.get('https://www.autocar.co.uk/sites/autocar.co.uk/files/styles/gallery_slide/public/images/car-reviews/first-drives/legacy/911t-0357.jpg?itok=VJsdq9hv',timeout=2)
      with open('911.png','wb') as f:
          f.write(r.content)
      # 这张爱车的图片就出现在你的文件夹里了。
  • 使用post请求

      import requests
      data = {'name':'yang','age':'22'}
      r =requests.post('http://httpbin.org/post',data=data)
      print(r.text)
      print(r.url)
      # 我们查看结果得到,我们post的结果已经显示到了网页当中。但是url并没有发生任何变化,其实是post是将数据写在了请求体中发送过去的。
      ********************************
    
      {
        "args": {}, 
        "data": "", 
        "files": {}, 
        "form": {
          "age": "22", 
          "name": "yang"
        }, 
        "headers": {
          "Accept": "*/*", 
          "Accept-Encoding": "gzip, deflate", 
          "Connection": "close", 
          "Content-Length": "16", 
          "Content-Type": "application/x-www-form-urlencoded", 
          "Host": "httpbin.org", 
          "User-Agent": "python-requests/2.18.4"
        }, 
        "json": null, 
        "origin": "121.17.176.240", 
        "url": "http://httpbin.org/post"
      }
    
      http://httpbin.org/post
  • 响应:发送过去结果之后,必定会得到响应。此外,还有很多别的方法来获取其他的信息,如状态码、响应头、Cookies等

      import requests
    
      r= requests.get('https://www.baidu.com')
      print(r.status_code)  # 返回状态码
      print(r.headers)    #返回headers头
      print(r.cookies)    # 返回Cookies
      print(r.url)       # 返回url
      print(r.history)    # 返回请求历史

    requests 的一些高级用法:

  • 文件上传
    • 一下网站需要提交一些数据。假如有的网站需要上传文件,我们如何实现呢。

        import requests
        files = {'files':open('911.png','rb')}
        r = requests.post('http://httpbin.org/post',files=files)
        print(r.text)
        # 这样我们就上传完成了文件
  • cookies:

    • 获取cookies

        import requests
        headers = {
            'User-Agent':'Mozilla/5.0 (X11; Ubuntu;) Gecko/20100101 Firefox/61.0'
        }
        r = requests.get('https://www.baidu.com',headers=headers)
        for key,value in r.cookies.items():
            print(key +'='+value)
    • 使用cookie

        import requests
      
        headers = {
            'cookie': '_zap=aeac411e-6a5e-4dc6-abe3-ce7592902e65; _xsrf=LCk21sqrw5m5bghUuS4FgQkdNSKpSbZD; q_c1=de06444849884f7ba87c58d7178d3a3d|1535102667000|1535102667000; d_c0="ANCmU57jGg6PTpudGgCWcy8QRJFntSWIzEI=|1535102667"; tgw_l7_route=ec452307db92a7f0fdb158e41da8e5d8; capsion_ticket="2|1:0|10:1535617477|14:capsion_ticket|44:NGM2Y2VkOWUwMmExNGRiYmI4N2Y0NmYzZGY4MmJiNzE=|2d886e52a8c2987be5e9169b913e81f7010f4d32f4c8038fd4746e7b2a43b5b7"; z_c0="2|1:0|10:1535617486|4:z_c0|92:Mi4xYmZUVkF3QUFBQUFBMEtaVG51TWFEaVlBQUFCZ0FsVk56dmQwWEFCaFE2SzVRdnN2OHpNQTQtVzc5Z3NfWG1rTnJB|204923349accbf41e153d07746aab92b75ceab7f4b3b391bed36b2cb2d9f06fa"',
            'Host' :'www.zhihu.com',
            'User-Agent':"'User-Agent':'Mozilla/5.0 (X11; Ubuntu;) Gecko/20100101 Firefox/61.0'"
        }
        r = requests.get('https://www.zhihu.com',headers=headers)
        print(r.status_code)
        print(r.text)
        # 查看结果,就可以看到登录成功。
  • 回话维持,当你利用了 get或者 post等方法请求网页的时候,实力上是打开了不同的回话,相当于
    你打开了不同的浏览器,我们登录之后,想获取网页信息,有不想获取Cookie,这时候就用到了回话维持。

      import requests
      s= requests.Session()
      s.get('http://httpbin.org/cookies/set/number/789456123')
      r = s.get('http://httpbin.org/cookies')
      print(r.text)
  • 代理设置:
    • 在大规模爬去网页中,会封禁ip或者调到登录验证。为了防止这个情况,我们可以就需要设置代

        import requests
      
        proxies = {
            'http':'http://192.168.0.1:5555',
            'https':'http://192.168.0.1:1085',
        }
        requests.get('https://www.taobao.com',proxies=proxies)

更多 方法参数官方文档:http://docs.python-requests.org/

猜你喜欢

转载自www.cnblogs.com/yangaoteng666/p/9561530.html