使用urllib和urllib2发送数据失败(python)

1 投票
2 回答
3210 浏览
提问于 2025-04-16 20:17

大家好(这是我第一次发帖)。

我正在尝试向一个网页发送数据。这个网页需要两个信息(一个文件和一个电子邮件地址),如果一切正常,网页会返回一个页面,上面写着“一切正常”,并将一个文件发送到提供的电子邮件地址。我执行了下面的代码,但我的电子邮件账户里什么也没有。

import urllib, urllib2

params = urllib.urlencode({'uploaded': open('file'),'email': 'user@domain.com'})
req = urllib2.urlopen('http://webpage.com', params)
print req.read()

打印命令给我的是主页的代码(我猜应该是返回“一切正常”页面的代码)。

我觉得(根据谷歌搜索)poster模块应该可以解决这个问题,但我想尽量减少依赖,所以我希望能找到一个使用标准库的解决方案(如果可能的话)。

提前谢谢大家。

2 个回答

1

这个网站会检查来源地址、用户代理和 cookies。

处理这些内容的方法是使用 urllib2.OpenerDirector,你可以通过 urllib2.build_opener 来获取它。

# Cookies handle
cj = cookielib.CookieJar()
CookieProcessor = urllib2.HTTPCookieProcessor(cj)
# Build OpenerDirector
opener = urllib2.build_opener(CookieProcessor)
# Valid User-Agent from Firefox 3.6.8 on Ubuntu 10.04
user_agent = 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2.8) Gecko/20100723 Ubuntu/10.04 (lucid) Firefox/3.6.8'
# Referer says that you send request from web-site title page
referer = 'http://webpage.com'
opener.addheaders = [
    ('User-Agent', user_agent),
    ('Referer', referer),
    ('Accept-Charset', 'utf-8')
]

接着,使用 urlencode 准备参数,然后通过 opener.open(params) 发送请求。

关于 Python 2.7 的文档可以查看: cookielibOpenerDirector

3

感谢大家的回答。我用 mechanize 这个库解决了我的问题。

import mechanize 

br = mechanize.Browser()
br.open('webpage.com') 

email='user@domain.com'

br.select_form(nr=0) 
br['email'] = email 
br.form.add_file(open('filename'), 'mime-type', 'filename')    
br.form.set_all_readonly(False) 
br.submit() 

撰写回答