【问题标题】:Using BeautifulSoup for pages behind 2 factor auth将 BeautifulSoup 用于 2 因子身份验证后的页面
【发布时间】:2020-09-06 02:52:27
【问题描述】:

我正在为一个公司项目抓取一些数据,但所有这些数据都落后于我公司实施的 2 因素。 2 因素身份验证要求我从我的手机/硬件令牌中输入一个持续 6 秒的代码。由于各种原因,无法禁用此 2 因素。

有什么方法可以抓取这些信息吗?如果我现在运行它,BS 只会返回登录页面(在进入 2 因素页面之前我必须输入用户名/密码)。

如果需要,我也可以手动输入 2 因子信息(尽管这必须每 12 小时重复一次,所以这种方法不是首选)。但是,我什至无法找到成功,因为 BeautifulSoup 不会从预先登录的浏览器中读取,并且 2 因素身份验证代码每 6 秒左右和每次登录都会更改(需要转到多个不同的页面,所以这基本上与手动将每个页面保存为 html 一样可行)。

【问题讨论】:

  • 在将网页传递给 BS 之前,您使用什么下载网页?您不能只使用普通浏览器登录,然后复制这些 cookie 并将它们与每个 http 请求一起发送吗?显然,您需要确保 User-Agent 和其他标头相同。
  • @GordonAitchJay 我将进入 Firefox 并将页面保存为 HTML。您将如何确定要传递哪些 cookie?有大量的 cookie,我不确定如何评估哪个与 Duo 2-factor-auth 相关联。我想我传入了 cookie like this?
  • 您想使用Firefox's Network Monitor 查看发生了哪些 http 请求以及设置了哪些 cookie。是的,您可以这样设置 cookie。我个人会使用requests.Session,并在开始时更新会话的cookie。我很确定如果你只是复制所有你不需要担心找到一个专门用于身份验证的 cookie。
  • @GordonAitchJay 这似乎在起作用,因为它超过了 2 因素(我不重定向到登录页面)。但是,当我准确地复制 cookie 并将它们传递给 like this 时,我得到一个 <Response [422]>。我想我必须通过headers。如果我传入所有的headers(包括cookie,方法同上),我仍然得到<Response [422]>。但是,如果我在浏览器中重新发送此信息,我会收到一个很好的 200 作为包含所有数据的响应。我不知道如何继续。
  • 您似乎没有正确复制 Firefox 发出的 http 请求。使用您尝试过的代码更新您的问题,并使用您想要复制的 http 请求的 Firefox 网络监视器的屏幕截图。

标签: python web-scraping beautifulsoup two-factor-authentication


【解决方案1】:

正如评论者所指出的,这取决于您的网站如何设置和检查登录状态。除了您链接的答案中的方法之外,您还应该尝试以下选项:

# using a session, and the cookies argument
s = requests.Session()
r = s.get('https://someurl', cookies={'somecookie': 'somecookievalue'})

# using a session, and http headers
s = requests.Session()
r = s.get('https://someurl', headers={'somekey': 'somevalue'})

在上述两种情况下,cookie 都是一个键值对,表示为 python 字典。多个 cookie 可以作为多个键/值对传递。在某些情况下,必须直接传递身份验证凭据,如下所示:

s = requests.Session()
s.auth = ('user', 'pass')
s.get('https://someurl')

最后,可能需要将其中的两个或多个组合在一起。没有您的代码或有关该网站的更多信息,很难说更多。我希望这一切都会有所帮助。

【讨论】:

    猜你喜欢
    • 2015-11-16
    • 1970-01-01
    • 2011-03-19
    • 2011-05-02
    • 1970-01-01
    • 2016-02-24
    • 1970-01-01
    • 2021-09-08
    • 1970-01-01
    相关资源
    最近更新 更多