首先让我说我的编程经验很少。在过去的几天里,我在尝试编写这个程序时学到了很多东西。我在 Windows 7 上使用 PyCharm、requests、Beautiful Soup 和 lxml 运行 Python 2.7。
我正在尝试从一个严重依赖 Javascript 的网站上抓取数据。我有两个选择:
1) 我需要的数据是通过 Javascript 填充的,不一定需要登录。但是我一直无法弄清楚如何获取这些数据。我已经使用实时 HTTP header chrome 插件实时监控 header ,我想我已经找到了它的 Javascript,但我无法弄清楚。它的代码很长,如果有人有兴趣看一下,我会发布它。
或
2) 在一个主要页面上,我发现了一系列 ID 号,我可以使用这些 ID 号为我正在分析的每个项目生成 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 源代码中的日志表单 ID 如下所示:
<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 </label><input tabindex="0" id="LogName" class="LogInput" value="" />
</div>
<div class="LogLabel">
<label for="LogPass" >User Password </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 和 USERPASS,我也尝试过在我的帖子中使用 uName 和 uPass,但这些都不起作用。
不确定如何继续前进。非常感谢任何帮助
最佳答案
您发布的最后一段 javascript 提供了关于为什么您的登录 POST 请求不起作用的线索。
根据 javascript,您应该在登录 POST 中发送如下所示的字典:
{
'ZACTION': 'AJAX',
'ZMETHOD': 'LOGIN',
'func': 'LOGIN',
'USERNAME': '<enter username>',
'USERPASS': '<enter password>'
},
关于javascript - 使用请求登录到具有 javascript 登录表单的网站,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30946370/