0

我想用 python 脚本填写一些网络表单并用 POST 请求发送。问题是表单有文件上传。我发现了这个: python 的海报。所以,我带着 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 数字是索引变量值)。

4

2 回答 2

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) 

这是我的第一篇文章,如果我有点偏离目标,请原谅我:)

于 2010-12-13T21:33:25.417 回答
0

您是否检查了您提出的每个请求(包括登录网站)的响应,以确保为您提供了正确的页面并设置了正确的 cookie?

于 2010-12-14T01:26:37.070 回答