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
相关产品推荐
相关产品推荐

