【问题标题】:Selenium, phantomJS and Geb headless scrapingSelenium、phantomJS 和 Geb 无头抓取
【发布时间】:2016-09-23 11:22:26
【问题描述】:

我需要每周从网站上抓取数据。只有点击页面后数据才可见(调用js函数)。数据加载到一个表中(可以通过 id 找到)。此脚本将在没有浏览器支持的服务器上运行。 这是我的 geb 代码:

    @Grab("org.gebish:geb-core:0.13.1")
    @Grab("org.seleniumhq.selenium:selenium-firefox-driver:2.52.0")
    @Grab("org.seleniumhq.selenium:selenium-support:2.52.0")
    @GrabExclude('org.codehaus.groovy:groovy-all')  

    import geb.Browser

Browser.drive{
    // driver.webClient.javaScriptEnabled = true
    go "mysite"
    js.loadWeekData()
   println $("div.data-listing").text()
    }

我已经在这个主题上进行了很多搜索,但没有任何东西可以在 js 支持下进行无头抓取。 这是来自 Selenium IDE 的记录:

driver.findElement(By.linkText("Next")).click();

我无法让 phantomJS 与 geb 一起使用。

编辑 1 这是幻影js的错误: java.lang.NoClassDefFoundError: org/openqa/selenium/browserlaunchers/Proxies 我已阅读有关版本问题的信息,但无法解决。

@Grab("org.gebish:geb-core:0.13.1")
@Grab("org.seleniumhq.selenium:selenium-firefox-driver:2.52.0")
@Grab("org.seleniumhq.selenium:selenium-support:2.52.0")
@Grab("com.codeborne:phantomjsdriver:1.3.0")
WebDriver driver = new PhantomJSDriver();

        // Load Google.com
        driver.get("http://www.google.com");
        // Locate the Search field on the Google page
        WebElement element = driver.findElement(By.name("q"));

简而言之,我需要在无头模式下执行第一个脚本(如果可能,无需安装 Xvfb)。最好是 groovy 或 java 解决方案。

【问题讨论】:

  • 自从我得到解决方案后,有人可以关闭或标记为已回答吗?

标签: javascript selenium web-scraping phantomjs geb


【解决方案1】:

最后我将使用 HTMLUNIT 和这样的代码:

此代码需要一些清理,但总的来说可以正常工作。 HTMLUNIT 的主要问题 - 警告和错误通过记录停止设置来解决。

@Grab(group='net.sourceforge.htmlunit', module='htmlunit', version='2.21')

import com.gargoylesoftware.htmlunit.AlertHandler;
import com.gargoylesoftware.htmlunit.FailingHttpStatusCodeException;
import com.gargoylesoftware.htmlunit.Page;
import com.gargoylesoftware.htmlunit.WebClient;
import com.gargoylesoftware.htmlunit.html.HtmlButton;
import com.gargoylesoftware.htmlunit.html.HtmlPage;
import java.util.logging.Level;

java.util.logging.Logger.getLogger("com.gargoylesoftware").setLevel(Level.OFF);

WebClient webClient = new WebClient();
      webClient.waitForBackgroundJavaScriptStartingBefore(10000);
        HtmlPage currentPage = webClient.getPage("mysite");
       /* HtmlButton button = (HtmlButton) currentPage.getElementById("tomorrow");
        button.click();*/

        //String javaScriptCode = "loadTomorrowTrain();";
        String javaScriptCode = "loadYesterdayTrain();";


def result = currentPage.executeJavaScript(javaScriptCode);
//def result = page.executeJavaScript(javaScriptCode);
      webClient.waitForBackgroundJavaScriptStartingBefore(10000);
println result.getJavaScriptResult();
println "result: "+ result

def newpage = result.getNewPage()
def table = result.getNewPage().getElementById("training-days");
println table
def spans = currentPage.getByXPath( "//div[@training-days]");
println spans
def spans1 = newpage.getByXPath("//div[@class='training-days']//a");
println spans1
def spans2 = currentPage.getByXPath("//div[@class='training-days']//a");
println spans2
def spans3 = currentPage.getByXPath("//table[@id='training']");
println spans3

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-06-17
    • 2020-09-04
    • 2017-05-12
    • 2017-06-09
    • 1970-01-01
    • 2017-07-16
    • 1970-01-01
    • 2017-01-24
    相关资源
    最近更新 更多