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

标签 python json selenium selenium-webdriver web-scraping

下面我设置了一个脚本,它只在网站上执行搜索。目标是使用 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()

enter image description here

最佳答案

您需要使用代理,我的建议是使用 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。

有用的引用是:

关于python - 使用 Selenium 从中间事件中捕获 JSON 数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55763869/

相关文章:

python - 如何在 Django 1.7 模型中创建键值数据类型

python - 如何在Python中使用selenium获取iframe中包含的内部html文档?

Python selenium 保持浏览器打开

javascript - AngularJS 从 ng-repeat 创建 json

android - Cordova/Phonegap/Ionic App - 远程图像的本地存储

javascript - AJAX 数据未传入 PHP

python - 如何访问 selenium Web 驱动程序中没有 name 属性的 div 按钮?

python - 模拟 Ctrl-C 到 python 脚本

python - 除了 OSError 为 (errcode , message) : SyntaxError: invalid syntax

python - 这个查询如何按关键字匹配的数量排序?