找回密码
 立即注册

扫一扫,访问微社区

QQ登录

只需一步,快速开始

查看: 1924|回复: 2

[求助] 一个python字典保存csv文件的问题,请大神帮忙!!!

1

主题

1

帖子

1

积分

贫民

积分
1
dsct3003 发表于 2020-6-6 00:19:35 | 显示全部楼层 |阅读模式
刚学python 然后找了个二手房的网址练习,想把爬取到的字典内容写入到本地csv文件中,下面代码只能实现写一行,
下一条内容会覆盖上一条内容,有什么方法可以实现不覆盖写入。。。


coding='utf-8'
import requests
from bs4 import BeautifulSoup
import os
import numpy as np
from pandas import Series,DataFrame
import pandas as pd
import xlrd
Headers={'User-Agent':'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36'}

if not os.path.exists('./链家房产信息'):
    os.makedirs('./链家房产信息')#创建一个保存链家房产信息的文件夹

def get_pega_urls(url):

    respans=requests.get(url=url,headers=Headers)
    respans.encoding=respans.apparent_encoding
    soup=BeautifulSoup(respans.text,'lxml')
    urls=soup.find_all('a',{'class':"noresultRecommend"})#找到存放每一页信息的url的tag
    for i in urls:
        pega_urls=i['href']
        yemian=pega_info(pega_urls)
        print(yemian)
        data = pd.DataFrame([yemian])
        data2.to_csv("./data.csv", encoding="utf_8_sig")
        print("保存成功")
def pega_info(url):
    yemian={}
    respan=requests.get(url,headers=Headers)
    respan.encoding=respan.apparent_encoding
    soup=BeautifulSoup(respan.text,'lxml')

    info=soup.select('div.communityName')
    xqmz=info[0].select('a')[0].get_text()
    yemian['小区名称: ']=xqmz
    jbxx=soup.select('div.m-content')
    hx=jbxx[0].select('li')[0].get_text()
    yemian['房屋户型: ']=hx
    price=soup.select('div.price')
    qian1=price[0].select('span')[0].get_text()
    qian2=price[0].select('span')[1].get_text()
    qian=qian1+qian2
    yemian['价格: ']=qian
    lc=jbxx[0].select('li')[1].get_text()
    yemian['所在楼层: ']=lc
    mj=jbxx[0].select('li')[2].get_text()
    yemian['建筑面积: ']=mj
    jg=jbxx[0].select('li')[3].get_text()
    yemian['户型结构: ']=jg
    snmj=jbxx[0].select('li')[4].get_text()
    yemian['套内面积: ']=snmj
    lx=jbxx[0].select('li')[5].get_text()
    yemian['建筑类型: ']=lx
    cx=jbxx[0].select('li')[6].get_text()
    yemian['房屋朝向: ']=cx
    jg=jbxx[0].select('li')[7].get_text()
    yemian['建筑结构: ']=jg
    zxqk=jbxx[0].select('li')[8].get_text()
    yemian['装修情况: ']=zxqk
    th=jbxx[0].select('li')[9].get_text()
    yemian['梯户比例: ']=th
    gn=jbxx[0].select('li')[10].get_text()
    yemian['供暖方式: ']=gn
    bt=jbxx[0].select('li')[11].get_text()
    yemian['配备电梯: ']=bt


    return yemian

def spider():
    base_url='https://zz.lianjia.com/ershoufang/pg{}/'
    for i in range(1,8):
        url=base_url.format(str(i))#获取1—8页的url
        pega_urls=get_pega_urls(url)
        print('=*'*30)
        print('开始爬取第'+str(i)+'页')#输出一个分页标志

spider()
回复

使用道具 举报

0

主题

956

帖子

956

积分

圣骑士

积分
956
sheeboard 发表于 2020-6-8 21:32:23 | 显示全部楼层
data = pd.DataFrame([yemian])这里用data=data.append(pd.DataFrame(yemian)),data初始化时为空dataframe,还有data2是什么,没定义过。
回复 支持 反对

使用道具 举报

0

主题

1

帖子

1

积分

贫民

积分
1
米沃 发表于 2020-6-13 00:25:53 | 显示全部楼层
逻辑不对。在for i in urls:里你每获得一条记录就重写一次csv文件肯定是覆盖啊。 你把循环获得的数据先全部append到DataFrame,然后等遍历完了再一次性写csv文件。
就是 data.to_csv()要在放到for外面执行就可以了。
回复 支持 反对

使用道具 举报

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

本版积分规则

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