如何让字典各键值长度一致?解决爬虫转DataFrame错位问题
解决公寓爬取数据错位问题的方案
核心思路是为每条广告先初始化所有字段的默认值(None),再填充实际获取到的数据,确保每个字段的列表长度完全一致,避免DataFrame转换时错位。
具体修改步骤
- 提前定义所有需要爬取的字段列表(包含你提到的100+个键)
- 初始化字典时为每个字段创建空列表
- 每条广告先生成一个含所有字段、默认值为None的临时字典
- 将当前广告能获取到的字段值更新到临时字典
- 把临时字典的所有值依次追加到总字典对应的列表中
修改后的完整代码
import pandas as pd from selenium import webdriver from selenium.webdriver.chrome.service import Service as ChromeService from webdriver_manager.chrome import ChromeDriverManager from time import sleep from bs4 import BeautifulSoup # 1. 定义所有需要爬取的字段(补充你的100+个键) REQUIRED_FIELDS = [ 'URL', 'price', 'location', 'zip code', 'number of floors', # 在这里添加其他所有需要的字段 ] # 2. 初始化总字典:每个字段对应一个空列表 all_data = {field: [] for field in REQUIRED_FIELDS} counter = 1 url_list = [] # 这里替换成你的实际URL列表 # 优化:把driver初始化放到循环外,避免重复启动浏览器 driver = webdriver.Chrome(service=ChromeService(ChromeDriverManager().install())) driver.maximize_window() reversed_url_list = url_list[::-1] for url_in_list in reversed_url_list: # 3. 初始化当前广告的临时字典,所有字段默认None temp_data = {field: None for field in REQUIRED_FIELDS} # 先填充URL字段 temp_data['URL'] = url_in_list driver.get(url_in_list) sleep(3) html_source = driver.page_source soup = BeautifulSoup(html_source, 'html.parser') inactive_listing = soup.find(class_="listing-inactive") if inactive_listing: print(f'Skipping {url_in_list} due to inactivity.') else: try: # 4. 解析当前广告的字段,更新临时字典 for row in soup.find_all('div', class_='info-table__row'): key_element = row.find('dt', class_='info-table__title') value_element = row.find('dd', class_='info-table__value') if key_element and value_element: # 避免空元素报错 key = key_element.get_text(strip=True) value = value_element.get_text(strip=True) # 只更新我们需要的字段,避免无关字段混入 if key in REQUIRED_FIELDS: temp_data[key] = value except Exception as e: print(f'Error parsing {url_in_list}: {str(e)}') # 5. 将临时字典的值追加到总字典对应的列表中 for field in REQUIRED_FIELDS: all_data[field].append(temp_data[field]) print(f'{str(counter)} data has been scrapped. {str(len(url_list) - counter)} remaining.') counter +=1 driver.quit() # 转换为DataFrame,此时所有字段长度一致,不会错位 df = pd.DataFrame(all_data)
关键优化点说明
- 字段统一初始化:通过
REQUIRED_FIELDS确保所有需要的字段都被纳入,每条广告无论是否包含该字段,都会在总字典中追加对应的值(存在则为实际值,不存在则为None) - 浏览器复用:将driver初始化移到循环外,避免每次爬取都重新启动Chrome,大幅提升爬取效率
- 空值处理:添加
if key_element and value_element判断,避免因页面元素缺失导致的AttributeError - 字段过滤:只更新
REQUIRED_FIELDS内的字段,防止页面上的无关字段混入总字典
内容的提问来源于stack exchange,提问作者Michael
相关产品推荐
相关产品推荐

