【问题标题】:Python - Manipulate and read browser from current browserPython - 从当前浏览器操作和读取浏览器
【发布时间】:2018-03-22 06:26:32
【问题描述】:

我正在努力在 python 中找到一种方法,该方法允许您在当前使用的网络浏览器中读取数据。实际上,我正在尝试在本地控制的公司网页上下载大量数据帧并将其实施到数据帧中。问题是该网站有一个相当复杂的身份验证令牌过程,我无法通过 Selenium 使用大量的 webdrivers、Requests、urllib 和 cookielib 以及各种用户参数来绕过它。我已经完全放弃了这方面的工作,因为我几乎可以肯定,身份验证过程比使用这些库可以轻松实现的更多。

但是,当我快速测试在已使用WebBrowser 登录的当前浏览器中打开一个新选项卡时,我确实设法绕过了所需的标记化过程。传统上,WebBrowser 不提供读取功能,这意味着即使页面可以打开,页面上的数据也无法读入 pandas 数据帧。这让我想到我可以使用 Win32com,打开浏览器,登录,然后运行脚本的其余部分,但同样,Internet Explorer 的调度没有一般的阅读能力,这意味着我无法将我想要的信息发送给 pandas .我难住了。有任何想法吗?

我可以获得必要的身份验证令牌脚本,但我确信这需要一两个星期才能在这方面发生任何事情。在等待公司的实际身份验证脚本的同时,我显然更愿意得到一些东西。

更新:我从公司收到了身份验证令牌,但是它需要在我也无权访问的另一台服务器上使用 python 包,主要是因为我在我的部门使用 Python 很奇怪。因此,上述内容仍然适用 - 需要一种读取和操作打开浏览器的方法。

【问题讨论】:

  • Selenium 可以与您桌面上现有的浏览器窗口一起使用,您可以再试一次。
  • 如果我理解上述权利,则决定永远不会合并上述所需功能。 cmets中有一些解决该问题的方法,但都是其他编程语言。
  • 真的有必要附加到正在运行的浏览器吗?您可以使用 selenium 启动浏览器,然后手动进行身份验证(您的脚本可以等待登录后出现的页面),一旦登录完成,脚本将打开并读取您需要的页面。
  • 我不确定您在网络流量方面的经验如何,但通常您可以在浏览器和服务器之间进行“中间人”攻击,例如打嗝(portswigger.net/burp)。在获取数据包之前暂停最后一个请求,然后将请求复制到 python 请求中。如果你需要使事情自动化,还有一个 burp python api。但在我写这篇文章的时候,我认为它也相当复杂。 :P

标签: python authentication web-scraping


【解决方案1】:

一步一步

1) 使用 Selenium 启动浏览器。

2) 脚本应该开始等待某个元素通知您已获得所需页面并已登录。

3) 您可以使用这个新的浏览器窗口手动登录页面。

4) 脚本检测到您位于所需页面并已登录。

5) 脚本以您喜欢的方式处理页面。

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

# start webdriver (opens Chrome in new window)
chrome = webdriver.Chrome()

# initialize waiter with maximum 300 seconds to wait.
waiter = WebDriverWait(chrome , 300)

# Will wait for appear of #logout element.
# I assume it shows that you are logged in.
wait.until(EC.presence_of_element_located(By.ID, "logout"))

# Extract data etc.

如果您使用 Chrome 用户的个人资料,可能会更容易。这样您就可以继续之前的会话,因此您无需执行任何登录操作。

options = webdriver.ChromeOptions() 
options.add_argument("user-data-dir=FULL_PATH__TO_PROFILE")
chrome = webdriver.Chrome(chrome_options=options)
chrome.get("https://your_page_here")

【讨论】:

  • 如果可能,请修正我的英语。
猜你喜欢
  • 1970-01-01
  • 2015-08-09
  • 1970-01-01
  • 1970-01-01
  • 2020-06-26
  • 2011-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多