使用 Selenium 从中间事件中捕获 JSON 数据

Posted

技术标签:

【中文标题】使用 Selenium 从中间事件中捕获 JSON 数据【英文标题】:Capturing JSON data from intermediate events using Selenium 【发布时间】:2019-09-09 20:15:40 【问题描述】:

下面我设置了一个脚本,它只是在网站上执行搜索。目标是使用 Selenium 从中间脚本触发的事件中捕获 JSON 数据,即对“https://www.botoxcosmetic.com/sc/api/findclinic/FindSpecialists”的 POST 请求,如包含的图像中所示,但不使用 Selenium 或直接向该 URL 发送请求请求图书馆。最好的方法是什么,最好是在 Python 中,但对任何语言都开放?

from selenium import webdriver
base_url = 'https://www.botoxcosmetic.com/women/find-a-botox-cosmetic-specialist'
driver = webdriver.Chrome()
driver.find_element_by_class_name('normalZip').send_keys('10022')
driver.find_element_by_class_name('normalSearch').click()

【问题讨论】:

我认为beautifulsoup 会更有用。 为什么需要使用 Selenium?我觉得你在工作中使用了错误的工具。 不知道this是不是起点? Puppeteer 让它变得简单,但它是 javascript 而不是 Python。 您可以注入 javascript 并覆盖 xhr 方法 see there 【参考方案1】:

您需要使用代理,我的建议是使用 BrowserMob 代理。

首先安装 BrowserMob 代理库:

pip install browsermob-proxy

然后,您需要下载latest release(撰写本文时为 2.1.4),解压缩,然后将其放在您的项目目录中。这将是您在设置 BrowserMob 代理服务器时需要传入的位置(请参见下面定义 Server("browsermob-proxy-2.1.4/bin/browsermob-proxy") 的位置)

然后我将您的脚本更新为以下内容:

import json

from browsermobproxy import Server
from haralyzer import HarParser
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait

base_url = 'https://www.botoxcosmetic.com'
server = Server("browsermob-proxy-2.1.4/bin/browsermob-proxy")
server.start()
proxy = server.create_proxy()

chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument("--proxy-server=0".format(proxy.proxy))

driver = webdriver.Chrome(options=chrome_options)
driver.get("0/women/find-a-botox-cosmetic-specialist".format(base_url))

proxy.new_har(options="captureContent": "true")
driver.find_element_by_class_name('normalZip').send_keys('10022')
driver.find_element_by_class_name('normalSearch').click()

WebDriverWait(driver, 15).until(EC.presence_of_element_located((By.CSS_SELECTOR, "#specialist-results > div")))

har_parser = HarParser(proxy.har)
for entry in har_parser.har_data["entries"]:
    if entry["request"]["url"] == "0/sc/api/findclinic/FindSpecialists".format(base_url):
        result = json.loads(entry["response"]["content"]["text"])

driver.quit()
server.stop()

这将启动 BrowserMob 代理实例并捕获FindSpecialists 网络调用的响应并将其作为 JSON 存储在结果变量中。

然后,您可以使用它来对响应执行任何您想做的事情。抱歉,如果代码没有您期望的那么干净,我不是本地 Pythonista。

有用的参考资料是:

BrowserMob 代理 website BroswerMob 代理 source code on Github 用于 BrowserMob 代理的 Python documentation 哈雷仪website Chrome 驱动程序website

【讨论】:

如果您可以更新您的代码以回答问题中所述的具体示例,我可以接受您的回答 更新了您问题的详细解决方案 谢谢。对于尝试类似事情的其他人来说,这是一个很好的答案和很好的参考

以上是关于使用 Selenium 从中间事件中捕获 JSON 数据的主要内容,如果未能解决你的问题,请参考以下文章

如何捕获来自事件中心的错误 json 记录到 azure 流分析

jQuery slideToggle(从中间点切换)

Firebase inAppMessaging 事件未被捕获

Selenium2+python自动化57-捕获异常(NoSuchElementException)

Selenium2+python自动化57-捕获异常(NoSuchElementException)转载

捕获 XHR 的 404 错误