使用POST请求在Python中通过网站表单进行基本文件上传
我在一个随机网站上尝试用Python和HTTP请求上传文件。为此,我使用了一个很方便的库,叫做Requests。
根据文档和一些在StackOverflow上的回答这里和那里,我只需要在我的应用中添加一个files
参数,前提是我先研究一下网页的DOM结构。
这个方法很简单:
- 在源代码中查找表单的URL("action"属性);
- 在源代码中查找上传按钮的"name"属性;
- 在源代码中查找提交表单按钮的"name"和"value"属性;
- 用所需的参数完成Python代码。
有时候这个方法很有效。实际上,我成功地在这个网站上上传了一个文件:http://pastebin.ca/upload.php
在查看源代码后,表单的URL是upload.php
,按钮的名字是file
和s
,值是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
请求。