鱼C论坛

 找回密码
 立即注册
查看: 1596|回复: 7

[已解决]Pandas保存excel的一些疑问 希望大佬帮忙~

[复制链接]
发表于 2022-8-13 12:14:51 | 显示全部楼层 |阅读模式
8鱼币
本帖最后由 admintest166 于 2022-8-13 12:18 编辑

在爬取完 安居客的数据以后 想保存为excel 方便做数据分析

但是我每爬取一页数据写入excel时 都会覆盖掉前一页的数据  想问下各位大佬有什么方法 可以不覆盖原有数据 新数据追加在后面的方法呢

  1. import requests
  2. from pyquery import PyQuery as pq
  3. import re
  4. import pandas as pd
  5. import time
  6. b=[]

  7. headers={
  8.     'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.5112.81 Safari/537.36 Edg/104.0.1293.47'
  9. }
  10. for i in range(1,3):
  11.     print(i)
  12.     url='https://gl.zu.anjuke.com/fangyuan/p{}/'.format(i)
  13.     request=requests.get(url,headers=headers).text
  14.     doc=pq(request)


  15.     #房品名称
  16.     Real_estate=[]
  17.     #a=doc('a .strongbox').eq(2).text()

  18.     #提取房品名称


  19.     a=doc('.zu-info a b').items()
  20.     for i in a:
  21.         Real_estate.append(i.text())

  22.     print(len(Real_estate))
  23.     #提取面积及楼层
  24.     b=doc('.details-item.tag').text().split(' ')
  25.     data = [x for i,x in enumerate(b) if x.find('\ue147') != -1]
  26.     #删除元素
  27.     for i in data:
  28.         b.remove(i)

  29.     print(b)
  30.     #提取租房小区名称
  31.     c=doc('.details-item a').text().split(' ')


  32.     #提取租房区域
  33.     d=doc('.zu-info address').text()

  34.     dd=re.findall(r'[\u4e00-\u9fa5]{2}-',d)

  35.     #提取租金
  36.     f=doc('.zu-side p b').text().split()
  37.     time.sleep(5)

  38.     pf1=pd.DataFrame()
  39.     pf1['房品名称']=Real_estate

  40.     pf2=pd.DataFrame()
  41.     pf2['面积及楼层']=b

  42.     pf3=pd.DataFrame()
  43.     pf3['小区名称']=c

  44.     pf4=pd.DataFrame()
  45.     pf4['房子区域']=dd

  46.     pf5=pd.DataFrame()
  47.     pf5['租金']=f

  48.     pf=pd.concat([pf1,pf2,pf3,pf4,pf5],axis=1)
  49.     pf.to_excel('E:\\pytest\\租房数据.xlsx',index=False)

  50.     print('保存完毕')



复制代码



下面是写入数据的情况 爬取了3页的数据 每页大概是60条数据 按道理来说应该有120以上的数据 但是只有60条 而且还覆盖了前一页的数据
最佳答案
2022-8-13 12:14:52
  1. import requests
  2. from pyquery import PyQuery as pq
  3. import re
  4. import pandas as pd
  5. import time
  6. b=[]
  7. mydata = [[].copy() for _ in range(5)]
  8. headers={
  9.     'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.5112.81 Safari/537.36 Edg/104.0.1293.47'
  10. }
  11. for i in range(1,3):
  12.     print(i)
  13.     url='https://gl.zu.anjuke.com/fangyuan/p{}/'.format(i)
  14.     request=requests.get(url,headers=headers).text
  15.     doc=pq(request)


  16.     #房品名称
  17.     Real_estate=[]
  18.     #a=doc('a .strongbox').eq(2).text()

  19.     #提取房品名称


  20.     a=doc('.zu-info a b').items()
  21.     for i in a:
  22.         Real_estate.append(i.text())

  23.     print(len(Real_estate))
  24.     #提取面积及楼层
  25.     b=doc('.details-item.tag').text().split(' ')
  26.     data = [x for i,x in enumerate(b) if x.find('\ue147') != -1]
  27.     #删除元素
  28.     for i in data:
  29.         b.remove(i)

  30.     print(b)
  31.     #提取租房小区名称
  32.     c=doc('.details-item a').text().split(' ')


  33.     #提取租房区域
  34.     d=doc('.zu-info address').text()

  35.     dd=re.findall(r'[\u4e00-\u9fa5]{2}-',d)

  36.     #提取租金
  37.     f=doc('.zu-side p b').text().split()
  38.     time.sleep(5)


  39.     # pf1=pd.DataFrame()
  40.     # pf1['房品名称']=Real_estate
  41.     #
  42.     # pf2=pd.DataFrame()
  43.     # pf2['面积及楼层']=b
  44.     #
  45.     # pf3=pd.DataFrame()
  46.     # pf3['小区名称']=c
  47.     #
  48.     # pf4=pd.DataFrame()
  49.     # pf4['房子区域']=dd
  50.     #
  51.     # pf5=pd.DataFrame()
  52.     # pf5['租金']=f
  53.     mydata[0].extend(Real_estate)
  54.     mydata[1].extend(b)
  55.     mydata[2].extend(c)
  56.     mydata[3].extend(dd)
  57.     mydata[4].extend(f)

  58. mydata_a = {
  59.     '房品名称':mydata[0],
  60.     '面积及楼层':mydata[1],
  61.     '小区名称':mydata[2],
  62.     '房子区域':mydata[3],
  63.     '租金':mydata[4],
  64. }

  65. pf=pd.DataFrame(mydata_a)
  66. pf.to_excel('E:\\pytest\\租房数据.xlsx',index=False)
  67. print('保存完毕')



复制代码
uTools_1660364211773.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-8-13 12:14:52 | 显示全部楼层    本楼为最佳答案   
  1. import requests
  2. from pyquery import PyQuery as pq
  3. import re
  4. import pandas as pd
  5. import time
  6. b=[]
  7. mydata = [[].copy() for _ in range(5)]
  8. headers={
  9.     'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.5112.81 Safari/537.36 Edg/104.0.1293.47'
  10. }
  11. for i in range(1,3):
  12.     print(i)
  13.     url='https://gl.zu.anjuke.com/fangyuan/p{}/'.format(i)
  14.     request=requests.get(url,headers=headers).text
  15.     doc=pq(request)


  16.     #房品名称
  17.     Real_estate=[]
  18.     #a=doc('a .strongbox').eq(2).text()

  19.     #提取房品名称


  20.     a=doc('.zu-info a b').items()
  21.     for i in a:
  22.         Real_estate.append(i.text())

  23.     print(len(Real_estate))
  24.     #提取面积及楼层
  25.     b=doc('.details-item.tag').text().split(' ')
  26.     data = [x for i,x in enumerate(b) if x.find('\ue147') != -1]
  27.     #删除元素
  28.     for i in data:
  29.         b.remove(i)

  30.     print(b)
  31.     #提取租房小区名称
  32.     c=doc('.details-item a').text().split(' ')


  33.     #提取租房区域
  34.     d=doc('.zu-info address').text()

  35.     dd=re.findall(r'[\u4e00-\u9fa5]{2}-',d)

  36.     #提取租金
  37.     f=doc('.zu-side p b').text().split()
  38.     time.sleep(5)


  39.     # pf1=pd.DataFrame()
  40.     # pf1['房品名称']=Real_estate
  41.     #
  42.     # pf2=pd.DataFrame()
  43.     # pf2['面积及楼层']=b
  44.     #
  45.     # pf3=pd.DataFrame()
  46.     # pf3['小区名称']=c
  47.     #
  48.     # pf4=pd.DataFrame()
  49.     # pf4['房子区域']=dd
  50.     #
  51.     # pf5=pd.DataFrame()
  52.     # pf5['租金']=f
  53.     mydata[0].extend(Real_estate)
  54.     mydata[1].extend(b)
  55.     mydata[2].extend(c)
  56.     mydata[3].extend(dd)
  57.     mydata[4].extend(f)

  58. mydata_a = {
  59.     '房品名称':mydata[0],
  60.     '面积及楼层':mydata[1],
  61.     '小区名称':mydata[2],
  62.     '房子区域':mydata[3],
  63.     '租金':mydata[4],
  64. }

  65. pf=pd.DataFrame(mydata_a)
  66. pf.to_excel('E:\\pytest\\租房数据.xlsx',index=False)
  67. print('保存完毕')



复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-8-13 12:44:30 | 显示全部楼层
要么前后数据合并成一个,然后最后一次写入
要么用open或者xwl追加写入
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-8-13 12:57:11 | 显示全部楼层
多加一条
  1. writer = pd.ExcelWriter(表格名)
  2. pf.to_excel(writer, sheet_name='sheet1')
  3. writer.save()
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-8-13 13:14:40 | 显示全部楼层
你的pf.to_excel是在for循环里面的,所以最终保存的只有一页数据。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-8-13 23:25:48 | 显示全部楼层
theS 发表于 2022-8-13 13:14
你的pf.to_excel是在for循环里面的,所以最终保存的只有一页数据。

如果不在for 循环里面 也是只有一页的数据
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-8-13 23:44:16 | 显示全部楼层

试了 还是会覆盖前一页的数据
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-8-14 05:18:31 | 显示全部楼层
另外,你这里range(1,3) 爬取的只有2页,而不是3页。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-6-7 11:39

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表