我正在使用python,selenium和Firefox网络驱动程序来抓取网页几页。其中一个页面涉及执行java脚本以模拟单击按钮,其中onclick操作将HTML表更改为原始csv。
我正在尝试让我的web-scraper使用xvfb和xvfbwrapper在docker容器中无头地运行。我已经设法获取selenium来抓取不涉及java脚本的网页但是那些(如上所述)失败的网页。
以下是我的web-scraping类的代码的相关部分,它在docker容器中运行无头Firefox Web驱动程序时失败,但在Docker容器外使用普通Firefox驱动程序时可以正常工作。
def getFirefoxBrowser(self):
firefox_profile = webdriver.FirefoxProfile()
firefox_capabilities = webdriver.DesiredCapabilities.FIREFOX
firefox_capabilities['marionette'] = True
driver = webdriver.Firefox(firefox_profile = firefox_profile, capabilities=firefox_capabilities)
driver.wait = WebDriverWait(driver, 10)
driver.set_page_load_timeout(30)
return driver
def getCsv(self,url,browser):
browser.get(url)
if waitfor != None:
element = WebDriverWait(browser, 10).until(
EC.presence_of_element_located((By.ID, waitfor))
)
browser.execute_script('vjs_removeChild(arguments[0].concat("_clone")), table2csv(arguments[0]), sr_record_analytics_event("CSV", sr_record_directory(), arguments[0])',javascriptElement)
rawCsv = browser.find_element_by_xpath(".//*[@id='csv_" + javascriptElement + "']").get_attribute('innerHTML')
return rawCsv
from xvfbwrapper import Xvfb
vdisplay = Xvfb(width=1280, height=740, colordepth=16)
vdisplay.start()
browser = self.getFirefoxBrowser()
csv = getCsv("http://www.pro-football-reference.com/boxscores/201509100nwe.htm",browser)
vdisplay.stop()
失败的行在getCsv()
中browser.execute_script('vjs_removeChild(arguments[0].concat("_clone")), table2csv(arguments[0]), sr_record_analytics_event("CSV", sr_record_directory(), arguments[0])',javascriptElement)
我收到此错误消息:
selenium.common.exceptions.WebDriverException: Message: ReferenceError: vjs_removeChild is not defined
让我重申一下:这个错误只发生在我尝试在没有头部的docker里面运行时。当我运行这个代码像“正常”(一个完整的Firefox浏览器窗口出现,我不使用Xvfb或vdisplay代码行)我没有收到错误消息,网络抓取成功。
编辑: 我应该提一下我在网页的源代码中“没有定义”的javascript代码。