Сбор данных JSON из промежуточных событий с использованием Selenium - PullRequest
5 голосов
/ 19 апреля 2019

Ниже я установил скрипт, который просто выполняет поиск по сайту.Цель состоит в том, чтобы захватить данные JSON с использованием Selenium из события, которое запускается из промежуточного сценария, а именно из запроса POST к "https://www.botoxcosmetic.com/sc/api/findclinic/FindSpecialists", как видно на включенном изображении, но без прямой отправки запроса на этот URL с помощью Selenium.или библиотека запросов. Каков наилучший способ сделать это, желательно на 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

1 Ответ

1 голос
/ 26 апреля 2019

Вам потребуется использовать прокси-сервер, я предлагаю использовать прокси-сервер BrowserMob.

Прежде всего установите библиотеки прокси-сервера BrowserMob:

pip install browsermob-proxy

Затем вам потребуетсяскачайте последний выпуск (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.

Полезные ссылки:

...