You need to enable JavaScript to run this app. Python爬取指定网站全分页公告详情,现有代码仅爬首页,需新增url列存为DataFrame
优惠活动
大模型
产品
解决方案
定价
更多

Python爬取指定网站全分页公告详情,现有代码仅爬首页,需新增url列存为DataFrame

现存问题排查

你当前代码只能爬取第一页、缺少详情url列的问题,来自3处逻辑疏漏:

  • 分页遍历被硬截断:get_follow_urls函数内写死遍历urls[:1],传入的6个分页地址(首页+index_1到index_5)只会取第一个解析,自然只能拿到第一页的公告内容
  • 来源字段未绑定:循环遍历每个公告详情链接时,没有把当前链接值对应写入每一行爬取结果
  • 表格解析逻辑冗余:循环pd.read_html返回的表格列表时,每次都强制取dfs[0]做转置截取,会导致重复处理、数据错位

调整方案

对应修改核心逻辑,即可实现全分页爬取+新增来源url列:

  • 移除分页遍历的截断代码,对传入的所有分页地址做全量解析,增加简单判断跳过无效空链接,避免程序中断
  • 每个详情页解析完成后,将当前访问的详情链接作为固定值赋值给结果表,作为来源url列
  • 重构结果收集逻辑,用列表统一存储每个详情页的结构化结果,最后一次性拼接为完整DataFrame,替代反复append的写法,兼容新版pandas特性

调整后完整可运行代码

import pandas as pd
import requests
from bs4 import BeautifulSoup

BASE_URL = "http://www.jscq.com.cn/dsf/zc/cjgg"

def get_main_urls() -> list:
    start_url = f"{BASE_URL}/index.html"
    # 保留原有分页构造逻辑,覆盖6个分页范围
    return [start_url] + [f"{BASE_URL}/index_{i}.html" for i in range(1, 6)]


def get_follow_urls(urls: list, session: requests.Session()) -> iter:
    # 移除原代码的[:1]截断,遍历全部分页
    for url in urls:
        resp = session.get(url)
        resp.encoding = "utf-8"
        body = resp.content
        s = BeautifulSoup(body, "lxml").find_all("td", {"width": "60%"})
        for a_td in s:
            a_tag = a_td.find('a')
            # 跳过没有有效链接的空td项
            if not a_tag or not a_tag.get("href"):
                continue
            yield f"{BASE_URL}{a_tag['href'][1:]}"

# 用列表收集所有爬取结果,替代反复append的方式
result_list = []

with requests.Session() as connection_session:
    # 配置通用请求头,避免被站点的反爬机制拦截
    connection_session.headers.update({
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36"
    })
    for follow_url in get_follow_urls(get_main_urls(), connection_session):
        resp = connection_session.get(follow_url)
        resp.encoding = "utf-8"
        dfs = pd.read_html(resp.content, flavor="bs4")
        # 仅处理页面上的核心信息表格,移除原循环dfs时反复取dfs[0]的冗余逻辑
        df = dfs[0].T.iloc[1:, :].copy()
        # 为当前页的所有结果新增来源url字段
        df["来源url"] = follow_url
        result_list.append(df)
        print(f"已完成爬取:{follow_url}")

# 统一拼接所有结果为完整DataFrame
updated_df = pd.concat(result_list, ignore_index=True)

# 列名增加来源url字段,和数据顺序对应
cols = ['项目编号', '转让/出租标的名称', '转让方/出租方名称', '转让标的评估价/年租金评估价(元)', 
        '转让底价/年租金底价(元)', '受让方/承租方名称', '成交价/成交年租金(元)', '成交日期', '来源url']
updated_df.columns = cols
updated_df.to_excel('./data.xlsx', index=False)

补充提示

  • 代码中新增的统一请求头配置,是爬取公开站点的基础配置,避免因为requests默认请求头被站点识别为异常流量拦截
  • 新增的空链接判断逻辑,在遇到页面结构调整、存在无效空单元格的情况时,程序会自动跳过而非直接报错中断
  • 采用pd.concat做结果拼接,是pandas官方推荐的实现方式,在处理大批量爬取数据时性能更优,也不会触发旧版append方法的弃用警告

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.29 08:06:01