POST请求,包括使用python的文件
我是一个网络编程的初学者,如果这是一个非常基本的东西,那么很抱歉,但是我找不到像我在stackoverflow中遇到的问题那样具体的东西。 所以我有很多文本文件10k,我需要上传到这个网站,然后点击评估NES/NLS。这将触发一个SQL查询,并以表格形式返回一些信息。然后,我需要单击CSV按钮将文件下载到我的计算机中。 当然,我不想手动上传每个文件,所以我试图用Python生成请求,但无法完成,我甚至没有从初始网站获得表响应,因此下载CSV是一个我还没有遇到的挑战:POST请求,包括使用python的文件,python,html,python-requests,multipartform-data,Python,Html,Python Requests,Multipartform Data,我是一个网络编程的初学者,如果这是一个非常基本的东西,那么很抱歉,但是我找不到像我在stackoverflow中遇到的问题那样具体的东西。 所以我有很多文本文件10k,我需要上传到这个网站,然后点击评估NES/NLS。这将触发一个SQL查询,并以表格形式返回一些信息。然后,我需要单击CSV按钮将文件下载到我的计算机中。 当然,我不想手动上传每个文件,所以我试图用Python生成请求,但无法完成,我甚至没有从初始网站获得表响应,因此下载CSV是一个我还没有遇到的挑战: import request
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按钮也有一个生成的值,并且您只提交一个空值。是的,对此表示感谢和抱歉。如何为我试图通过代码执行的请求生成令牌值?这非常有效!多谢各位!目前,我将只关注完成任务,稍后我将仔细查看代码、库以及跨站点脚本标记主题。