当前位置: 首页 > 面试题库 >

使用无头浏览器的Android Web抓取

贺华容
2023-03-14
问题内容

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

  • 检索网页的全部内容(例如在后台),而不向视图渲染结果。
  • 例如,lib应该支持触发ajax请求的页面,以便在加载初始HTML之后加载一些其他结果数据。
  • 从生成的html中,我需要获取xpath或CSS选择器形式的元素
  • 将来我可能还需要导航到下一页(触发事件,提交按钮/链接等)

这是我尝试未成功的尝试:

  • Jsoup:效果很好,但不支持javascript / ajax(因此无法加载整页)
  • 内置于HttpEntity中的Android:与jsoup一样的javascript / ajax问题
  • HtmlUnit:完全可以满足我的需求,但数小时后却无法在Android上正常工作(其他用户尝试加载价值12MB以上的jar文件失败。我本人加载了完整的源代码,并将其引用为项目库,只是为了找到那个Android中不存在Applets和java.awt(由HtmlUnit使用)之类的东西。
  • Rhino-我觉得这很令人困惑,不知道如何在Android中运行它,即使它是我想要的。
  • Selenium Driver:看起来它可以工作,但是您没有直接实现它的直接方法,因此您没有在视图中显示实际的html。

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

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

提前致谢!


问题答案:

好吧,两周后,我承认失败了,目前正在使用一种对我来说非常有用的解决方法。

问题:
将HTMLUnit移植到Android太困难了(或者至少以我的专业水平)。我确信这是一个值得的项目(对于有经验的Java程序员而言,并没有那么耗时)。我给HTMLUnit的家伙们发了电子邮件,他们评论说他们没有考虑端口或将要付出什么努力,但是建议任何想要开始这样的项目的人都应该向他们的邮件列表发送一条消息,以吸引更多的开发人员参与(http:
//htmlunit.sourceforge.net/mail-
lists.html

)。

解决方法:
我使用android内置的WebView并重写了Webview类的onPageFinished方法来注入Javascript,该Javascript可在页面完全加载后捕获所有html。Webview还可以用于调用进一步的JavaScript操作,单击按钮,填写表单等。

码:

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

webView.setWebViewClient(new WebViewClient() {

@Override
public void onPageFinished(WebView view, String url) {

   //Load HTML
   webView.loadUrl("javascript:window.HtmlViewer.showHTML
       ('<head>'+document.getElementsByTagName('html')[0].innerHTML+'</head>');");
}

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

public class MyJavaScriptInterface {

    private Context ctx;
    public String html;

    MyJavaScriptInterface(Context ctx) {
        this.ctx = ctx;
    }

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


 类似资料:
  • 问题内容: 我花了一天的时间研究可用于完成以下任务的图书馆: 检索网页的全部内容(例如在后台),而不向视图渲染结果。 例如,lib应该支持触发ajax请求的页面,以便在加载初始HTML之后加载一些其他结果数据。 从生成的html中,我需要获取xpath或CSS选择器形式的元素。 将来我可能还需要导航到下一页(触发事件,提交按钮/链接等) 这是我尝试未成功的尝试: Jsoup:效果很好,但不支持ja

  • 主要内容:控制台界面,数据包抓取,看变化规律几乎所有浏览器都提供了抓取数据包的功能,因为浏览器为抓包提供了一个专门的操作界面,因此这种抓包方式也被称为“控制台抓包”。本节以 Chrome 浏览器为例进行抓包演示。 控制台抓包指的是利用浏览器开的发者调试工具抓取客户端与后端服务器交互的数据,它能够将网络传输中发送与接收的数据进行截获、重发和编辑。 控制台抓包非常适合于 POST 请求类型。我们知道,POST 请求使用 Form 表单向服务器提

  • 本文向大家介绍python使用mitmproxy抓取浏览器请求的方法,包括了python使用mitmproxy抓取浏览器请求的方法的使用技巧和注意事项,需要的朋友参考一下 最近要写一款基于被动式的漏洞扫描器,因为被动式是将我们在浏览器浏览的时候所发出的请求进行捕获,然后交给扫描器进行处理,本来打算自己写这个代理的,但是因为考虑到需要抓取https,所以最后找到Mitmproxy这个程序。 安装方法

  • 问题内容: 我们只是在不使用无头浏览器的情况下实施CI,而是使用实际的浏览器。因此,一旦开发团队签入了新代码,我们的烟雾自动化代码将在汽车机器上作为后台进程运行并发送结果。如果有任何故障,它甚至可以跨屏幕截图发送。我们没有得到的是,使用无头浏览器进行上述处理的好处是什么。我们需要我们的烟雾脚本来获得此覆盖范围。假设提交了一个庞大的表单,该表单可以在5分钟内使用“选择”,“日历”,“上载”等控件运行

  • 使用: Angular CLI在Chrome中默认运行测试,这很好,但是如果我需要在仅控制台环境(无头浏览器)中运行它们呢? 如果我可以在每次运行它时指定是否想要无浏览器,那就太好了,所以类似于: 编辑: 运行PhantomJS我得到了以下信息: PhantomJS 2.1.1 (Linux 0.0.0)错误类型错误:useValue,useFactory,数据不可迭代!http://localh

  • 问题内容: 我正在尝试列出适用于浏览器自动测试套装和能够抓取的无头浏览器平台的可能解决方案。 浏览器测试/报废: Selenium - 通晓多国语言的浏览器自动化的旗舰,为Python和Ruby,JavaScript中,C#,Haskell和更多,IDE的Firefox(作为扩展),更快的测试部署绑定。可以充当服务器并具有大量功能。 JAVASCRIPT PhantomJS - JavaScrip