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

多URL循环爬取时数据覆盖及URL重复问题求助

问题分析与修复方案

核心问题清单

  1. 重复请求同一页面:多余的for url in str(x):循环会遍历数字字符串的每个字符(比如x=20时,str(x)是"20",循环执行2次),导致每个页面被请求两次。
  2. URL拼接错误:目标URL结尾是0、20、40,原代码写成"https://xxxxx.com/0"+str(x),会生成https://xxxxx.com/020这类无效路径,应该直接使用x的值拼接。
  3. 文件覆盖写入:每次循环用'w'模式打开CSV,会清空之前的内容,且重复写入表头。
  4. 初始值逻辑错误:x=0后先执行x +=20,漏掉了第一页(x=0)的处理。
  5. 解析语法错误:baths的查找方式不符合BeautifulSoup语法,且解析结果未提取文本,存入的是标签对象而非实际数据。

修正后的代码

import requests
from bs4 import BeautifulSoup
from csv import writer

# 打开文件,写入表头后保持打开状态,后续直接追加数据
with open('C:\\Users\\hay\\Houses.csv', 'w', encoding='UTF8', newline="") as f:
    thewriter = writer(f)
    header = ['URL', 'address', 'price', 'beds', 'baths', 'ber']
    thewriter.writerow(header)

    x = 0
    while x < 100:
        # 生成正确的页面URL
        page_url = f"https://xxxxx.com/{x}"
        print(page_url)  # 打印验证URL

        page = requests.get(page_url)
        soup = BeautifulSoup(page.content, "html.parser")
        lists = soup.find_all('li', class_="SearchPage__Result-gg133s-2 djuMQD")

        for item in lists:
            # 提取房源详情URL
            detail_url = item.find('a').attrs['href']
            
            # 提取文本内容,处理元素不存在的情况
            address = item.find('p', class_="TitleBlock__Address-sc-1avkvav-8 dzihyY")
            address_text = address.text.strip() if address else "N/A"
            
            price = item.find('div', class_="TitleBlock__Price-sc-1avkvav-4 hiFkJc")
            price_text = price.text.strip() if price else "N/A"
            
            # 提取bed数量
            beds = item.find('p', class_="TitleBlock__CardInfoItem-sc-1avkvav-9 iLMdur")
            beds_text = beds.text.strip() if beds else "N/A"
            
            # 正确查找baths元素
            baths = item.find('p', {'data-testid': 'baths'}, class_="TitleBlock__CardInfoItem-sc-1avkvav-9 iLMdur")
            baths_text = baths.text.strip() if baths else "N/A"
            
            energyrating = item.find('div', class_="TitleBlock__BerContainer-sc-1avkvav-11 iXTpuT")
            ber_text = energyrating.text.strip() if energyrating else "N/A"

            info = [detail_url, address_text, price_text, beds_text, baths_text, ber_text]
            thewriter.writerow(info)
        
        # 处理完当前页面后,累加20进入下一页
        x += 20

关键修改说明

  • 移除多余的for url in str(x):循环,避免重复请求同一页面。
  • 调整URL拼接逻辑,直接使用x生成符合要求的页面路径。
  • 将文件打开操作移到循环外,一次性写入表头,后续循环直接追加数据,避免内容被覆盖。
  • 调整x的累加顺序,先处理x=0的页面,再执行累加,确保所有目标页面都被遍历。
  • 修复baths的查找语法,为每个字段添加空值处理逻辑,同时提取标签的文本内容,避免存入无效的标签对象。
  • 变量重命名list为item,避免与Python内置关键字冲突。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 23:40:35