使用无头浏览器进行 Android Web Scraping [关闭]

Posted

技术标签:

【中文标题】使用无头浏览器进行 Android Web Scraping [关闭]【英文标题】:Android Web Scraping with a Headless Browser [closed] 【发布时间】:2013-06-28 06:06:28 【问题描述】:

我花了一天时间研究可用于完成以下任务的库:

在后台检索网页的全部内容,而不将结果呈现给视图。 例如,该库应支持在初始 html 加载后触发 ajax 请求以加载一些额外结果数据的页面。 我需要从生成的 html 中抓取 xpath 或 css 选择器形式的元素。 以后我可能还需要导航到下一页(触发事件、提交按钮/链接等)

这是我尝试过但没有成功的方法:

Jsoup:效果很好,但不支持 javascript/ajax(因此它不会加载整页) android 内置 HttpEntity:javascript/ajax 与 jsoup 存在相同问题 HtmlUnit:看起来正是我所需要的,但下班后无法在 Android 上运行(其他用户尝试加载 12MB 以上的 jar 文件失败。我自己加载了完整的源代码并将其仅作为项目库引用发现诸如 Applets 和 java.awt(由 HtmlUnit 使用)之类的东西在 Android 中不存在)。 Rhino - 我觉得这很令人困惑,不知道如何让它在 Android 中运行,即使它是我正在寻找的。​​li> Selenium 驱动程序:看起来它可以工作,但您没有直接的方法以无头方式实现它,因此您不会将实际的 html 显示到视图中。

我真的希望 HtmlUnit 能够工作,因为它似乎最适合我的解决方案。有什么方法或至少我错过了另一个适合我需要的库吗?

我目前使用的是 Android Studio 0.1.7,如果需要可以迁移到 Ellipse。

提前致谢!

【问题讨论】:

似乎没有什么可以用于我的场景。我已经开始为 HTMLUnit 开发一个 Android 端口,并希望很快能有一些工作。一旦我签入任何人都可以下载的 HtmlUnit 分支,我就会在这里发布。希望我能让 HtmlUnit 开发人员参与进来,因为似乎对 Android 端口有很多兴趣。 已经 4 年了,我们还在这里!我也面临同样的问题! 鉴于当前的答案,这应该被改写为不是图书馆请求。然后可以重新打开它。如果您确实改写它,请联系我@Makyen,以便我可以帮助重新打开它。 2020 年有什么推荐的库吗? @toothpick 有很多关于 selenium 被用于使用 JS 功能(在 python 中)进行网络爬取的有前途的帖子,但我还没有让它在 Android Studio 中工作。我很确定 selenium 搭载了本地设备的 webdrivers,这使得使用为 windows 构建的流行 chromedriver 变得困难。我打算试一试这个答案,但令人惊讶的是,在发布 7 年后仍然没有一个好的解决方案。 【参考方案1】:

好的,2 周后我承认失败,并且正在使用目前对我来说非常有用的解决方法。

问题: 将 HTMLUnit 移植到 Android 太难了(或者至少以我的专业水平)。我确信它是一个有价值的项目(对于有经验的 Java 程序员来说并不那么耗时)。我给 HTMLUnit 的人发了电子邮件,他们评论说他们没有研究端口或将涉及什么工作,但建议任何想要开始这样一个项目的人都应该向他们的邮件列表发送消息,以让更多的开发人员参与进来 (@987654321 @)。

解决方法: 我使用 android 内置的 WebView 并覆盖了 Webview 类的 onPageFinished 方法来注入在页面完全加载后抓取所有 html 的 Javascript。 Webview 还可以用于调用更多的 javascript 操作、单击按钮、填写表单等。

代码:

webView.getSettings().setJavaScriptEnabled(true);
MyJavaScriptInterface jInterface = new MyJavaScriptInterface();
webView.addJavascriptInterface(jInterface, "HtmlViewer");

webView.setWebViewClient(new WebViewClient() 

    @Override
    public void onPageFinished(WebView view, String url) 
       //Load HTML
       webView.loadUrl("javascript:window.HtmlViewer.showHTML('<html>'+document.getElementsByTagName('html')[0].innerHTML+'</html>');");
    



webView.loadUrl(StartURL);
ParseHtml(jInterface.html);   

public class MyJavaScriptInterface 

    public String html;

    @JavascriptInterface
    public void showHTML(String _html) 
        html = _html;
    

【讨论】:

我也在尝试创建一个 android 应用程序,但我需要先抓取网站才能继续,并且该网站也启用了 javascript(动态加载),有什么建议吗?谢谢! 这个问题仍然没有解决,android 的 htmlunit 端口将是一个梦想,因为你可以从页面中提取元素并运行 .click() 方法来生成一个新页面,无论如何你可以使用 android WebView 做到这一点吗? 手机待机时可以使用吗? @LUKER 你找到答案了吗? 改造怎么样?有人试过吗? github.com/square/retrofit【参考方案2】:

我已经采用了上面提到的实现(注入 JavaScript),这对我有用。我所做的只是将 webview 的可见性设置为隐藏在其他 UI 元素下。我也在考虑对硒做同样的事情。我在 Python 中将 selenium 与 Chrome 一起使用,它很棒,但就像你提到的那样,不显示浏览器窗口并不容易。但我认为在 Android 中不显示组件是可能的。我得试试。

【讨论】:

以上是关于使用无头浏览器进行 Android Web Scraping [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

如何让无头浏览器模仿成熟的浏览器来使用 selenium 运行 Web 应用程序?

selenium3使用谷歌无头浏览器截图

无头浏览器是啥?它有啥用?

chrome设置为无头浏览的模式,以便放linux上运行

chrome设置为无头浏览的模式,以便放linux上运行

07-seleniumPhantomJS(无头浏览器)