1

我正在做一个小项目来帮助我的工作更快地进行。我目前有一个用 Python 3.2 编写的程序,它为我完成了几乎所有的体力劳动,但有一个例外。我需要登录公司网站(用户名和密码),然后选择月份和年份,然后单击下载。我想写一个小程序来帮我做,这样整个过程完全由程序来完成。

我已经研究过了,我只能找到 2.X 的工具。我研究了 urllib,我知道一些 2.X 模块现在在 urllib.request 中。

我什至找到了一些代码来启动它,但是我对如何将它付诸实践感到困惑。

这是我发现的:

import urllib2

theurl = 'http://www.someserver.com/toplevelurl/somepage.htm'

username = 'johnny'
password = 'XXXXXX'
# a great password

passman = urllib2.HTTPPasswordMgrWithDefaultRealm()
# this creates a password manager
passman.add_password(None, theurl, username, password)
# because we have put None at the start it will always
# use this username/password combination for  urls
# for which `theurl` is a super-url

authhandler = urllib2.HTTPBasicAuthHandler(passman)
# create the AuthHandler

opener = urllib2.build_opener(authhandler)

urllib2.install_opener(opener)
# All calls to urllib2.urlopen will now use our handler
# Make sure not to include the protocol in with the URL, or
# HTTPPasswordMgrWithDefaultRealm will be very confused.
# You must (of course) use it when fetching the page though.

pagehandle = urllib2.urlopen(theurl)
# authentication is now handled automatically for us

全部归功于 Michael Foord 和他的页面:基本身份验证

所以我稍微改变了代码,用 'urllib.request' 替换了所有的 'urllib2'

然后我学会了如何打开网页,确定程序应该打开网页,使用登录名和密码数据打开页面,然后我将学习如何从中下载文件。

ie = webbrowser.get('c:\\program files\\internet explorer\\iexplore.exe')
ie.open(theurl)

(我知道资源管理器是垃圾,只是用它来测试然后我将使用 crome ;))

但这不会打开输入登录数据的页面,它只是打开页面,就像您输入了 url 一样。

如何使用密码句柄打开页面?我有点理解迈克尔是如何制作它们的,但我不确定使用哪个来实际打开网站。

还有一个事后的想法,我可能需要研究 cookie 吗?

谢谢你的时间

4

4 回答 4

2

你在这里搞糊涂了。 webbrowser是您实际网络浏览器的包装器,并且urllib是 http 和 url 相关内容的库。他们彼此不认识,并且服务于非常不同的目的。

在以前的 IE 版本中,您可以像这样在 URL 中编码 HTTP Basic Auth 用户名和密码: http(s)://Username:Password@Server/Ressource.ext- 我相信 Firefox 和 Chrome 仍然支持,IE 杀死了它:http: //support.microsoft.com/kb/834489/EN-我们

如果您想模拟浏览器,而不仅仅是打开一个真实的浏览器,请查看mechanizehttp ://wwwsearch.sourceforge.net/mechanize/

于 2012-05-14T15:19:26.380 回答
1

您的浏览器对您在 python 中完成的身份验证一无所知(这与您的浏览器是否垃圾无关)。该webbrowser模块只是提供了启动浏览器并将其指向网络浏览器的便捷方法。您不能将您的凭据“传输”到浏览器。

至于从 python2 迁移到 python3:该2to3工具可以自动转换像您这样的简单脚本。

于 2012-05-14T15:05:30.867 回答
0

它们不在同一个环境中运行。

当您单击下载按钮时,您需要弄清楚到底发生了什么。使用浏览器的开发工具获取网站使用的 POST 格式。然后在 python 中构建一个请求来获取文件。

Requests是一个很好的库,可以更轻松地完成这类事情。

于 2012-05-14T15:06:58.450 回答
0

我会使用 selenium,这是来自一个小脚本的一些代码,我已经破解了一些代码给你一个想法:

def get_name():
user = 'johnny'
passwd = 'XXXXXX'
try : 

    driver = webdriver.Remote(desired_capabilities=webdriver.DesiredCapabilities.HTMLUNIT)
    driver.get('http://www.someserver.com/toplevelurl/somepage.htm')
    assert 'Page Title' in driver.title
    username = driver.find_element_by_name('name_of_userid_box')
    username.send_keys(user)
    password = driver.find_element_by_name('name_of_password_box')
    password.send_keys(passwd)
    submit = driver.find_element_by_name('name_of_login_button')
    submit.click()
    driver.get('http://www.someserver.com/toplevelurl/page_with_download_button.htm')
    assert 'page_with_download_button title' in driver.title
    download = driver.find_element_by_name('download_button')
    download.click()
except :

    print('process failed')

我是 python 新手,所以这可能不是每个编写的最好的代码,但它应该给你一个大致的想法。

希望能帮助到你

于 2013-08-14T12:17:35.267 回答