邪恶贝利亚奥特曼 2026-01-24 15:36 采纳率: 0%
浏览 6

请问一下各位,为什么我这个爬虫抓取的数据是不断重复的

img

如图,我是哪里出问题了,自我感觉是循环这一块没写对,该怎么改,这个代码写的是一个翻页抓取的爬虫

  • 写回答

3条回答 默认 最新

  • 檀越@新空间 2026-01-24 15:37
    关注

    下午好🌅🌅🌅
    本答案参考通义千问

    你提到爬虫抓取的数据是不断重复的,这通常意味着你的爬虫在翻页过程中没有正确处理下一页的请求,或者循环逻辑中存在错误,导致爬虫一直在抓取相同的内容。


    一、可能的原因分析

    1. 翻页逻辑错误

      • 没有正确构造下一页的URL,导致每次请求都返回同样的页面。
      • 翻页参数(如 page=1, page=2)未递增或未更新。
    2. 循环条件设置不当

      • 循环次数未限制,导致无限循环。
      • 判断是否还有下一页的条件不准确。
    3. 数据去重机制缺失

      • 抓取到的数据没有进行去重处理,导致重复内容被保存。
    4. 网页结构变化

      • 页面结构发生变化,导致解析逻辑失效,爬虫误以为还有新数据。

    二、解决方案(详细步骤)

    1. 检查翻页逻辑

    • 确保 URL 是动态生成的,例如:

      base_url = "https://example.com/page/"
      for page in range(1, 10):  # 假设最多翻10页
          url = base_url + str(page)
          # 发起请求
      
    • 确认是否有“下一页”按钮或链接,如果有的话,可以提取该链接并继续请求。

    2. 验证翻页参数是否正确递增

    • 如果使用 requests.get(url),请确保每次请求的 url 不同。
    • 可以在控制台打印出每次请求的 url,查看是否重复。

    3. 添加判断是否还有下一页的逻辑

    • 例如,通过判断是否存在“下一页”的按钮或链接:
      from bs4 import BeautifulSoup
      import requests
      
      def get_next_page(soup):
          next_link = soup.select_one('a.next')  # 根据实际网页结构调整选择器
          if next_link:
              return next_link['href']
          return None
      
      current_url = "https://example.com/page/1"
      while current_url:
          response = requests.get(current_url)
          soup = BeautifulSoup(response.text, 'html.parser')
          # 处理当前页面数据
          current_url = get_next_page(soup)
      

    4. 添加数据去重机制

    • 使用集合(set())来存储已抓取的 ID 或标题,避免重复保存:
      scraped_ids = set()
      
      for item in items:
          item_id = item.get('id')  # 根据实际数据结构调整
          if item_id not in scraped_ids:
              scraped_ids.add(item_id)
              # 保存数据
      

    5. 调试与日志记录

    • 在关键位置添加 print() 或使用 logging 模块输出当前抓取的页面信息和数据内容,便于排查问题:
      print(f"正在抓取页面: {current_url}")
      print(f"抓取到的数据: {items}")
      

    三、示例代码修改建议

    假设你原来的代码如下:

    import requests
    from bs4 import BeautifulSoup
    
    url = "https://example.com/page/1"
    response = requests.get(url)
    soup = BeautifulSoup(response.text, 'html.parser')
    
    for item in soup.select('.item'):
        print(item.text)
    

    这段代码只抓取了第一页,不会自动翻页。如果你希望翻页,应该改写为:

    import requests
    from bs4 import BeautifulSoup
    
    base_url = "https://example.com/page/"
    
    scraped_ids = set()
    
    for page in range(1, 11):  # 假设最多翻10页
        url = base_url + str(page)
        print(f"正在抓取页面: {url}")
        
        response = requests.get(url)
        soup = BeautifulSoup(response.text, 'html.parser')
        
        items = soup.select('.item')
        
        for item in items:
            item_id = item.get('id')  # 根据实际情况获取唯一标识
            if item_id and item_id not in scraped_ids:
                scraped_ids.add(item_id)
                print(item.text)
    

    四、总结

    | 问题 | 解决方案 | |------|----------| | 翻页逻辑错误 | 确保 URL 动态生成,使用正确的翻页参数 | | 循环条件错误 | 添加判断是否还有下一页的逻辑 | | 数据重复 | 使用集合进行去重处理 | | 调试困难 | 添加打印或日志输出 |


    如果你能提供具体的代码片段或截图,我可以进一步帮你定位问题所在。欢迎补充更多细节!

    评论

报告相同问题?

问题事件

  • 创建了问题 1月24日