使用JSoup爬取亚马逊评论遇503错误,求助提取评论者影响力值
解决JSoup爬取亚马逊评论时的HTTP 503错误问题
HTTP 503错误是亚马逊反爬机制触发导致的——Jsoup默认请求头会被识别为非浏览器请求,直接被拦截。以下是具体解决方法和优化后的代码:
核心修复点
- 添加浏览器请求头:模拟真实浏览器的请求标识,避免被判定为爬虫
- 增加请求间隔:降低请求频率,减少触发反爬的概率
- 完善错误处理:单个页面请求失败时不中断整个爬取流程
优化后的代码
import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; import org.jsoup.select.Elements; import java.io.IOException; import java.util.HashMap; import java.util.concurrent.TimeUnit; public class AmazonReviewScraper { public static void main(String[] args) { HashMap<String, String> reviewers = new HashMap<>(); // 模拟Chrome浏览器的User-Agent String userAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36"; try { // 请求商品评论页面,添加浏览器请求头 Document reviewPage = Jsoup.connect("https://www.amazon.co.uk/Charles-Dickens-Complete-Christmas-Collection/dp/B08FRBWTNX/ref=sr_1_1_sspa?crid=USM5FCL8WJZ4&keywords=charles+dickens&qid=1678359627&sprefix=charles+dickens%2Caps%2C127&sr=8-1-spons&sp_csd=d2lkZ2V0TmFtZT1zcF9hdGY&psc=1") .userAgent(userAgent) .header("Accept-Language", "en-US,en;q=0.9") .get(); Elements reviewPageElements = reviewPage.select(".review"); for (Element reviewPageElement : reviewPageElements) { // 提取评论者姓名 Element nameElement = reviewPageElement.selectFirst(".a-profile-name"); if (nameElement == null) continue; String name = nameElement.text(); // 提取个人主页链接 Element linkElement = reviewPageElement.selectFirst(".a-profile"); if (linkElement == null) continue; String link = linkElement.attr("href"); String profileUrl = "https://www.amazon.co.uk" + link; // 延迟1秒,避免请求过快触发反爬 TimeUnit.SECONDS.sleep(1); // 请求个人主页,单独捕获异常防止整个流程中断 try { Document profilePage = Jsoup.connect(profileUrl) .userAgent(userAgent) .header("Accept-Language", "en-US,en;q=0.9") .get(); Elements impactElement = profilePage.select(".impact-text"); String impact = impactElement.text().isEmpty() ? "无影响力数据" : impactElement.text(); reviewers.put(name, impact); System.out.println("已获取:" + name + " - " + impact); } catch (IOException e) { System.err.println("获取" + name + "的个人主页失败:" + e.getMessage()); reviewers.put(name, "获取失败"); } } // 输出最终结果 System.out.println("\n最终爬取结果:"); reviewers.forEach((k, v) -> System.out.println(k + ": " + v)); } catch (IOException | InterruptedException e) { e.printStackTrace(); } } }
额外注意事项
- 不要过度缩短请求间隔,否则可能会被亚马逊封禁IP
- 亚马逊页面结构可能随时变化,需定期检查选择器有效性
- 遵守亚马逊
robots.txt规则,避免爬取禁止访问的内容
内容的提问来源于stack exchange,提问作者Robbie
相关产品推荐
相关产品推荐

