为啥我不能使用 LWP::Simple 获取***页面?

Posted

技术标签:

【中文标题】为啥我不能使用 LWP::Simple 获取***页面?【英文标题】:Why can't I fetch wikipedia pages with LWP::Simple?为什么我不能使用 LWP::Simple 获取***页面? 【发布时间】:2010-09-06 16:13:12 【问题描述】:

我正在尝试使用LWP::Simple 获取***页面,但它们没有回来。这段代码:

#!/usr/bin/perl
use strict;
use LWP::Simple;

print get("http://en.wikipedia.org/wiki/Stack_overflow");

不打印任何东西。但如果我使用其他网页,比如@987654322@,它可以正常工作。

我应该使用其他名称来引用***页面吗?

这里会发生什么?

【问题讨论】:

请注意,您会收到“403 Forbidden”错误。 【参考方案1】:

显然 Wikipedia 阻止了 LWP::Simple 请求:http://www.perlmonks.org/?node_id=695886

以下方法可以代替:

#!/usr/bin/perl
use strict;
use LWP::UserAgent;

my $url = "http://en.wikipedia.org/wiki/Stack_overflow";

my $ua = LWP::UserAgent->new();
my $res = $ua->get($url);

print $res->content;

【讨论】:

我收到错误 500 Can't connect to en.wikipedia.org:443 对于给定的 wiki URL,但是对于 *** 主页 ***.com,它给出 403 . 我在调用get 方法之前添加了$ua->agent("WikiBot/0.1");,这对包括*** 在内的许多网站都很有效。但它仍然在 wiki 页面上给出错误,与上述相同的错误。 添加了$ua = LWP::UserAgent->new(ssl_opts => verify_hostname => 0 ); ,这个错误500 Can't connect to en.wikipedia.org:443得到了修复。它可能对其他人有帮助。【参考方案2】:

您也可以只在 LWP::Simple 模块上设置 UA - 只需导入 $ua 变量,它就可以让您修改底层的 UserAgent:

use LWP::Simple qw/get $ua/;
$ua->agent("WikiBot/0.1");
print get("http://en.wikipedia.org/wiki/Stack_overflow");

【讨论】:

【参考方案3】:

我使用LWP:RobotUA 而不是LWP::UserAgent 解决了这个问题。您可以阅读下面的文档。您应该修改的差异不大。

http://lwp.interglacial.com/ch12_02.htm

【讨论】:

【参考方案4】:

因为 Wikipedia 阻止了 LWP::Simple 使用的 HTTP 用户代理字符串。

如果您尝试使用它,您将收到“403 Forbidden”响应。

尝试使用 LWP::UserAgent 模块解决此问题,设置代理属性。

【讨论】:

【参考方案5】:

另请参阅与 Mediawiki 相关的 CPAN 模块 - 这些模块旨在访问 Mediawiki 网站(***就是其中之一),并且可能比简单的 LWP 为您提供更多的花里胡哨。

http://cpan.uwinnipeg.ca/search?query=Mediawiki&mode=dist

【讨论】:

以上是关于为啥我不能使用 LWP::Simple 获取***页面?的主要内容,如果未能解决你的问题,请参考以下文章

Perl LWP::Simple::getstore 如何检查文件是不是存在于目标目录中

为啥我不能使用 XMLHttpRequest 从本地网络获取 JSON 文件? [复制]

为啥我不能使用 XMLHttpRequest 从本地网络获取 JSON 文件? [复制]

为啥我不能在 Socket.io http 服务器上使用 express.js 获取方法

用Perl抓取网页和提交表格

为啥我不能将从 Firestore 获取的值分配给 Swift 中的数组?