使用urllib和urllib2发送数据失败(python)
大家好(这是我第一次发帖)。
我正在尝试向一个网页发送数据。这个网页需要两个信息(一个文件和一个电子邮件地址),如果一切正常,网页会返回一个页面,上面写着“一切正常”,并将一个文件发送到提供的电子邮件地址。我执行了下面的代码,但我的电子邮件账户里什么也没有。
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 的文档可以查看: cookielib, OpenerDirector
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()