使用Ghost.py

时间:2018-07-27 06:57:34

标签: python web-scraping ghost.py

我正在尝试使用Ghost.py获取受密码保护的网站的HTML内容。

我必须访问的Web服务器具有以下HTML代码(我仅将其剪切为重要部分):

URL:http://192.168.1.60/PAGE.htm

<html>
<head>
<script language="JavaScript">
    function DoHash()
    {
      var psw = document.getElementById('psw_id');
      var hpsw = document.getElementById('hpsw_id');
      var nonce = hpsw.value;
      hpsw.value = MD5(nonce.concat(psw.value));
      psw.value = '';
      return true;
    }
    </script>
</head>
<body>
<form action="PAGE.HTM" name="" method="post" onsubmit="DoHash();">
Access code <input id="psw_id" type="password" maxlength="15" size="20" name="q" value="">
<br>
<input type="submit" value="" name="q" class="w_bok">
<br>
<input id="hpsw_id" type="hidden" name="pA" value="180864D635AD2347">
</form>
</body>
</html>

每次加载页面时,“#hpsw_id”的值都会更改。

在普通浏览器上,输入正确的密码并按Enter或单击“提交”按钮后,您将进入同一页面,但现在显示的是真实内容。

URL:http://192.168.1.60/PAGE.htm

<html>
<head>
<!–– javascript is gone ––>
</head>
<body>
Welcome to PAGE.htm content
</body>
</html>

首先,我尝试进行机械化,但由于我需要JavaScript而失败了。所以现在我正在尝试使用Ghost.py

解决它

到目前为止,我的代码:

import ghost
g = ghost.Ghost()
with g.start(wait_timeout=20) as session:
    page, extra_resources = session.open("http://192.168.1.60/PAGE.htm")
    if page.http_status == 200:
        print("Good!")
        session.evaluate("document.getElementById('psw_id').value='MySecretPassword';")
        session.evaluate("document.getElementsByClassName('w_bok')[0].click();", expect_loading=True)
        print session.content

此代码无法正确加载内容,在控制台中,我得到:

  

回溯(最近一次通话最近):文件“”,第8行,在      文件   “ /usr/local/lib/python2.7/dist-packages/ghost/ghost.py”,第181行,在   包装纸       timeout = kwargs.pop('timeout',None))文件“ /usr/local/lib/python2.7/dist-packages/ghost/ghost.py”,行1196,在   wait_for_page_loaded       “无法加载请求的页面”,超时)文件“ /usr/local/lib/python2.7/dist-packages/ghost/ghost.py”,行1174,在   等待       引发TimeoutError(timeout_message)ghost.ghost.TimeoutError:无法加载请求的页面

两个问题...

1)如何成功登录受密码保护的网站并获得PAGE.htm的真实内容?

2)这个方向是最好的方法吗?还是我完全错过了一些东西,这些东西会使事情更有效地工作?

我正在使用Ubuntu Mate。

1 个答案:

答案 0 :(得分:0)

这不是我正在寻找的答案 ,只是一种变通方法,以使其正常工作(以防将来其他人遇到类似的问题)。

要跳过javascript部分(这阻止了我使用python的请求),我决定在python上(而不是在网络上)执行预期的哈希,并像普通的Web表单一样发送哈希。

因此,JavaScript基本上将隐藏的hpsw_id值和密码连接起来,并从中生成一个md5。

Python现在看起来像这样:

import requests
from hashlib import md5
from re import search

url = "http://192.168.1.60/PAGE.htm"
with requests.Session() as s:
    # Get hpsw_id number from website
    r = s.get(url)
    hpsw_id = search('name="pA" value="([A-Z0-9]*)"', r.text)
    hpsw_id = hpsw_id.group(1)
    # Make hash of ID and password
    m = md5()
    m.update(hpsw_id + 'MySecretPassword')
    pA = m.hexdigest()
    # Post to website to login
    r = s.post(url, data=[('q', ''), ('q', ''), ('pA', pA)])
    print r.content

注意:当我使用Internet浏览器正常登录时,q,q和pA是表单(q =&q =&pA = f08b97e5e3f472fdde4280a9aa408aaa)发送的元素。

但是,如果有人知道我最初的问题的答案,那么如果您在此处发布它,将不胜感激。