Сканер 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 также помогает.

Другие вопросы по тегам