使用requests模块在HTML页面上通过此上载文件表单上载文件的正确方法是什么?我尝试使用以下代码,但不确定如何将表单包含到我的Python代码中?
HTTPDigestAuth登录正常,我从远程站点获得200 OK。
#!/usr/bin/env python3
import requests
from requests.auth import HTTPDigestAuth
with requests.Session() as s:
url = "http://192.168.1.1/updatesettings.html"
r = s.get(url, auth=HTTPDigestAuth('admin', '123456'))
if r.status_code == 200:
fin = open('backupsettings.conf', 'rb')
files = {'file': fin}
s.post(url, files=files)
else:
print("Login failed")
HTML格式如下
<form method='post' ENCTYPE='multipart/form-data' action='uploadsettings.cgi' onSubmit='return isInProgress();'>
<b>Tools -- Update Settings</b><br>
<br>
Update Broadband Router settings. You may update your router settings using your saved files.<br>
<br>
<table border="0" cellpadding="0" cellspacing="0">
<tr>
<td>Settings File Name:
</td>
<td><input type='file' name='filename' size='15'></td>
</tr>
</table>
<p align="center"><input type='submit' value='Update Settings'></p>
</form>
现在我得到“ ConnectionResetError:[Errno 104]对等重置连接”。但这可能是由于我没有指定正确的参数和内容,因此如果我排除POST内容,则登录工作正常。
答案 0 :(得分:0)
检查表单中的操作参数和代码中的url,第一个是“ .cgi”,另一个是“ .html”,请确保您的请求标头也包含正确的“ enctype”。错误104是因为服务器对错误的请求进行了错误处理,从而终止了连接。 使用它来调试请求,并查看发送到服务器的确切信息。
import logging
try:
import http.client as http_client
except ImportError:
# Python 2
import httplib as http_client
http_client.HTTPConnection.debuglevel = 1
logging.basicConfig()
logging.getLogger().setLevel(logging.DEBUG)
requests_log = logging.getLogger("requests.packages.urllib3")
requests_log.setLevel(logging.DEBUG)
requests_log.propagate = True