You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter使用http与html包爬取亚马逊无结果问题求助

问题原因及修复方案

核心问题分析

  • 请求头缺失导致页面结构不符:亚马逊会根据请求的User-Agent返回不同结构的HTML,默认http.get发送的请求没有携带浏览器标识,会返回简化版或反爬页面,导致你手动查看的网页结构和实际请求到的结构不一致,选择器匹配不到任何元素。
  • CSS选择器过于依赖层级:你使用的h2 > a > span这类层级选择器非常脆弱,亚马逊页面结构经常调整,哪怕层级有一点变化就会失效。
  • 未处理空值与长度不匹配:即使匹配到元素,attributes['href']或attributes['src']可能为null,直接用!强制解包会潜在报错,且三个列表(titles/urls/urlImage)长度可能不一致,导致生成Article时出错。

修复方案

1. 添加请求头模拟浏览器

在http.get时携带User-Agent,让亚马逊返回和浏览器一致的页面结构:

final response = await http.get(
  url,
  headers: {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36',
  },
);

2. 使用更稳定的选择器定位商品项

先定位每个搜索结果的容器(亚马逊通常用data-component-type="s-search-result"标识),再从容器内提取信息,这样即使内部结构微调也不会完全失效:

// 先获取所有商品项
final items = document.querySelectorAll('[data-component-type="s-search-result"]');

List<Article> tempArticles = [];
for (var item in items) {
  // 提取标题
  final titleElement = item.querySelector('h2 > a > span');
  final title = titleElement?.innerHtml.trim() ?? '无标题';
  
  // 提取商品链接
  final linkElement = item.querySelector('h2 > a');
  final href = linkElement?.attributes['href'];
  final url = href != null ? 'https://www.amazon.com$href' : '';
  
  // 提取图片链接
  final imgElement = item.querySelector('img.s-image');
  final imgUrl = imgElement?.attributes['src'] ?? '';
  
  if (title.isNotEmpty && url.isNotEmpty) {
    tempArticles.add(Article(title: title, url: url, urlImage: imgUrl));
  }
}

setState(() {
  articles = tempArticles;
});

3. 添加错误处理与日志调试

在代码中添加日志,查看请求返回的HTML结构和匹配结果,方便排查问题:

// 在getWebsiteData中添加日志
print('Response status code: ${response.statusCode}');
print('Items found: ${items.length}');
// 可以打印部分HTML查看结构
print('First 500 chars of response: ${response.body.substring(0, 500)}');

完整修改后的getWebsiteData方法

Future<void> getWebsiteData() async {
  final url = Uri.parse('https://www.amazon.com/s?k=iphone');
  try {
    final response = await http.get(
      url,
      headers: {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36',
      },
    );
    
    if (response.statusCode != 200) {
      print('请求失败,状态码:${response.statusCode}');
      return;
    }

    dom.Document document = parser.parse(response.body);
    final items = document.querySelectorAll('[data-component-type="s-search-result"]');
    print('找到商品数量:${items.length}');

    List<Article> tempArticles = [];
    for (var item in items) {
      final titleElement = item.querySelector('h2 > a > span');
      final title = titleElement?.innerHtml.trim() ?? '无标题';
      
      final linkElement = item.querySelector('h2 > a');
      final href = linkElement?.attributes['href'];
      final url = href != null ? 'https://www.amazon.com$href' : '';
      
      final imgElement = item.querySelector('img.s-image');
      final imgUrl = imgElement?.attributes['src'] ?? '';
      
      if (title.isNotEmpty && url.isNotEmpty) {
        tempArticles.add(Article(title: title, url: url, urlImage: imgUrl));
      }
    }

    setState(() {
      articles = tempArticles;
    });
  } catch (e) {
    print('爬取过程出错:$e');
  }
}

注意事项

  • 亚马逊有反爬机制,频繁请求可能会被封禁IP,建议添加请求间隔,不要过度爬取。
  • 页面结构可能会随时变化,后续如果再次失效,需要重新查看返回的HTML结构调整选择器。

内容的提问来源于stack exchange,提问作者Savvy_coder

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 05:27:01