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

问题描述 投票:5回答:1

下面我设置了一个脚本,它只是在网站上执行搜索。目标是从中间脚本触发的事件中利用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

python json selenium selenium-webdriver web-scraping
1个回答
1
投票

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

首先安装BrowserMob Proxy库:

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 Proxy实例并捕获FindSpecialists网络调用的响应,并将其作为JSON存储在结果变量中。

然后,您可以使用它来执行您想要对响应执行的任何操作。如果代码不像你期望的那样干净,我很抱歉,我不是一个原生的Pythonista。

有用的参考是:

© www.soinside.com 2019 - 2024. All rights reserved.