Pandas给现有DataFrame列追加内容时仅覆盖前100行问题求助
问题原因
- 语法使用错误:
df['rank'] =+ ranks等价于df['rank'] = ranks,是直接对rank列做覆盖赋值,而非追加数据。每次爬取的ranks只有单页100条数据,因此总DataFrame始终只有100行,旧数据会被新爬取的数据覆盖。 - 实现逻辑错误:分页爬取多页数据时,应先将单页的全量字段数据整理为临时结构,再追加到总DataFrame末尾,单独对某一列赋值无法实现行追加的效果。
- 分页判断逻辑bug:Selenium的
find_element方法找不到元素时会直接抛出异常,不会返回None,原有判断逻辑无法正常触发终止条件。
修复后代码
import functions import pandas as pd from time import sleep from selenium import webdriver from selenium.webdriver.firefox.options import Options from selenium.common.exceptions import NoSuchElementException pd.set_option('max_rows', 10) site = functions.pagina() # 浏览器配置 options = Options() options.headless = True driver = webdriver.Firefox(options=options) driver.get(site) print('Esperando 5s') sleep(5) # 初始化总DataFrame df = pd.DataFrame(columns = ['rank','nome','classe','item_lvl','servidor','mortes_temporada']) while True: try: # 查找下一页按钮,找不到就跳出循环 next_page = driver.find_element_by_css_selector('#pagination-hook > nav > ul > li:nth-child(2) > a') except NoSuchElementException: break print(driver.current_url[-6:].upper()) # 爬取当前页所有字段数据,可根据实际页面的列位置调整xpath ranks = [rank_page.text for rank_page in driver.find_elements_by_xpath('//div[4]//div[1]/table/tbody/tr/td[1]')] nomes = [nome.text for nome in driver.find_elements_by_xpath('//div[4]//div[1]/table/tbody/tr/td[2]')] classes = [classe.text for classe in driver.find_elements_by_xpath('//div[4]//div[1]/table/tbody/tr/td[3]')] item_lvls = [item.text for item in driver.find_elements_by_xpath('//div[4]//div[1]/table/tbody/tr/td[4]')] servidores = [serv.text for serv in driver.find_elements_by_xpath('//div[4]//div[1]/table/tbody/tr/td[5]')] mortes = [morte.text for morte in driver.find_elements_by_xpath('//div[4]//div[1]/table/tbody/tr/td[6]')] # 生成单页临时DataFrame page_df = pd.DataFrame({ 'rank': ranks, 'nome': nomes, 'classe': classes, 'item_lvl': item_lvls, 'servidor': servidores, 'mortes_temporada': mortes }) # 追加到总DataFrame df = pd.concat([df, page_df], ignore_index=True) # 点击下一页 driver.execute_script("arguments[0].click();", next_page) sleep(4) print('*' * 80) print(df) print('*' * 80) # 所有页爬取完后可按需保存数据 # df.to_csv('爬取结果.csv', index=False, encoding='utf-8-sig') driver.quit()
关键改动说明
- 新增异常捕获判断下一页是否存在,避免爬取到最后一页时报错终止
- 每次爬取单页所有列的完整数据,生成临时DataFrame后通过
pd.concat追加到总表末尾,ignore_index=True保证行索引连续不重复 - 移除了无意义的
driver.get(driver.current_url)重复加载当前页的逻辑
内容的提问来源于stack exchange,提问作者Breno
相关产品推荐
相关产品推荐

