#python #selenium #web-scraping
#python #selenium #веб-очистка
Вопрос:
Я использую Python и Selenium для очистки веб-сайта. Что я делаю, так это перехожу на домашнюю страницу, вводю ключевое слово, например 1300746-79-5. На результирующей странице я пытаюсь очистить данные в разделе «цены». В частности, мне нужно получить информацию о «размере SKU-Pack» и «Цене (USD)». Но эта информация зашифрована в Javascript, поэтому я не вижу их в исходном коде. Мне интересно, как я могу этого добиться.
Я написал некоторый код, который приводит меня на интересующую страницу, но я все еще не вижу информацию javascript. Вот что у меня есть до сих пор.
from selenium import webdriver
from selenium.common.exceptions import TimeoutException
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import pprint
# Create a new instance of the Firefox driver
driver = webdriver.Chrome('C:UsersReiDesktopchromedriver.exe')
driver.get("http://www.sigmaaldrich.com/united-states.html")
print driver.title
inputElement = driver.find_element_by_name("Query")
# type in the search
inputElement.send_keys("1300746-79-5")
inputElement.submit()
Ответ №1:
Все, что вы сделали, выглядит правильным для меня.
Информация о «размере SKU-Pack» и «Цене (USD)» не «зашифровывается», а извлекается после нажатия JavaScript. действие. Все, что вам нужно сделать, это нажать на название продукта или ссылку с ценами.
from selenium import webdriver
from selenium.common.exceptions import TimeoutException
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import pprint
driver = webdriver.Chrome()
driver.get("http://www.sigmaaldrich.com/united-states.html")
print driver.title
inputElement = driver.find_element_by_name("Query")
# type in the search
inputElement.send_keys("1300746-79-5")
inputElement.submit()
pricing_link = driver.find_element_by_css_selector("li.priceValue a")
print pricing_link.text
pricing_link.click()
# then deal with the data you want
price_table = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.CSS_SELECTOR, ".priceAvailContainer tbody"))
)
print 'price_table.text: ' price_table.text
driver.quit()
Комментарии:
1. Можете ли вы объяснить, что я должен делать после выполнения действия нажатия javascript? Я все еще не вижу информацию о артикуле и ценах в исходном коде… Я подумываю об использовании beautifulsoup для извлечения определенных элементов. Но мой код не возвращает URL-адрес продукта, поэтому я ничего не понимаю.
2. @user3788728: Хм. Похоже, что-то не так. Можете ли вы увидеть это в пользовательском интерфейсе (своими глазами)? Какие у вас версии Selenium, Chrome, ChromeDriver?
3. моя версия Chrome — 35.0.1916.153, ChromeDriver — 2.9. Я загрузил selenium сегодня утром, поэтому это должна быть самая последняя версия.
4. Я могу это увидеть, если выделю раздел и выберу элемент просмотра. Но если я просто перейду в исходный код страницы, они не отображаются
5. @user3788728: Здесь все работает нормально. Я опубликую полный код выше. У меня не возникает никаких проблем с получением данных. Источник страницы может иметь некоторые ограничения в отношении вызовов AJAX. Какие-либо конкретные причины, по которым вы заботитесь об источнике страницы в первую очередь?