使用POST请求在Python中通过网站表单进行基本文件上传

1 投票
1 回答
15127 浏览
提问于 2025-04-18 06:51

我在一个随机网站上尝试用Python和HTTP请求上传文件。为此,我使用了一个很方便的库,叫做Requests

根据文档和一些在StackOverflow上的回答这里那里,我只需要在我的应用中添加一个files参数,前提是我先研究一下网页的DOM结构。

这个方法很简单:

  1. 在源代码中查找表单的URL("action"属性);
  2. 在源代码中查找上传按钮的"name"属性;
  3. 在源代码中查找提交表单按钮的"name"和"value"属性;
  4. 用所需的参数完成Python代码。

有时候这个方法很有效。实际上,我成功地在这个网站上上传了一个文件:http://pastebin.ca/upload.php

在查看源代码后,表单的URL是upload.php,按钮的名字是files,值是Upload,所以我得到了以下代码:

url = "http://pastebin.ca/upload.php"
myFile = open("text.txt","rb")
r = requests.get(url,data={'s':'Upload'},files={'file':myFile})
print r.text.find("The uploaded file has been accepted.") 
# ≠ -1

但是现在,让我们看看这个网站:http://www.pictureshack.us/

对应的代码如下:

url = "http://www.pictureshack.us/index2.php"
myFile = open("text.txt","rb")
r = requests.get(url,data={'Upload':'upload picture'},files={'userfile':myFile})
print r.text.find("Unsupported File Type!") 
# = -1

实际上,我看到这两个网站之间唯一的区别是,第一个网站在提交表单时,处理的URL和表单所在的页面是一样的,而文件也是在这个页面上传的。

但这并没有解决我的问题,因为我仍然不知道在第二种情况下如何提交我的文件。

我尝试在主页上而不是在.php文件上发出请求,但当然是没有用的。


另外,我还有一个问题。

假设某些表单元素没有"name"属性。我该如何在Python请求中指定它呢?

例如,这个网站:http://imagesup.org/

提交表单按钮看起来是这样的:<input type="submit" value="Héberger !">

我该如何在我的数据参数中使用它呢?

1 个回答

4

表单还有一个你必须注意的部分:就是 method 属性。你现在使用的是 GET 请求,但你提到的那些表单使用的是 method="post"。所以你需要用 requests.post 来发送一个 POST 请求。

撰写回答