Сканер Python для получения информации о DOM с помощью Selenium и PhantomJS
Я использовал Selenium и PhantomJS в надежде получить данные с веб-сайта, который использует Javascript для построения DOM.
Простой код ниже работает, но он не всегда действителен. Я имел в виду, что большую часть времени он будет возвращать пустой веб-сайт, который не выполняет JavaScript. Это может редко получить правильную информацию, которую я хочу.
from selenium import webdriver
from bs4 import BeautifulSoup
url = 'http://mall.pchome.com.tw/prod/QAAO6V-A9006XI59'
driver = webdriver.PhantomJS
driver.get(url)
print(driver.page_source, file=open('output.html','w'))
soup = BeautifulSoup(driver.page_source,"html5lib")
print(soup.select('#MetaDescription'))
Вероятность возврата пустой строки высока:
[<meta content="" id="MetaDescription" name="description"/>]
Сервер веб-сайта не позволяет сканерам веб-страниц? Что я могу сделать, чтобы исправить мой код?
Более того, вся необходимая информация может быть найдена в <head>
"s <meta>
тег.
(Как показано выше, данные имеют идентификатор MetaDescription
)
Или есть какой-то более простой способ просто получить данные в <head>
тег?
1 ответ
Прежде всего, driver = webdriver.PhantomJS
неправильный способ инициализации веб-драйвера Selen в Python, замените его следующим:
driver = webdriver.PhantomJS()
Симптомы, которые вы описываете, аналогичны тем, когда у вас возникают проблемы со временем. Добавьте ожидание ожидания появления желаемого элемента (элементов), прежде чем пытаться получить источник страницы:
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
driver = webdriver.PhantomJS()
driver.get(url)
# waiting for presence of an element
wait = WebDriverWait(driver, 10)
wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, "#MetaDescription")))
print(driver.page_source, file=open('output.html','w'))
driver.close()
# further HTML parsing here
Вам также может понадобиться игнорировать ошибки SSL и установить протокол SSL наany
, В некоторых случаях, притворство не быть PhantomJS также помогает.