【问题标题】:How can I make an HTTP GET request from Perl?如何从 Perl 发出 HTTP GET 请求?
【发布时间】:2011-10-26 22:01:46
【问题描述】:

我正在尝试编写我的第一个 Perl 程序。如果您认为 Perl 对于手头的任务来说是一种糟糕的语言,请告诉我哪种语言可以更好地解决它。

程序测试给定机器和远程 Apache 服务器之间的连接性。 首先,程序从 Apache 服务器请求目录列表,然后解析列表并逐个下载所有文件。如果文件有问题(在达到指定的 Content-Length 之前连接重置),应该记录并检索下一个文件。不需要保存文件,甚至不需要检查完整性,我只需要记录完成所需的时间以及连接重置的所有情况。

为了从 Apache 生成的目录索引中检索链接列表,我计划使用类似于

的正则表达式
/href=\"([^\"]+)\"/

确实,正则表达式尚未调试。

从 Perl 执行 HTTP 请求的“参考”方式是什么?我用谷歌搜索并找到了使用许多不同库的示例,其中一些是商业的。我需要能够检测断开连接(超时或 TCP 重置)并处理这些问题的东西。

另一个问题。如何以最少的编码工作将全局搜索时被正则表达式捕获的所有内容存储为字符串列表?

【问题讨论】:

    标签: perl http


    【解决方案1】:

    就整个问题描述而言,我会使用WWW::Mechanize。 Mechanize 是LWP::UserAgent 的子类,它添加了状态行为和HTML 解析。使用 mech,您只需执行$mech->get($url_of_index_page),然后使用$mech->find_all_links(criteria) 选择要关注的链接。

    【讨论】:

    • 糟糕。它不能解决问题。我想尽量减少不在标准库中的函数的使用。是否有任何基线功能可以这样做? (Perl 5 构建 5.002)
    • Perl 5.002 是古老的(此时已经快 15 年了!)。您不会在其库中找到标准 HTTP 模块,我强烈建议您尝试更新到更新版本的 perl。
    【解决方案2】:

    你有很多问题。您帖子标题中问题的答案是使用LWP::Simple

    perlfaq9 回答了您的大多数其他问题,并提供了指向更多信息的适当指针。

    【讨论】:

      【解决方案3】:

      至于你的问题中使用正则表达式的解析标记,不要!

      http://htmlparsing.icenine.ca 解释了您不应该这样做的一些原因。尽管您似乎试图解析的内容看起来很简单,但请使用适当的解析器。

      上面链接的页面不再存在...

      http://www.cwhitener.com/htmlparsing

      【讨论】:

      • 同意 DON'T 部分。不同意链接到实际上没有任何解释的页面。
      • 第三。有许多库可以帮助您解决这个问题,通常包含在标准 Perl 发行版中。不要重新发明轮子,尤其是当它是一个复杂的多部件轮子时,有六打关于轮子长度、周长、轴尺寸和最大转速的警告!
      • 我看到的问题现在满足使用您链接页面上列出的正则表达式的所有先决条件。我需要解析以已知方式配置的已知 Apache 版本的目录列表,而且我可能需要仅下载具有特定扩展名的文件并保持其他文件未选中的功能,这很容易使用正则表达式。不过,我已经对使用最糟糕的编码实践感到难过。
      • 虽然一般情况下需要一个 HTML 解析器,在这种情况下,来自 Apache 的目录列表,一个正则表达式并不是那么糟糕。只需使用一点透视。但是,我的 HTML::SimpleLinkExtor 模块比正则表达式更容易。 :)
      • @Muxecoid 如果这些是您的要求,也许您应该使用 wget (gnu.org/software/wget) 或 cURL (curl.haxx.se)。
      【解决方案4】:

      作为更一般的答案,Perl 是一种非常适合进行 HTTP 请求的语言,就像许多其他语言一样。如果您熟悉 Perl,请不要犹豫;有许多优秀的库可以满足您的需求。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-08-15
        • 1970-01-01
        • 2012-06-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多