【问题标题】:Scripting HTTP more effeciently更高效地编写 HTTP 脚本
【发布时间】:2011-01-03 19:46:44
【问题描述】:

我经常想自动执行 http 查询。我目前使用 Java(和 commons http 客户端),但可能更喜欢基于脚本的方法。一些非常快速和简单的东西。我可以在哪里设置标题,转到页面,而不必担心设置整个 OO 生命周期,设置每个标题,调用 html 解析器......我正在寻找任何语言的解决方案,最好是脚本

【问题讨论】:

  • 您得到了大量的答案,因为在这个领域实际上有很多不错的产品,专为不同的用例而设计。为什么要自动化 HTTP 查询?你对这些回复做了什么?您是否曾经需要在请求中设置任何 HTTP 标头或查看响应中的标头?静默跟随重定向总是可以的,还是您需要了解它们?您需要 DOM 和 JavaScript 等浏览器功能吗?等等。
  • 情况不同。在家里,我只是有时会看到自动化某些事情的意义(但不是像 firefox 宏那样),我一直喜欢与 httpbots 打交道。我的第一个程序是蜘蛛。在工作中,我们确实需要一些 http 单元测试。至于答案,是的,这将是一个很好的阅读几天。
  • 这个可以变成wiki吗?确实没有 1 个答案可以接受。
  • 我喜欢机械化,它让它变得如此微不足道!

标签: python ruby perl http scripting


【解决方案1】:

使用 PHP+Curl 或者 bash 怎么样?

【讨论】:

    【解决方案2】:

    Python urllib 可能就是你要找的东西。

    另外,powershell 在脚本环境中公开完整的 .NET http 库。

    【讨论】:

    • 通常,人们需要 urllib2 而不是 urllib。
    【解决方案3】:

    Mechanize for Python 似乎很容易使用:http://wwwsearch.sourceforge.net/mechanize/

    【讨论】:

    • 它似乎也存在于 perl 中。
    【解决方案4】:

    看看Selenium。如果您需要自定义脚本,它会为 C#、Java、Perl、PHP、Python 和 Ruby 生成代码。

    【讨论】:

    • 在生成的代码中,他们使用了哪些http库?默认的还是机械化之类的?
    • Selenium 为每种语言都有一个包装库。
    • 据我了解 Selenium,它使用一个完全成熟的浏览器,如 firefox。在我看来,这就像用核弹杀死一只老鼠。
    • 哈代约翰内斯。这是一种使用浏览器(这是使用网络应用程序的最常见方式)来测试网络应用程序(最常通过浏览器访问)。
    • 我试过 Selenium。我正在考虑使用它最初构建一个脚本,然后对其进行编辑。下面是一个 API 示例:@selenium.click "link=Yahoo!"。如果链接更改或链接是动态生成的,对我来说这是有问题的。
    【解决方案5】:

    Watir 听起来很接近你想要的,尽管它(就像另一个答案中链接到的 Selenium)实际上打开了一个浏览器来做一些事情。你可以看到一些例子here。另一个基于浏览器的录制+播放系统是sahi

    如果您的应用程序使用WSGI,那么paste 是一个不错的选择。

    在另一个答案中链接到的机械化是“库中的浏览器”,perlRubyPython 中有克隆。 Perl 是最初的版本,如果您想要浏览器,这似乎是可行的方法。这种方法的问题在于,所有前端代码(可能依赖于 JavaScript)都不会被执行。

    【讨论】:

    • 另外,当它打开浏览器时......它会变成一个活动窗口并操纵点击/事件吗?
    • 从未使用过。除非涉及到浏览器(或者它以某种方式加载了 JS 解释器),否则我认为不会。
    • 我很难描述基于浏览器的系统是如何工作的。 Selenium 主页有一些截屏视频。如果你看到它们,我相信你会明白的。
    • @Zombies: httpunit 支持一些javascript,见httpunit.org/doc/javascript-support.html
    【解决方案6】:

    一些 ruby 库:

    • httparty: 真的很有趣,哲学很有趣。
    • mechanize: 经典的优质网络自动化库。
    • scrubYt: 乍一看令人费解,但使用起来很有趣。

    【讨论】:

      【解决方案7】:

      轮到我了:wget 或 perl 与 lwp。您可以在链接页面上找到示例。

      【讨论】:

        【解决方案8】:

        根据您正在做什么,最简单的解决方案看起来是 bash + curl。

        后者的手册页可在此处获得:

        http://curl.haxx.se/docs/manpage.html

        您可以发布和获取、HTTPS、显示标头、使用 cookie、基本和摘要 HTTP 身份验证、通过各种代理建立隧道,包括 *nix 上的 NTLM 等等。

        curl 也可用作支持 C 和 PHP 的共享库。

        HTH

        C.

        【讨论】:

          【解决方案9】:

          我目前正在测试 ReST API,发现 ReST Client 非常好。它是一个 GUI 程序,但是您可以将查询保存和恢复为 XML 文件(或让它们生成)、嵌入、编写测试脚本等等。而且它是基于 Java 的(这不是一个特别的优势,但你提到了它)。

          录制会话的减分。 ReST 客户端适用于无状态的“一次性”。

          如果它不符合您的需求,我会选择已经提到的 Mechanize(或 WWW-Mechanize,因为它在 CPAN 中被称为)。

          【讨论】:

            【解决方案10】:

            Twill 非常好,适合测试。它可以用作脚本、交互式会话或 Python 程序中。

            【讨论】:

              【解决方案11】:

              如果您有简单的需求(获取页面然后解析它),则很难击败 LWP::SimpleHTML::TreeBuilder

              use strict;
              use warnings;
              
              use LWP::Simple;
              use HTML::TreeBuilder;
              
              my $url = 'http://www.example.com';
              my $content = get( $url) or die "Couldn't get $url";
              
              my $t = HTML::TreeBuilder->new_from_content( $content );
              $t->eof;
              $t->elementify;
              
              # Get first match:
              my $thing = $t->look_down( _tag => 'p', id => qr/match_this_regex/ );
              
              print $thing ? $thing->as_text : "No match found\n";
              
              # Get all matches:
              my @things = $t->look_down( _tag => 'p', id => qr/match_this_regex/ );
              
              print $_ ? $_->as_text : "No match found" for @things;
              

              【讨论】:

              • 是的,LWP 和 HTML::TreeBuilder 通常一起使用。
              • @Leonardo,喜欢巧克力和花生酱——它们各自很好,但搭配起来更好。
              【解决方案12】:

              Perl 和WWW::Mechanize 可以使网页抓取等变得简单易行,包括轻松处理表单(假设您想进入登录页面,填写用户名和密码并提交表单,处理 cookie / 隐藏会话标识符就像浏览器一样......)

              同样,从获取的页面中查找或提取链接也很简单。

              如果您需要从结果页面中解析出 WWW::Mechanize 无法轻松提供帮助的内容,请将结果提供给 HTML::TreeBuilder 以便于解析。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2021-05-07
                • 2013-02-16
                • 2018-03-08
                • 2020-01-18
                • 2023-04-02
                • 2014-03-28
                • 2013-05-01
                • 1970-01-01
                相关资源
                最近更新 更多