使用请求登录具有javascript登录表单

时间:2015-06-19 20:00:25

标签: javascript python ajax post python-requests

让我先说我的编程经验很少。我在最近几天学会了一大堆试图编写这个程序的人。我使用PyCharm,请求,Beautiful Soup和lxml在Windows 7上运行Python 2.7。

我正在尝试从一个严重依赖Javascript的网站上抓取数据。我有两个选择:

1)我需要的数据是通过Javascript填充的,不一定需要登录。但是我无法弄清楚如何获取这些数据。我使用实时HTTP Headers chrome插件生活受监控的标头,我想我已经找到了可以实现此功能的Javascript但我无法理解它。它是一长串代码,如果有人有兴趣看看,我会发布它。

2)在其中一个主要页面上,我找到了一系列身份证号码,我可以用它来为我正在分析的每个项目生成URL。问题是我必须登录才能看到这些单独的项目页面。我的代码如下:

from requests.adapters import HTTPAdapter
from requests.packages.urllib3.poolmanager import PoolManager
from BeautifulSoup import BeautifulSoup
import ssl

# Request a date from user
UDate = "06/22/2015"  # raw_input('Enter a date mm/dd/yyyy\n')

# Open TLSv1 Adapter (Whataver that means)
class MyAdapter(HTTPAdapter):
    def init_poolmanager(self, connections, maxsize, block=False):
        self.poolmanager = PoolManager(num_pools=connections,
                                       maxsize=maxsize,
                                       block=block,
                                       ssl_version=ssl.PROTOCOL_TLSv1)

# Begin a requests session. Every get from here on out will use TLSv1 Protocol
import requests

payload = {
    'LogName': 'xxxxxxxx',
    'LogPass': 'xxxxxxxx'
}

s = requests.Session()
s.mount('https://xxxx.xxx', MyAdapter())

# Login with post and Request source code from main page.
log = s.post('LoginURL', data=payload)
print log.text

result = s.get(url)
soup = BeautifulSoup(result.content)
print soup

帖子或get都没有显示我登录的网站。 HTML源代码中的logform标识如下所示:

<div id="DivLogForm">
        <label for="BadText"><div id="BadText" class="BadText" style="display:none" tabindex="-2">User Name or Password is Invalid</div></label>

        <div class="LogLabel">
            <label for="LogName" > User Name&nbsp;&nbsp;</label><input tabindex="0" id="LogName" class="LogInput" value="" />
        </div>
        <div  class="LogLabel">
            <label for="LogPass" >User Password&nbsp;&nbsp;</label><input  tabindex="0"id="LogPass" type="password" class="LogInput" value="" />
        </div>

所以我通过帖子传递LogName和LogPass。

还有一个带有这段代码的logform.js

$("#LogButton").click(function()
        {   //$('#divLogForm').hide();
            //$('#divLoading').show();  

           var uName = $("#LogName").val();
           var uPass = $("#LogPass").val();
           var url = "/index.cfm";
           $.post(url, {ZACTION:'AJAX',ZMETHOD:'LOGIN',func:'LOGIN',USERNAME:uName, USERPASS:uPass}, 
                  function(data){if (data.isOk =="YES"){location.href="/index.cfm";}
                                  else {$('.BadText').show(); $('#BadText').focus();};
                                 },"json");
        });

我的代码中的LoginURL取自此脚本中的var url。我尝试过使用USERNAME&amp; USERPASS和我在我的帖子中尝试了uName和uPass,但这些也没有用。

不知道如何向前迈进。非常感谢任何帮助

1 个答案:

答案 0 :(得分:1)

您发布的最后一点javascript提供了一条关于您的登录POST请求无法正常工作的线索。

根据javascript,您应该使用登录POST发送一个类似于以下内容的字典:

@objc func toggleSideMenu(sender: AnyObject?) {
    toggleSideMenuView()
}