0

前体:我昨天在这里问了一个类似的问题。我不编辑该问题的原因是,尽管两者相似,但这个问题要先进得多。

我的项目:我想使用 Python 登录到一个安全网站,导航到该会话中的多个页面并将这些页面中的文本提取到一个文件中。

详细信息:这是我收集的所有信息/我编写的代码。

以下是安全站点登录页面中值得注意的部分:

<form action="index.asp" method="post" name="form">
   <input type="text" id="user" name="user"">
   <input type="password" name="password">
   <input type="hidden" name="logon" value="username">
   <input type="submit" name="submit" value="Log In" class="button">
</form>

页面上还有 javascript 代码检查 cookie,所以我知道我需要cookielib.CookieJar().

大编辑

我正在导入以下模块:urlliburllib2和.cookielibnltk

生成以下代码:

cookiejar = cookielib.CookieJar()

# Notice I set 'debug' to 'true'.
debug = True
handlers = [
                urllib2.HTTPHandler(debuglevel=debug),
                urllib2.HTTPSHandler(debuglevel=debug),
                urllib2.HTTPCookieProcessor(cookiejar),
           ]
opener = urllib2.build_opener(*handlers)
# These headers I copied directly from Chrome's Developer Tools
opener.addheaders = [
    ("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"),
    ("Accept-Encoding", "gzip,deflate,sdch"),
    ("Accept-Language", "en-US,en;q=0.8"),
    ("Cache-Control", "max-age=0"),
    ("Connection", "keep-alive"),
    ("Content-Type", "application/x-www-form-urlencoded"),
    ("Host", "www.myebill.com"),
    ("Origin", "https://www.myebill.com"),
    ("Referer", "https://www.myebill.com/index.asp?startnam"),
    ("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.95 Safari/537.36")
                    ]
urllib2.install_opener(opener)

# Passing the form data as a URL-encoded string
payload = "user=<User>&password=<Password>&logon=username&submit=Log+In"

req = urllib2.Request("https://www.myebill.com/index.asp", data=payload)
cookiejar.add_cookie_header(req)
page = urllib2.urlopen(req)
pdata = page.read()

print( nltk.clean_html( pdata ) )

注意:如果您希望我发布调试输出,请询问。:)

我的问题:运行我的代码后,我仍然收到“您的会话已超时或您未正确登录”。信息。

请帮忙?我尝试学习机械化,但似乎我能在网上找到的唯一文档令人费解且令人困惑。任何建议或代码将不胜感激。

另外,当我找到答案时,我承诺将我的完整代码作为编辑发布给任何需要它作为参考的人!(省略登录信息,当然..)

4

2 回答 2

1

感谢所有帮助人员,但我终于使用 Python 的模块解决了这个问题Requests

这是代码:

import nltk
from requests import session

payload = {
    'user': '<Username>',
    'password': '<Password>',
    'logon': 'username',
    'submit': 'Log In'
}

headers = {
    'Referer': 'https://www.myebill.com/index.asp?startnam',
    'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.95 Safari/537.36'
    }

with session() as c:
    c.post('https://www.myebill.com/index.asp?startnam', data=payload, headers=headers)
    request = c.get('https://www.myebill.com/index.asp')
    print request.headers
    print( nltk.clean_html( request.text ) )

对于将使用此代码的任何人,只需记住使用您选择的程序(例如 Wireshark、Chrome 开发者工具、Firefox Firebug 等)监控您的登录会话,并用您会话中的数据替换“有效负载”字典。

再次感谢您的帮助!也许有一天我会更多地研究urllibandurllib2方法,但如果Requests用更短、更简单的代码执行相同的操作......是的!

于 2013-08-09T17:54:49.187 回答
1

我将尝试对此进行尝试。首先,根据发布的 HTML 表单代码片段,表单对 GET URL 执行 POST 操作https://www.myebill.com/index.asp?nam。您可能需要再次确认这是您确实想要发布到的 URL。

话虽如此,urllib2 已经支持 HTTPSHandler。这里有关于如何通过使用 Python 访问 Web 服务的相关 Stack Overflow 讨论。虽然,这与查询没有直接关系——这个问题的答案包含很好的指示,当我们尝试通过程序使用 HTTPS 登录时应该注意什么。更具体地说,它是标头中Referer标签的设置。这是必要的,因为安全网站使用这种机制来保护自己免受 CSRF 攻击。

下面的代码片段显示了您在发出请求之前需要进行的最重要的设置。我从Nullege Python for Simple Dropbox Login得到这个

handlers = [
                urllib2.HTTPHandler(debuglevel=debug),
                urllib2.HTTPSHandler(debuglevel=debug),
                urllib2.HTTPCookieProcessor(cookiejar),
            ]
opener = urllib2.build_opener(*handlers)
urllib2.install_opener(opener)   #the opener will be used for all urlopen requests from now on.

注意 HTTPSHandler 的使用。

然后填写身份验证信息:

payload = urllib.urlencode({'username' : username, 'j_password' : password})

然后执行登录:

headers['Referer'] = self.urlbase #note the presence of the "Referer' header
req = urllib2.Request(url=self.urlbase+'login', data=data, headers=headers)
cookiejar.add_cookie_header(req)
page = urllib2.urlopen(req)
pdata = page.read()

我希望这能给你一个关于如何去做的想法。

于 2013-08-09T16:02:40.637 回答