1. <em id="yud1w"><acronym id="yud1w"><u id="yud1w"></u></acronym></em>
      
      
      <button id="yud1w"></button>

      python教程

      當前位置:首頁?>?requests爬蟲?>?當前文章

      requests爬蟲

      requests上傳多個文件及表單信息

      2021-11-12 184贊 老董筆記

        HTTP協議中沒有規定post提交數據必須使用什么數據格式,服務端根據請求頭中的Content-Type字段來獲取提交方式然后對數據進行解析。在html中的form表單中enctype屬性有3種設置方式:

       <form action="url地址" enctype="application/x-www-form-urlencoded" method="POST">
      <form action="url地址" enctype="multipart/form-data" method="POST"> 上傳文件的設置
      <form action="url地址" enctype="text/plain" method="POST">
      

        在form表單中可能會上傳多個文件,我們可以寫1個簡單上傳多個文件的界面(丑陋無比):

      <form action="https://www.baidu.com/upload.php" enctype="multipart/form-data" method="POST">
      <span>賬號</span>:<input type="text" name="user" />
      <span>密碼</span>:<input type="text" name="pwd" />
      <input  type="file" name="file1">  <!--選擇文件按鈕-->
      <input  type="file" name="file2">  <!--選擇文件按鈕-->
      <input  type="file" name="file3">  <!--選擇文件按鈕-->
      <input type="submit" />
      </form>
      

        在瀏覽器上傳多個文件需要1個個點擊選擇提交,在requests中上傳多個文件需要把文件信息寫到一個由元組的列表中,每個元組就是1個文件信息。 元組的結構為(form_field_name, file_info),form_field_name代表input元素的name屬性值,file_info也是1個元組,代表文件信息,一般為文件名、文件路徑、文件類型

      url = 'http://httpbin.org/post'
      multiple_files = [
      ('file1', ('foo.png', open('foo.png', 'rb'), )),
      ('file2', ('bar.png', open('bar.png', 'rb'),)),
      ('file3', ('111.xlsx', open('111.xlsx', 'rb'),)),
      ]
      r = requests.post(url, files=multiple_files)
      r.text
      # 看請求頭
      print(r.request.headers)
      # 響應頭
      print('--------')
      print(r.headers)
      # 返回內容
      print(r.text) # 內容太多省略
      
      {'User-Agent': 'python-requests/2.26.0', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Length': '15863', 'Content-Type': 'multipart/form-data; boundary=9a8cfa31a7ef4cd551fc5d100d5197ad'}
      --------
      {'Date': 'Wed, 17 Nov 2021 09:03:41 GMT', 'Content-Type': 'application/json', 'Content-Length': '21334', 'Connection': 'keep-alive', 'Server': 'gunicorn/19.9.0', 'Access-Control-Allow-Origin': '*', 'Access-Control-Allow-Credentials': 'true'}
      

        上述請求頭里有'Content-Type': multipart/form-data代表是上傳文件,響應頭中'Content-Type': 'application/json'代表返回的內容是json形式,即r.text是json字符串,可自行打印出來查看。

        上面丑陋的圖片中,除了上傳文件還要填寫一些表單信息,如果兩者組合起來的一起post的話,那就是files參數和data參數一并使用了,當然也可以加入一些自定義的請求頭。

      headers = {
      'User-Agent':'www.bdd33.com',
      'Referer': 'https://www.hao123.com/'
      }
      url = 'http://httpbin.org/post'
      multiple_files = [
      ('file1', ('foo.png', open('foo.png', 'rb'), )),
      ('file2', ('bar.png', open('bar.png', 'rb'),)),
      ('file3', ('111.xlsx', open('111.xlsx', 'rb'),)),
      ]
      dict_values = {'user':'dong','pwd':123456}
      r = requests.post(url, files=multiple_files,data=dict_values,headers=headers)
      r.text
      # 看請求頭
      print(r.request.headers)
      # 響應頭
      print('--------')
      print(r.headers)
      # 返回內容
      print(r.text)
      
      {'User-Agent': 'www.bdd33.com', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Referer': 'https://www.hao123.com/', 'Content-Length': '16042', 'Content-Type': 'multipart/form-data; boundary=80220ce953ec6177b83ffb923cbcaa38'}
      --------
      {'Date': 'Wed, 17 Nov 2021 09:15:49 GMT', 'Content-Type': 'application/json', 'Content-Length': '21415', 'Connection': 'keep-alive', 'Server': 'gunicorn/19.9.0', 'Access-Control-Allow-Origin': '*', 'Access-Control-Allow-Credentials': 'true'}
      

        上述代碼的響應頭中可以看到header參數值都傳進去了,如果檢查一下r.text的值,會發現賬號密碼表單信息和文件file1、file2、file3都在。

        PS:強烈建議用二進制模式(binary mode)打開文件,因為requests可能會在header中增加Content-Length字段,該值會被設為文件的字節數,如果用文本模式打開文件,可能碰到錯誤。

      感興趣直接點擊圖片獲取>>

      文章評論

      requests上傳多個文件及表單信息文章寫得不錯,值得贊賞
      国产99视频精品免视看6