我能发顶刊 2023-03-30 22:49 采纳率: 50%
浏览 22

DictWriter为何保存数据这么慢?

请教一下论坛的朋友们,为何我用这个 csv.DictWriter往excel里保存数据,速度超级慢?基本龟速,半天不出来,那里有问题嘛?如何提高写入速度呢?


import csv

f = open('spider.csv', mode='a', encoding='utf-8', newline='')
csv_writer = csv.DictWriter(f, fieldnames=[
 '交易时间',
 '交易权属',
 '供暖方式',
 '单价',
 '套内面积',
 '建成年代',
 '建筑类型',
 '建筑结构',
 '建筑面积',
 '总价',
 '户型结构',
 '房屋年限',
 '房屋户型',
 '房屋朝向',
 '房屋用途',
 '房权所属',
 '所在楼层',
 '挂牌价',
 '挂牌时间',
 '标题',
 '梯户比例',
 '装修情况',
 '配备电梯',
 '链家编号',    
])
csv_writer.writeheader()#写入表头
cookies = {}
headers = {}

for i in range(1, 2):
    time.sleep(3)
    url = f'https://pg{i}'
    
    
response= requests.get(url, cookies=cookies, headers=headers) #2.获取数据,获取网页源代码。(响应体的文本数据)所以是response.text,if你请求的是jason,那就是response.jason.if是图片格式,就写图片格式
#print(response.text)#基本爬其他网站也这样,可能改的地方就是headers请求头的完整性,url地址和get的方式。
#response.text获取的是一个字符串数据类型,if想直接解析字符串类型,是parsel是没有办法的。此时要用re正则表达式可以。因为parsel没法对字符串直接解析,
#所以,转一下类型。即:

selector = parsel.Selector(response.text)
href = selector.css('.listContent li .title a::attr(href)').getall()

for index in href: 
    html_data = requests.get(url=index, cookies=cookies, headers=headers).text
    selector_1 = parsel.Selector(html_data)#转换成字符串用于提取
    
    title = selector_1.css('.house-title .wrapper::text').get().replace(' ','')# 标题
    dealdate = selector_1.css('.house-title .wrapper span::text').get() #交易时间
    totalprice = selector_1.css('.price .dealTotalPrice i::text').get() +'万' #总价
    unitprice = selector_1.css('.price b::text').get() +'元'  #单价
    guapaiprice = selector_1.css('.msg  span:nth-child(1)  label::text').get() +'万'#挂牌价
    
    base_label = selector_1.css('.base .content li .label::text').getall()#键 把下面基本属性标签名称全部取出来。 
    base_content = selector_1.css('.base .content li::text').getall() #这里直接取li下面的text就不需要提取label标签了。
    base_content = [i.strip() for i in base_content]
    dit_1 = dict(zip(base_label, base_content)) #转成字典数据。why?因为待会要保存成表格数据。
    
    jiaoyi_label = selector_1.css('.transaction .content li .label::text').getall()#键 把下面交易属性标签名称全部取出来。 
    jiaoyi_content = selector_1.css('.transaction .content li::text').getall() #这里直接取li下面的text就不需要提取label标签了。
    jiaoyi_content = [i.strip() for i in jiaoyi_content]
    dit_2 = dict(zip(jiaoyi_label, jiaoyi_content)) #转成字典数据。why?因为待会要保存成表格数据。
    
    dit={
       '标题':title, 
       '总价':totalprice, 
       '单价':unitprice,
       '交易时间':dealdate,
       '挂牌价':guapaiprice,
        
        
    }
    dit.update(dit_1)
    dit.update(dit_2)
    #print(dit)
    
    csv_writer.writerow(dit)
    #pprint.pprint(dit)
  • 写回答

1条回答 默认 最新

  • bingbingyihao 2023-03-30 23:14
    关注

    回答:你这个是网页爬取数据哈,一般应该是网页爬取的问题,这个速度会占比更多,文件读写应该不会占用很多时间的;至于网页爬取的速度如何加快,这个你可以考虑多开几个脚本,然后让它们处理不同区段的内容,最后你再对文件综合一下即可

    评论

报告相同问题?

问题事件

  • 创建了问题 3月30日

悬赏问题

  • ¥15 无法输出helloworld
  • ¥15 高通uboot 打印ubi init err 22
  • ¥20 PDF元数据中的XMP媒体管理属性
  • ¥15 R语言中lasso回归报错
  • ¥15 网站突然不能访问了,上午还好好的
  • ¥15 有没有dl可以帮弄”我去图书馆”秒选道具和积分
  • ¥15 semrush,SEO,内嵌网站,api
  • ¥15 Stata:为什么reghdfe后的因变量没有被发现识别啊
  • ¥15 振荡电路,ADS仿真
  • ¥15 关于#c语言#的问题,请各位专家解答!