网页爬虫问题:如何将18页价格数据合并至同一DataFrame不覆盖
问题解决思路
你的代码只显示最后一页数据,是因为每次爬取新页面时prices变量会被重新覆盖,最终创建DataFrame时只用了最后一次的prices值。另外get_prices函数存在缩进问题,会导致每个商品仅提取最后一个价格(甚至可能出现逻辑错误)。
修改后的完整代码
import pandas as pd from bs4 import BeautifulSoup from requests import get # 确保导入请求方法 def get_basic_info(content_list): basic_info = [] for item in content_list: basic_info.append(item.find_all('h5')) return basic_info def get_prices(basic_info): prices = [] for item in basic_info: for i in item: price = i.find("span", attrs = {"class" : "price"}) if price: # 缩进调整到内部循环,确保每个h5标签的价格都被检查 prices.append(price.text.strip()) # 去除文本前后冗余空格 return prices # 初始化空列表,用来累计所有页面的价格数据 all_prices = [] # range左闭右开,爬18页需设置为1到19 for page in range(1, 19): # 用f-string简化URL拼接 base_url = f"https://www.easycar.tw/carList.php?Action=search&show=col&lifting=desc&year=&year1=&page={page}" response = get(base_url, headers=headers) html_soup = BeautifulSoup(response.text, 'html.parser') content_list = html_soup.find_all('div', attrs={'class': 'caption'}) basic_info = get_basic_info(content_list) current_page_prices = get_prices(basic_info) # 将当前页价格追加到总列表,而非覆盖 all_prices.extend(current_page_prices) # 用累计的所有价格创建DataFrame data = pd.DataFrame({"Price": all_prices}) print(data)
关键修改点
- 新增
all_prices空列表,专门存储所有页面的价格,避免循环时数据被覆盖 - 修正循环范围为
range(1,19),解决原代码少爬第18页的问题 - 调整
get_prices函数的缩进逻辑,确保每个商品的所有价格标签都被处理 - 使用
extend方法追加当前页价格,而非直接赋值,保证数据累计 - 用f-string重构URL,提升代码可读性
- 给价格文本添加
strip(),清理冗余空格或换行符
内容的提问来源于stack exchange,提问作者Renee
相关产品推荐
相关产品推荐

