Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
POST请求,包括使用python的文件_Python_Html_Python Requests_Multipartform Data - Fatal编程技术网

POST请求,包括使用python的文件

POST请求,包括使用python的文件,python,html,python-requests,multipartform-data,Python,Html,Python Requests,Multipartform Data,我是一个网络编程的初学者,如果这是一个非常基本的东西,那么很抱歉,但是我找不到像我在stackoverflow中遇到的问题那样具体的东西。 所以我有很多文本文件10k,我需要上传到这个网站,然后点击评估NES/NLS。这将触发一个SQL查询,并以表格形式返回一些信息。然后,我需要单击CSV按钮将文件下载到我的计算机中。 当然,我不想手动上传每个文件,所以我试图用Python生成请求,但无法完成,我甚至没有从初始网站获得表响应,因此下载CSV是一个我还没有遇到的挑战: import request

我是一个网络编程的初学者,如果这是一个非常基本的东西,那么很抱歉,但是我找不到像我在stackoverflow中遇到的问题那样具体的东西。 所以我有很多文本文件10k,我需要上传到这个网站,然后点击评估NES/NLS。这将触发一个SQL查询,并以表格形式返回一些信息。然后,我需要单击CSV按钮将文件下载到我的计算机中。 当然,我不想手动上传每个文件,所以我试图用Python生成请求,但无法完成,我甚至没有从初始网站获得表响应,因此下载CSV是一个我还没有遇到的挑战:

import requests

url = 'https://rostlab.org/services/nlsdb/query'
files = {'file-upload': ('some.txt', open('C:\\some.txt', 'rb'), 'text/plain')}
data = {'_token':'', 'input-data':'', 'query-sig2':''}

r = requests.post('https://rostlab.org/services/nlsdb/query', files=files, data=data)
作为回应,我收到了大量的文本,我可以在错误代码为500的HTML中恢复这些文本,所以我肯定在这里做错了什么,我看不出是什么。当我提交文件时,来自网站的POST请求如下所示:

**General**
  Request URL:https://rostlab.org/services/nlsdb/query
  Request Method:POST
  Status Code:200 OK
  Remote Address:131.159.28.73:443
  Referrer Policy:no-referrer-when-downgrade

Response Headers
  Cache-Control:no-cache, private
  Connection:Keep-Alive
  Content-Encoding:gzip
  Content-Length:2231
  Content-Type:text/html; charset=UTF-8
  Date:Thu, 08 Feb 2018 12:39:30 GMT
  Keep-Alive:timeout=5, max=100
  Server:Apache
  Set-Cookie:nlsdb_session=eyJpdiI6IjZMRk03ZjRCNjBmU1JcL3Y0Vko4ZHFRPT0iLCJ2YWx1ZSI6Ikh2bHcyZHBuN25nNmx1QnRoOFlPMWhWU0RYdUpEdnAwbGtySWgwbDlDVElHZmRyNlBMeEdXT3ROSERcLzRRNDB2ZnVUQ2oyTDlmOVRHa3JNUUZJTnBkUT09IiwibWFjIjoiZWM3ZjFjYmQ2ZThkNmRlM2JmOTY5OWZiYWMxOTA4ZmZiZjcxZjU1ODJjNjU1ODgzYjczMmUxMGY1NGMwMjNlMCJ9; expires=Thu, 08-Feb-2018 14:39:30 GMT; Max-Age=7200; path=/; httponly
  Set-Cookie:XSRF-TOKEN=eyJpdiI6IjExMjBaRHNmWHVLZTBzSURYZFwvUmF3PT0iLCJ2YWx1ZSI6InQyWUE5QzZEd2xmZU5rMjlyekV1Z2JcL3lGNkNvbHl1TnBHMVh5eWtLeWtNb3JHcTJJSFpyR0lDVkxNV2h2cGsrTUhYMGl3ZDBET0hucHdpNzV0YkRpdz09IiwibWFjIjoiNzcxODBhYjIzYjEzNDU1OTNhNGRhNjI3OTAxNWY1MjFkYjI5MWQ5NjgwNGE4ZjVmMzQzZThkNWUzZWE0YTgwYSJ9; expires=Thu, 08-Feb-2018 14:39:30 GMT; Max-Age=7200; path=/
  Vary:Accept-Encoding

Request Headers
 Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
  Accept-Encoding:gzip, deflate, br
  Accept-Language:en-US,en;q=0.9
  Cache-Control:max-age=0
  Connection:keep-alive
  Content-Length:1943
  Content-Type:multipart/form-data; boundary=----WebKitFormBoundary1tOuJdyWl1bn7H4X
  Cookie:XSRF-TOKEN=eyJpdiI6IjZaWHdTa3FPYmNHbkxsNVpoUlE3T0E9PSIsInZhbHVlIjoiQWMraGlLekd1akkrc0RDTzNMRGNIcVFkVGdBNjZFa2h4XC8xcUI0VmtIVG9CTnVPNW1IUW55NU9iNGlGY0NCWkFkd0hDZnJOaXBaT3J0VHZTSXl6b1FBPT0iLCJtYWMiOiJmMjE3N2JkZDIyMjRkNTY3ZGE4MDhlNGY5OWJiMDAwYjNiNzYyNGJjMTc2YzA4NTQwODcxZTM3YjI0YjQ5MWUyIn0%3D; nlsdb_session=eyJpdiI6IjByb2dtS0Q1ekFBU1F0WURJUk8rWnc9PSIsInZhbHVlIjoiM3lMNFU5Y2hBXC9BVU0xT0RUNnhVaUJ0ckJ0RnB5QlJqbk15alNSNkM4MjhNTGd6TFwvR0dwd0ZpWE9pU3piekhWb3ZzQjNZYVQ4ODdHeUxUMVJWM0pwUT09IiwibWFjIjoiYTE1Y2Q2NmRlN2M4Yjc1MzEyZTQxYjcwMzVmYjNiNjA1YjdiNjU4ODkxZWJhM2JmYTAwYTk1MWNhZWNkNTczMiJ9
  DNT:1
  Host:rostlab.org
  Origin:https://rostlab.org
  Referer:https://rostlab.org/services/nlsdb/
  Upgrade-Insecure-Requests:1
  User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.119 Safari/537.36

Request Payload  
  ------WebKitFormBoundary1tOuJdyWl1bn7H4X
  Content-Disposition: form-data; name="_token"

  GnjGT2Ejrrpo4Nlf2EbwtmLtY29GNFnoTJpl5z5o
  ------WebKitFormBoundary1tOuJdyWl1bn7H4X
  Content-Disposition: form-data; name="input-data"


  ------WebKitFormBoundary1tOuJdyWl1bn7H4X
  Content-Disposition: form-data; name="file-upload"; filename="some.txt"
  Content-Type: text/plain


  ------WebKitFormBoundary1tOuJdyWl1bn7H4X
  Content-Disposition: form-data; name="query-sig2"

  sF4MZkIaMc1K9TPZ6uYJuQ
  ------WebKitFormBoundary1tOuJdyWl1bn7H4X--
我相信数据对象是不正确的,但我无法使它正确,省略它似乎也不起作用。关于如何正确检索数据,然后下载相应的csv文件,您有什么建议吗?

该网站用于防止常见类型的攻击。此外,他们还使用生成的令牌作为提交按钮

要发布任何内容,您需要:

储存和归还饼干。这是最简单的一种方法 加载表单页面并读取CSRF令牌和提交按钮值 在POST请求中使用提取的令牌 我将使用解析表单页面并提取令牌:

from bs4 import BeautifulSoup
import requests

form_url = 'https://rostlab.org/services/nlsdb/'

with requests.session() as sess:
    response = sess.get(form_url)
    soup = BeautifulSoup(response.content, 'html.parser')

    csrf_token = soup.find('input', {'name': '_token'})['value']
    submit_token = soup.find('button', id='submit-sig2')['value']        
    action_url = soup.find('form', id='input-form')['action']

    data = {'_token': csrf_token, 'query-sig2': submit_token, 'input-data':''}

    with open('C:\\some.txt', 'rb') as some_text:
        files = {'file-upload': ('some.txt', some_text, 'text/plain')}
        response = sess.post(action_url, data=data, files=files)
注意,我还提取了表单标记的action属性;最好坚持服务器告诉我们使用的内容


上面的代码生成一个200 OK的响应,HTML页面在表中列出匹配的结果。

为什么要发布一个空的\u标记值?您的浏览器发布了GnjGT2Ejrrpo4Nlf2EbwtmLtY29GNFnoTJpl5z5o。请注意,此令牌可能是有时间限制的,与浏览器会话cookies绑定,并且不可恢复。接下来,query-sig2按钮也有一个生成的值,并且您只提交一个空值。是的,对此表示感谢和抱歉。如何为我试图通过代码执行的请求生成令牌值?这非常有效!多谢各位!目前,我将只关注完成任务,稍后我将仔细查看代码、库以及跨站点脚本标记主题。