如何将爬取的加油站数据按单站一行最优存储为DataFrame?
如何将每个加油站的信息映射到DataFrame的单独一行
看起来你现在的代码会把所有加油站的<p>标签文本都平铺到一个列表里,导致最终的DataFrame每一行只是单个文本片段,而不是对应一个完整的加油站信息。咱们来调整下代码,让每个加油站的详情对应DataFrame的一行:
修正后的代码
import json import base64 import pandas as pd from bs4 import BeautifulSoup, NavigableString # 假设results是你之前获取的包含objectID的数据源 ids = results["objectID"].tolist() # 用来存储每个加油站的完整信息,每个元素是一个字典 gas_station_records = [] for idx, station_id in enumerate(ids): input_dict = { 'diff_time_zone': -1, 'objectID': station_id, 'poiposition': '50.5397219 8.7328552', 'stateAll': '2', 'category': 1, 'language': 'de', 'prognosis_offset': -1, 'windowSize': 305 } # 编码请求参数 encoded_input_string = json.dumps(input_dict, indent=2).encode('utf-8') encoded_input_string = base64.b64encode(encoded_input_string).decode("utf-8") # 发送请求并解析页面 r = s.post("https://example.me/getObject_detail.php", headers=headers, data="post=" + encoded_input_string) soup = BeautifulSoup(r.text, "lxml") inside_div = soup.find('div', class_='inside') # 收集当前加油站的所有详情文本 station_details = [] if inside_div: p_tags = inside_div.find_all("p") for tag in p_tags: # 提取文本并去除多余空格 txt = tag if isinstance(tag, NavigableString) else tag.text.strip() if txt: # 过滤空内容 station_details.append(txt) # 将当前加油站的信息整理成字典,方便转成DataFrame行 gas_station_records.append({ "objectID": station_id, "full_details": "\n".join(station_details) # 把所有详情用换行拼接,也可以保留列表形式 # 如果页面的p标签有固定含义(比如第一个是地址、第二个是电话),可以拆分字段: # "address": station_details[0] if len(station_details)>=1 else None, # "phone": station_details[1] if len(station_details)>=2 else None, }) # 生成最终的DataFrame,每个加油站对应一行 df = pd.DataFrame(gas_station_records) print(df.head())
关键改动说明
- 数据结构调整:把原来的
id_details改成存储字典的列表gas_station_records,每个字典对应一个加油站的完整信息,确保每个加油站在列表里是独立的元素。 - 单加油站信息收集:针对每个
objectID,先把该加油站的所有<p>文本收集到station_details列表里,再和objectID一起打包成字典存入列表。 - 过滤无效内容:添加了空文本过滤,避免把页面里的空行或者无意义空格存入数据。
额外小建议
- 如果爬取的加油站数量较多,建议在循环里加个
time.sleep(1)的延迟,避免频繁请求被目标网站封禁IP。 - 可以加个异常捕获,防止某个加油站的页面解析失败导致整个程序崩溃:
try: inside_div = soup.find('div', class_='inside') # 后续的详情收集逻辑... except Exception as e: print(f"处理加油站ID {station_id}时出错:{str(e)}") continue
内容的提问来源于stack exchange,提问作者N I
相关产品推荐
相关产品推荐

