多页爬取构建Pandas DataFrame仅得最后一页数据的问题求助
核心错误定位
- 全量结果存储变量位置错误:用于存放所有爬取行的
data列表被写在页码遍历的循环内部,每启动一次新页面的爬取流程,代码就会将data重新初始化为空列表,前几页已爬取的有效数据会被直接清空,最终自然只剩最后一次循环(最后一页)的爬取结果。 - 代码写法冗余错误:单行处理逻辑中
cols = data.append(...)属于无效代码,list.append()是无返回值的原地修改方法,将其结果赋值给cols没有任何实际作用,还容易误导逻辑判断。 - 请求地址格式问题:拼接的URL字符串开头带有多余空格,可能在部分场景下引发请求异常。
修复方案
- 将
data = []的初始化操作移到页码循环外部,仅在程序启动时创建一次空列表,后续每爬取到符合要求的行,直接将清洗后的数据追加到该列表中,全程不做重置。 - 修正行处理逻辑的赋值错误,去掉无意义的返回值赋值,直接执行追加操作即可。
- 移除URL开头的多余空格,保证请求地址格式合规。
修复后的可运行代码
import requests import pandas as pd from bs4 import BeautifulSoup headers = {'User-Agent': 'Mozilla/5.0'} # 全局初始化空存储列表,不在循环内重复初始化 data = [] for num in range(1, 3): # 移除URL开头的多余空格 url = 'https://biznes.interia.pl/gieldy/notowania-gpw/profil-akcji-grn,wId,7380,tab,przebieg-sesji,pack,{}'.format(num) response = requests.get(url, headers=headers) content = response.content soup = BeautifulSoup(content, "html.parser") notow = soup.find_all('table', class_='business-table-trading-table') # 筛选当前页包含"TRANSAKCJA"标识的行 rows = notow[0].select('tr:has(td:contains("TRANSAKCJA"))') for row in rows: cols = row.find_all('td') # 清洗单元格文本 cleaned_cells = [ele.text.strip() for ele in cols] # 过滤空值后直接追加到全局存储列表 data.append([ele for ele in cleaned_cells if ele]) # 全量页面爬取完成后再生成DataFrame df = pd.DataFrame(data) print(df)
内容的提问来源于stack exchange,提问作者Maciek Paciarski
相关产品推荐
相关产品推荐

