使用LWP::UserAgent遇403 Forbidden,如何配置模拟浏览器爬取网页?
解决LWP::UserAgent遇到403 Forbidden的问题,模拟真实浏览器爬取页面
我明白你碰到的麻烦了——用LWP::UserAgent请求https://dreaminislam.com/a/时返回403 Forbidden,但wget或者curl却能正常拿到页面内容。这大概率是目标网站的反爬机制把你的请求识别成了非浏览器发起的,所以直接拒绝了访问。咱们来调整下LWP::UserAgent的配置,让它的请求更贴近真实浏览器的特征,绕过这个拦截。
问题根源
网站的反爬策略不会只看User-Agent这一个字段,它会检查请求头的多个细节,比如Accept、Accept-Language、Accept-Encoding这些常见字段,甚至会验证请求头的顺序和完整性。你当前的代码只设置了User-Agent,缺少其他关键的请求头信息,这就导致网站一眼就认出这是爬虫请求。
修改后的完整代码
use HTTP::CookieJar::LWP (); use LWP::UserAgent; use LWP::Simple; my $url = qq{https://dreaminislam.com/a/}; my $content = getUrl($url); exit; sub getUrl { my $url = shift; my $jar = HTTP::CookieJar::LWP->new; my $ua = LWP::UserAgent->new( timeout => 180, cookie_jar => $jar, protocols_allowed => ['http', 'https'], parse_head => 1, # 启用头部解析,支持压缩 agent => qq{Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:115.0) Gecko/20100101 Firefox/115.0} ); # 添加真实浏览器常用的请求头 $ua->default_header( 'Accept' => 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8', 'Accept-Language' => 'en-US,en;q=0.5', 'Accept-Encoding' => 'gzip, deflate, br', 'Referer' => 'https://dreaminislam.com/', # 模拟从首页跳转过来 'DNT' => '1', # Do Not Track,部分浏览器会发送这个字段 'Connection' => 'keep-alive', 'Upgrade-Insecure-Requests' => '1' ); my $response = $ua->get($url); if ($response->is_success) { my $content = $response->decoded_content; return $content; } else { printf "Get url error [%d] %s.\n", $response->code, $response->message; return undef; } }
关键修改点说明
- 更新User-Agent版本:把旧版Firefox 68换成了更近期的115版本,更贴近当前主流浏览器的标识,降低被拦截概率。
- 补充完整请求头:添加了真实浏览器发送的Accept、Accept-Language、Accept-Encoding等字段,让请求的头部信息更完整,看起来完全像是浏览器发起的。
- 启用压缩支持:设置
parse_head => 1并在请求头中声明支持gzip/deflate/br压缩,既符合浏览器行为,还能减少数据传输量。 - 添加Referer字段:模拟从网站首页跳转至目标页面的行为,部分网站会用Referer判断请求的合法性。
额外建议
如果修改后还是遇到403,可以尝试这些方法:
- 尝试使用
WWW::Mechanize模块(它基于LWP::UserAgent封装,更方便模拟浏览器的点击、表单提交等行为)。 - 延长请求间隔,避免短时间内发送大量请求触发频率限制。
- 检查网站的robots.txt文件,确保你的爬取行为符合网站的规则。
内容的提问来源于stack exchange,提问作者daliaessam
相关产品推荐
相关产品推荐

