我没动过这个 Perl 脚本,但它坏了
您正在尝试使用来自
Linux Journal 旧期刊中的 Perl 脚本,但是
它无法正常工作。 这是一个很好的机会来了解
您没有动过的东西是如何损坏的。这是原始脚本,
它来自第 40 期中一篇名为“Perl 中的 Web 爬虫”的文章。请记住,来自Linux
Journal 旧期刊的代码也可以从
Linux
Journal 旧期刊的代码也可以从
SSC FTP
站点获取。 第 40 期的列表在
它们自己的
目录中,您可以直接从那里获取代码,从而节省时间,而无需
从 HTML 版本中删除 PHP 生成的修饰。
该脚本还有其他两个问题。第一个问题是,如果第一个参数--$ARGV[1]--
不是格式正确的 URL,则脚本将静默退出。 对于那些习惯于
告诉他们的浏览器访问 linuxjournal.com 而不是
告诉他们的浏览器访问 linuxjournal.com 而不是
http://linuxjournal.com/的人来说,这可能会令人困惑,特别是如果您
提供了错误的参数数量。 如果您这样做,脚本将
有帮助地提示您一条用法消息,这是第二个
问题。 如果用户犯了一个错误就提供帮助,而如果用户犯了另一个错误就静默
退出,这在生产代码中不是一个好主意。 但这是一个来自杂志封底的示例,
退出,这在生产代码中不是一个好主意。 但这是一个来自杂志封底的示例,
没有人会在没有进行一系列健全性检查的情况下实际运行杂志封底的代码,
这些健全性检查在杂志中会很无聊,但在实际使用中却可以挽救局面。 是吧?
现在来说说有趣的问题。 看看这一行:print S "GET /$document
HTTP/1.0\n\n";我们正在发送一个单行的 HTTP 1.0 请求。 这有多好用?
如果服务器上只有一个网站,它会运行良好。
但是今天,许多网站将大量虚拟主机合并到一个 IP
地址中。 例如,让我们尝试像这样在服务器上进行一个单行 GET 请求:
地址中。 例如,让我们尝试像这样在服务器上进行一个单行 GET 请求:
dmarti.weblogs.com,
它是一个托管在许多站点上的虚拟主机。
$ telnet dmarti.livejournal.com 80 Trying 66.150.15.150... Connected to livejournal.com. Escape character is '^]'. GET /Connection closed by foreign host. dmarti@zingiber:~$ GET / HTTP/1.0
<HTML> <HEAD> <TITLE>Directory /</TITLE> <BASE HREF="file:/"> </HEAD> <BODY> <H1>Directory listing of /</H1>
等等。 看起来我们需要一个 Host: 标头,
它正式出现在 HTTP 1.1 中,但在 HTTP 1.0 中也能使用。
将上面的 GET 行更改为:
print S "GET /$document HTTP/1.0\n"; print S "Host: $server_host\n\n";
将上面的 GET 行更改为:
瞧! 它起作用了。 Host
标头告诉服务器从哪个虚拟主机获取
页面。 Perl 脚本在某些站点上无法工作,因为人们对
网络的假设发生了变化,HTTP 协议也得到了
更新以反映这一点。 不是您的错,您不得不
返回并更改它。 这就是互联网上的生活。Don Marti 是 Linux Journal 的主编。
电子邮件:dmarti@ssc.com