使用 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 流分析
Firebase inAppMessaging 事件未被捕获
Selenium2+python自动化57-捕获异常(NoSuchElementException)