【问题标题】:How to programmatically extract information from a web page, using Linux command line?如何使用 Linux 命令行以编程方式从网页中提取信息?
【发布时间】:2013-02-12 20:37:59
【问题描述】:

我需要提取美元对另一种货币(例如欧元)的汇率以获取一长串历史日期。

www.xe.com 网站提供了历史查找工具,使用详细的 URL,可以获取特定日期的费率表,无需填充 Date:From: 框。例如,URL http://www.xe.com/currencytables/?from=USD&date=2012-10-15 给出了 2012 年 10 月 15 日当天从美元到其他货币的兑换率表。

现在,假设我有一个日期列表,我可以遍历列表并更改该 URL 的日期部分以获取所需的页面。如果我可以提取汇率列表,那么简单的grep EUR 会给我相关汇率(我可以使用 awk 专门提取汇率)。

问题是,如何使用 Linux 命令行命令获取页面?我试过wget,但没有成功。

如果不是 CLI,是否有一种简单直接的方式以编程方式执行此操作(即,比将日期复制粘贴到浏览器地址栏所需的时间更少)?


更新 1:

运行时:

$ wget 'http://www.xe.com/currencytables/?from=USD&date=2012-10-15'

我得到一个文件,其中包含:

<HTML>
<HEAD><TITLE>Autoextraction Prohibited</TITLE></HEAD>
<BODY>
Automated extraction of our content is prohibited.  See <A HREF="http://www.xe.com/errors/noautoextract.htm">http://www.xe.com/errors/noautoextract.htm</A>.
</BODY>
</HTML>

所以看起来服务器可以识别查询类型并阻止wget。有什么办法吗?


更新 2:

看了wget命令的响应和cmets/answers后,我查看了网站的ToS,发现了这个条款:

You agree that you shall not:
...
f. use any automatic or manual process to collect, harvest, gather, or extract
   information about other visitors to or users of the Services, or otherwise
   systematically extract data or data fields, including without limitation any
   financial and/or currency data or e-mail addresses;

我想,这已经结束了这方面的努力。


现在,让我好奇的是,如果wget 生成一个 HTTP 请求,服务器如何知道它是命令而不是浏览器请求?

【问题讨论】:

  • 发布您尝试过的 wget 命令。 wget 和 curl 是两个常见的命令行实用程序,它们能够发送 HTTP 请求和检索响应(网页)。
  • 这回答了您为什么 wget 无法检索网页的问题。可能有规避的方法,但 StackOverflow 不是讨论它的地方。
  • 有一个字符串作为 HTTP 请求标头的一部分传递,称为“用户代理”,用于标识 HTTP 客户端。
  • @Tuxdude - 我明白了。谢谢。

标签: html linux extract html-content-extraction


【解决方案1】:

那是因为 wget 正在发送某些类型的标头,以便于检测。

# wget --debug cnet.com | less
[...]
---request begin---
GET / HTTP/1.1
User-Agent: Wget/1.13.4 (linux-gnu)
Accept: */*
Host: www.cnet.com
Connection: Keep-Alive
[...]

注意

User-Agent: Wget/1.13.4 

我认为如果你改变它为

Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_2) AppleWebKit/537.75.14 (KHTML, like Gecko) Version/7.0.3 Safari/537.75.14

它会起作用的。

# wget --header='User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_2) AppleWebKit/537.75.14 (KHTML, like Gecko) Version/7.0.3 Safari/537.75.14' 'http://www.xe.com/currencytables/?from=USD&date=2012-10-15'

这似乎从这里工作正常。 :D

【讨论】:

  • 是的,这似乎可以解决问题。但是,出于好奇的原因进行了测试,因为 ToS 禁止这样做。
【解决方案2】:

您是否访问了回复中的链接?

来自http://www.xe.com/errors/noautoextract.htm

我们确实提供了许多许可选项,让您可以 将 XE.com 货币功能整合到您的软件中, 网站和服务。如需更多信息,请通过以下方式联系我们:

XE.com Licensing
+1 416 214-5606
licensing@xe.com

您会感激我们投入的时间、精力和费用 创建和维护我们的网站非常重要。我们的服务和 数据是专有的,是多年努力的结果。 未经授权使用我们的服务,即使是由于一个简单的错误 或未阅读使用条款,是不可接受的。

这听起来像是您可以使用的 API,但您必须为此付费。不用说,您应该尊重这些条款,而不是试图绕过它们。

【讨论】:

  • 谢谢。尽管据我所知,本段本身并不禁止我的尝试(但是,IANAL),但我确实在 ToS 中找到了相关条款并相应地更新了问题。
【解决方案3】:

你需要使用-O来写STDOUT

wget -O- http://www.xe.com/currencytables/?from=USD&amp;date=2012-10-15

但看起来 xe.com 不希望您进行自动下载。我建议不要在 xe.com 上进行自动下载

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多