【问题标题】:Webscraping an internal site that requires authentication w/ Javascript alertWeb 抓取需要使用/Javascript 警报进行身份验证的内部站点
【发布时间】:2018-07-15 11:03:32
【问题描述】:

我一直在尝试从公司内部网站上抓取一些原始 XML 数据(出于安全目的,URL 被排除在外)。我目前正在使用 selenium 和 beautifulsoup 这样做(但我对任何其他选择持开放态度)。手动访问该站点时,系统会提示我输入用户名和密码的 javascript 浏览器警报(见图)。我尝试自动验证凭据如下(未通过身份验证):

def main():
    #gets specified list of direct reports
    # username:password@
    url ="http://{username}:{password}@myURL.com"
    driver.get(url)
    html = driver.page_source
    soup = BeautifulSoup(html, "lxml")
    # parsing logic follows ... 

但是,当脚本运行时,我仍然需要在 chromedriver 控制的浏览窗口中手动输入用户名和密码,然后程序的其余部分按预期运行..

有没有办法避免这种手动输入?我还尝试了有关 driver.alert 和向浏览器发送密钥和凭据的解决方案,但无济于事..(我知道这可能很困难,因为该站点无法在网络之外访问,感谢任何见解!)

编辑:我应该提一下这个方法在几周前还有效,但在 chrome 更新之后不再有效..

【问题讨论】:

  • 如果换个角度解决问题呢?为什么要抓取内部站点?难道不能从信息源的其他地方获取数据吗?
  • 我希望 :P 不幸的是,我们正处于时间紧缩状态,无法访问 API……这里的某些事情变得比应有的更加困难..
  • 要么使用外部工具,如 autoit(如果是 windows),要么使用代理注入凭据,或使用扩展程序设置凭据,或启动已设置凭据的 chrome 配置文件,或执行 @987654322 @在页面中设置凭据。

标签: javascript python selenium authentication beautifulsoup


【解决方案1】:

您的登录过程可能会返回某种访问令牌,要么是响应正文中的值,要么是带有令牌的标头,可能是 Authorization 标头或 Set-Cookie 标头。

在大多数情况下,您需要在每个请求中发送该令牌,作为授权标头、正文参数或页面期望的任何内容。

您的工作是通过在您进行身份验证时检查来自服务器的响应来找到该令牌,将其存储在某处,并在您每次向服务器发出页面请求时将其发回。

如何将其发回取决于相关服务器的要求。它可能需要请求正文参数或标头,这是最可能的两种情况。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-09
    • 1970-01-01
    相关资源
    最近更新 更多