使用python访问在线Web表单

时间:2014-04-12 08:50:59

标签: python python-3.x httplib

我正在尝试访问需要登录信息的网站。为了练习我尝试进入Hotmail只是为了看它是否会起作用。我不知道这段代码是否正确。通过反复试验,我得到了代码"运行",但它还没有工作......有人可以帮助我吗?

谢谢, 布兰登

    Python 3.4.0 (v3.4.0:04f714765c13, Mar 16 2014, 19:25:23) [MSC v.1600 64 bit (AMD64)] on win32
Type "copyright", "credits" or "license()" for more information.



import urllib.request
import webbrowser

url = 'http://hotmail.com'
data = urllib.parse.urlencode({'idDiv_PWD_UsernameExample' : 'email','idDiv_PWD_PasswordExample' : 'password'})
binary_data = data.encode('utf8')
results = urllib.request.urlopen(url, binary_data)
html = results.geturl()
print (html)

1 个答案:

答案 0 :(得分:0)

一般注意事项

在整个登录过程中可能会使用

Cookie 。然后可能需要执行以下步骤:

  1. 加载登录页面以获取初始cookie。
  2. 再次加载登录页面,从步骤1发送登录数据和cookie。
  3. 成功登录后关注重定向。
  4. 但是感谢"包括电池",它并不那么难,我只是尝试了下面的例子与Horde群件:

    import urllib.request
    import http.cookiejar
    import urllib.parse
    
    cookiejar = http.cookiejar.CookieJar()
    
    loginpage = "https://example.com/login.php"
    
    opener = urllib.request.build_opener(urllib.request.HTTPCookieProcessor(cookiejar))
    
    data = {'user': 'username', 'pw': 'password'}   # + what else might be required
    
    binData = urllib.parse.urlencode(data).encode('utf-8')
    
    result = opener.open(loginpage)  # without credentials, to get cookie
    
    result.read()
    
    for c in cookiejar:    # just debugging to see if we got a cookie
      print(c)
    
    
    result = opener.open(loginpage, binData)   # now send the crendentials
    
    page = result.read().decode()              # read() will read after redirects!
    
    f = open("out.html", "w")                  # store output in a file
    f.write(page)                              # if everything worked, this should look
    f.close()                                  # like the landing page
    

    请注意,大多数网站都需要 Javascript ,而Python无法处理。我建议您在浏览器中禁用Javascript,清除您尝试访问的站点中的所有cookie,然后使用Firebug仔细查看该过程并查看哪些信息(Cookie,GET / POST参数,重定向等) 。)被传递以进行登录过程。然后你可以尝试使用python重新创建它。

    特定于Hotmail

    Hotmail.com似乎是使用登录表单的次优起点。如果您查看源代码(如果您使用Firefox,我强烈建议Firebug),您可以看到&#34;真实&#34;输入字段不是您似乎尝试使用的<div>,而是这一个:

    <input type="email" lang="en" name="login" id="i0116" maxlength="113"
     class="ltr_override" aria-labelledby="idLbl_PWD_Username">
    

    ,密码包含在这个

    <input type="password" name="passwd" id="i0118" autocomplete="off"
     aria-labelledby="idDiv_PWD_PasswordExample">
    

    如果您在输入字段中输入虚拟(或真实)信息并尝试登录,您可以在Firebug&#34; Network&#34;标签,发送更多信息:

    LoginOptions    3
    NewUser 1
    PPFT    {very long encoded string}
    PPSX    Pas
    i1  0
    i12 1
    i13 0
    i14 226
    i15 2270
    i17 0
    i18 __Login_Strings|1,__Login_Core|1,
    i2  1
    i3  92877
    i4  0
    i7  0
    idsbho  1
    login   username123@example.com
    passwd  password456
    sso 0
    type    11
    

    loginpassword可能已足够,但由于我没有Hotmail帐户,因此我无法进行进一步测试。你使用urllib.request的一般方法似乎没问题(除了geturl完全相同,它得到一个URL,所以你应该将变量html重命名为更好的东西)。