前面我们已经爬取了豆瓣电影,豆瓣读书,小猪租房的数据,那有人就有疑问了,我爬取那么多数据,怎么把他们保存在本地呢?今天我们就来讲讲如何把爬取的数据信息存储到本地。
###一、pyhton open() 方法
写文件时,我们主要用到with open() 的方法。
with open(name,mode,encoding) as file:
file.write() #注意这里有缩进哦
- name : 包含文件名称的字符串,比如:‘MTbaby.txt’
- mode : 决定了打开文件的模式,只读、写入、追加等。常见的模式如下:
参数 | 用法 |
---|---|
r | 只读,若不存在文件会报错 |
w | 只写,若不存在文件会自动创建 |
a | 附加到文件末尾 |
跟多模式请参考http://blog.youkuaiyun.com/mtbaby/article/details/79141455
- encoding : 表示我们要写入数据的编码方式,一般为uft-8或者gbk。
- file:表示我们在代码中对文件的命名。
用我们前面爬的豆瓣读书的信息来操作一下
#-*- coding:utf-8 -*-
import requests
from lxml import etree
import time
with open(r'C:/Users/nicker/Desktop/aa.txt','w',encoding='utf-8') as F:
for i in range(10):
url2 = 'https://book.douban.com/top250?start{}'.format(i*25)
data2 = requests.get('https://book.douban.com/top250').text
f = etree.HTML(data2)
books = f.xpath('//*[@id="content"]/div/div[1]/div/table')
for div in books:
title = div.xpath('./tr/td[2]/div[1]/a/@title')[0]
score = div.xpath('./tr/td[2]/div[2]/span[2]/text()')[0]
comment = div.xpath('./tr/td[2]/p[2]/span/text()')[0]
num = div.xpath('./tr/td[2]/div[2]/span[3]/text()')[0].strip('(').strip().strip(')')
href = div.xpath('./tr/td[2]/div[1]/a/@href')[0]
time.sleep(1) #加个睡眠,防止IP被封
if len(comment)>0:
#print('{}-->{}-->{}-->{}-->{}'.format(title,score,comment,num,href))
F.write("{}-->{}-->{}-->{}-->{}\n".format(title,score,comment,num,href))
else:
#print('{}-->{}-->{}-->{}'.format(title,score,num,href))
F.write("{}-->{}-->{}-->{}\n".format(title,score,num,href))
F.flush()#保证数据及时从缓存写入本地
- C:/Users/nicker/Desktop/aa.txt
将写入的文件名 aa.txt ,如果没有将自动创建。
注意我路径前面加了一个 r ,表示目录路径,有python基础的同学应该知道,不要被转义了哦。
如果这里不加路径,它将默认保存在你当前的工作目录中。 - ‘w’:只写的模式,如果没有文件将自动创建。
- encoding=‘utf-8’:指定写入文件的编码为‘utf-8’;
- F.write("{}–>{}–>{}–>{}–>{}\n".format(title,score,comment,num,href)):将title,score,comment,num,href的值写入文件。
看看数据存储到文件中是什么样子的:
当然,你也可以将文件存储为csv的类型:
#-*- coding:utf-8 -*-
import requests
from lxml import etree
import time
with open(r'C:/Users/nicker/Desktop/bb.csv','w',encoding='utf-8') as F:
for i in range(10):
url2 = 'https://book.douban.com/top250?start{}'.format(i*25)
data2 = requests.get('https://book.douban.com/top250').text
f = etree.HTML(data2)
books = f.xpath('//*[@id="content"]/div/div[1]/div/table')
for div in books:
title = div.xpath('./tr/td[2]/div[1]/a/@title')[0]
score = div.xpath('./tr/td[2]/div[2]/span[2]/text()')[0]
comment = div.xpath('./tr/td[2]/p[2]/span/text()')[0]
num = div.xpath('./tr/td[2]/div[2]/span[3]/text()')[0].strip('(').strip().strip(')')
href = div.xpath('./tr/td[2]/div[1]/a/@href')[0]
time.sleep(1) #加个睡眠,防止IP被封
if len(comment)>0:
#print('{}-->{}-->{}-->{}-->{}'.format(title,score,comment,num,href))
F.write("{},{},{},{},{}\n".format(title,score,comment,num,href))
else:
#print('{}-->{}-->{}-->{}'.format(title,score,num,href))
F.write("{},{},{},{}\n".format(title,score,num,href))
F.flush()#保证数据及时从缓存写入本地
另外,需要注意的是:csv每个字段之前要用逗号隔开,所以这里把之前的 ‘—>’ 改成了空格。
csv文件你可以用notpad++打开,也可以用exal打开。
下一节动态类数据抓取