Perl LWP 被服务器 404 未找到阻止

Perl LWP get blocked by server 404 not found

我正在使用 LWP::UserAgent 在 unix 服务器中下载一个 csv

my $ua1 = LWP::UserAgent->new();
my $res = $ua1->get($equity_history_url, @netscape_like_headers);

服务器一直给我错误代码 404(未找到)

尽管我可以从浏览器下载这个文件 -> http://www.nseindia.com/content/equities/scripvol/datafiles/18-08-2013-TO-17-08-2015ADANIPOWERALLN.csv

并且该代码适用于其他页面

我认为问题之一是 below

我尝试传递一个 header 类似于我使用 wireshark

捕获的浏览器
my @netscape_like_headers = (
    'User-Agent' => 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.155 Safari/537.36',
    'Accept-Language' => 'en-US,en;q=0.8',
    'Accept-Charset' => 'iso-8859-1,*,utf-8',
    'Accept-Encoding' => 'gzip, deflate, sdch',
    'Upgrade-Insecure-Requests' => '1',
    'Accept' =>     'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
    'Connection' => 'keep-alive'
);

仍然没有运气。有什么建议吗?

当我在那个 URL 上使用 LWP::UserAgent 而没有你的 headers 时,我得到一个 403 Forbidden 错误返回。与 curl.

相同
use strict;
use warnings;
use LWP::UserAgent;

my $ua = LWP::UserAgent->new;

my $res = $ua->get(
    'http://www.nseindia.com/content/equities/scripvol/datafiles/18-08-2013-TO-17-08-2015ADANIPOWERALLN.csv');
print $res->as_string;

__END__
HTTP/1.1 403 Forbidden
Connection: close
Date: Tue, 18 Aug 2015 12:19:13 GMT
Server: AkamaiGHost
Content-Length: 388
Content-Type: text/html
Expires: Tue, 18 Aug 2015 12:19:13 GMT
Client-Date: Tue, 18 Aug 2015 12:19:13 GMT
Client-Peer: 104.85.166.76:80
Client-Response-Num: 1
Mime-Version: 1.0
Title: Access Denied

<HTML><HEAD>
<TITLE>Access Denied</TITLE>
</HEAD><BODY>
<H1>Access Denied</H1>

You don't have permission to access "http&#58;&#47;&#47;www&#46;nseindia&#46;com&#47;content&#47;equities&#47;scripvol&#47;datafiles&#47;18&#45;08&#45;2013&#45;TO&#45;17&#45;08&#45;2015ADANIPOWERALLN&#46;csv" on this server.<P>
Reference&#32;&#35;18&#46;48a65568&#46;1439900353&#46;1006096e
</BODY>
</HTML>

当我添加您的 headers 时,我第一次尝试就成功了。当我re-ran它的时候,它也给出了404 Not Found。现在,当我在浏览器中单击 link 时,它也会显示 404。

我相信他们会阻止您多次下载该文件。如果您使用 dial-up 连接或使用 non-static IP 地址的宽带,尝试重新连接以获得新的连接,或使用代理


也许他们也有禁止使用自动化工具访问其资源的服务条款,因为它们不是 API。

更新

事实上,他们不允许您尝试做的事情! their terms of services 的第 12 点明确指出。

You may not conduct any systematic or automated data collection activities (including scraping, data mining, data extraction and data harvesting) on or in relation to our website without our express written consent.

一般来说,让您的 LWP 用户代理看起来像一个已知的浏览器。您可以将带有参数的用户代理的名称设置为 new 或稍后设置:

my $ua = LWP::UserAgent->new(
    agent => ...,
    );

$ua->agent( ... );

您可以做其他事情,例如添加一个饼干罐。 LWP::UserAgent 默认情况下不这样做。遵循网站的特定路径、设置引荐来源网址和其他类似人类的行为有时可以解决问题。您可能想查看 WWW::Mechanize 以了解此类内容。

一些站点将使用 Javascript 来完成您的基于 Perl 的基本用户代理无法为您完成的各种事情。在这些情况下,您可以使用 Perl 来控制基于 UI 的浏览器,就像我在 Controlling Firefox from Perl.

中展示的那样