发送带图片的POST请求

0 投票
2 回答
705 浏览
提问于 2025-04-16 08:28

我想用Python脚本填写一些网页表单,并通过POST请求发送。问题是这个表单有文件上传功能。我找到了一款叫做poster的工具来帮助我。于是,我用FireBug在网站上填写了表单,看到了一些信息:

values[action]  add_save
values[mod] blog
values[depth]   2
values[pid] 121
values[title]   title
values[title_eng]   title_en
img PNG...[a lot of binary image data]

这个网站需要授权,所以我得到了:

passman = urllib2.HTTPPasswordMgrWithDefaultRealm()
passman.add_password(None, theurl, username, password)
authhandler = urllib2.HTTPBasicAuthHandler(passman)

opener = poster.streaminghttp.register_openers()
opener.add_handler(authhandler)

现在我用网站上的默认示例写了代码:

index = """some parsed integer"""
datagen, headers = multipart_encode({
        'values[action]': 'add_save',
        'values[mod]': 'blog',
        'values[depth]': '2',
        'values[pid]': index,
        'values[title]' : 'title',
        'values[title_eng]' : 'title_eng',
        'img': open('1.png', 'rb')
    })

request = urllib2.Request(theurl, datagen, headers)
getdata = urllib2.urlopen(request)
print getdata.read()

我没有遇到错误等问题。但是在发送POST请求后,脚本没有把数据添加到数据库中(手动操作一切正常)。

我添加了这段代码:

for value in datagen:
    print value

结果是:链接。(文本中的123是那个索引变量的值)。

2 个回答

0

你有没有检查一下你发出的每个请求的回应呢?比如说登录网站的时候,确保你得到了正确的页面,并且设置了正确的cookie?

0

我之前没有用过你提到的方法,但我成功地用过MultipartPostHandler来做类似的事情。简单来说,下面是一个例子。


import MultipartPostHandler
import urllib2

form_opener = urllib2.build_opener(MultipartPostHandler.MultipartPostHandler) 
urllib2.install_opener(form_opener)
datagen = {vars}
o=opener.open(url, datagen) 

你可以在这里找到MultipartPostHandler。

你还可以像这样在打开器中添加urllib2.HTTPCookieProcessor()来处理身份验证:


import urllib

opener = urllib2.build_opener(urllib2.HTTPCookieProcessor()) 
# Or, (MultipartPostHandler.MultipartPostHandler, urllib2.HTTPCookieProcessor())
urllib2.install_opener(opener)
login = urllib.urlencode(dict(username='user',password='pass',login='Login')) 
o=opener.open(url, login) 

这是我第一次发帖,如果我说得不太对,请多包涵 :)

撰写回答