使用Perl getstore下载图片返回500错误,wget及浏览器可正常下载
解决Perl getstore返回500错误但wget/浏览器可正常下载的问题
这种情况我遇到过不少,核心原因几乎都是请求头的差异——LWP::Simple的getstore方法默认使用的请求头(尤其是User-Agent)被目标服务器识别为非浏览器/非合法请求,从而返回500内部错误,而wget和浏览器会发送更符合服务器预期的请求头,所以能成功下载。
解决方案1:修改LWP::Simple的全局User-Agent
如果你必须坚持用getstore方法,可以直接修改LWP::Simple底层使用的User-Agent对象,模拟浏览器的请求标识:
use LWP::Simple; use LWP::UserAgent; # 设置一个常见的浏览器User-Agent,替换成你常用的浏览器标识也可以 $LWP::Simple::ua->agent('Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36'); my $url = "http://shop.xeptor.co.uk/imgs/cef4cbbe-d86e-420e-aec6-4371d7e9b2bc/250/250/2262497R4xtrep.jpg"; my $filename = "test.jpg"; my $rc = getstore($url, $filename); if (is_error($rc)) { die "getstore of <$url> failed with $rc"; }
解决方案2:改用LWP::UserAgent实现getstore功能(更灵活)
其实LWP::Simple的getstore本质是对LWP::UserAgent的简化封装,直接使用LWP::UserAgent可以更灵活地控制请求头,同时实现相同的文件存储功能:
use LWP::UserAgent; my $url = "http://shop.xeptor.co.uk/imgs/cef4cbbe-d86e-420e-aec6-4371d7e9b2bc/250/250/2262497R4xtrep.jpg"; my $filename = "test.jpg"; # 创建UserAgent实例,设置浏览器风格的User-Agent my $ua = LWP::UserAgent->new( agent => 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36', # 可选:添加其他请求头,比如Accept、Referer等,根据服务器要求调整 default_headers => HTTP::Headers->new( Accept => 'image/jpeg,image/png,*/*', ), ); # 执行请求并将内容写入文件 my $response = $ua->get($url, ':content_file' => $filename); if ($response->is_error) { die "getstore of <$url> failed with " . $response->status_line; }
为什么这能解决问题?
很多服务器会通过User-Agent字段过滤请求,拒绝那些看起来像爬虫/脚本的默认标识(LWP::Simple的默认User-Agent是类似libwww-perl/6.67这样的字符串)。模拟浏览器的User-Agent可以让服务器认为这是正常的用户请求,从而返回正确的响应。
如果修改后还是不行,可以进一步对比wget和浏览器的请求头(比如用浏览器的开发者工具查看Network请求,或者用wget -d查看详细请求),把缺失的请求头也添加到Perl代码中,通常就能解决问题。
内容的提问来源于stack exchange,提问作者naf
相关产品推荐
相关产品推荐

