—— 如果需要将数据存储到文件,为了数据的可读性,可以按行写入。常用的文件类型:txt、csv、Excel
文本文件的写入和读取
例子:
import json
"""字符串写入"""
for i in range(10):
with open('a.txt', 'a') as file:
file.write(str(i)+'\n')
"""字典或列表转换成json写入"""
ips = [
{"https": "https:116.208.48.141:61234"},
{"https": "https:113.120.32.64:9999"},
{"https": "https:110.86.139.150:9999"},
{"https": "https:175.153.21.87:61234"},
{"https": "https:124.135.120.48:61234"},
{"https": "https:183.166.137.237:61234"},
{"https": "https:218.22.7.62:53281"},
{"https": "https:171.221.203.130:10184"},
{"https": "https:113.120.32.64:9999"},
{"https": "https:140.143.48.49:1080"},
{"https": "https:61.128.208.94:3128"},
{"https": "https:122.136.212.132:53281"},
{"https": "https:175.153.21.87:61234"},
{"https": "https:112.85.150.176:9999"},
{"https": "https:101.27.20.167:61234"},
{"https": "https:112.85.150.176:9999"},
]
for ip in ips:
with open('b.txt', 'a') as file:
file.write(json.dumps(ip)+'\n')
"""按行读取"""
with open('b.txt', 'r') as file:
lines = file.readlines()
for line in lines: # 遍历
ip = json.loads(line.strip())
print(ip)
注:json.dumps
序列化时对中文默认使用的ascii编码。想输出真正的中文需要指定ensure_ascii=False
例子:
with open('result.txt', 'a', encoding='utf-8') as f:
f.write(json.dumps(content, ensure_ascii=False)+'\n')
csv文件的写入和读取
爬取豆瓣电影 Top 250 的例子,并保存为csv文件
from fake_useragent import UserAgent
from lxml import etree
import requests
import csv
import time
def crawler(url):
"""爬取指定url页面信息"""
try:
headers = {'User-Agent': UserAgent().chrome}
res = requests.get(url, headers=headers)
res.raise_for_status()
return res.text
except:
return None
def parse(content):
"""解析爬取网页中的内容,并返回字段结果"""
# =======使用xpath解析====================
# 解析HTML文档,返回根节点对象
html = etree.HTML(content)
# 获取网页中所有标签并遍历输出标签名
items = html.xpath('//div[@class="item"]')
# 遍历封装数据并返回
for item in items:
yield {
'index': item.xpath('.//div/em[@class=""]/text()')[0],
'title': item.xpath('.//span[@class="title"][1]/text()')[0],
'actor': item.xpath('.//p[@class=""]/text()[1]')[0].strip(),
'score': item.xpath('.//span[@class="rating_num"]/text()')[0],
}
def save(items):
"""执行文件追加写操作"""
for item in items:
print(item)
# 写入行内容
writer.writerow([item['index'], item['title'], item['actor'], item['score']])
def main():
"""主程序函数,负责调度执行爬虫处理"""
for i in range(0, 250, 25):
url = f'https://movie.douban.com/top250?start={i}'
html = crawler(url)
# 判断是否爬取到数据,并调用解析函数
if html:
items = parse(html)
# 执行文件追加写操作
save(items)
# 减慢爬虫速度
time.sleep(1)
if __name__ == '__main__':
"""创建csv文件对象"""
with open('Top250.csv', 'w', newline='', encoding='utf-8-sig') as f:
writer = csv.writer(f)
"""写入头部信息"""
writer.writerow(['排名', '电影', '主演', '评分'])
"""调用主函数爬取数据"""
main()
csv文件的读取
import csv
with open('Top250.csv', 'r', newline='', encoding='utf-8-sig') as f:
reader = csv.reader(f)
for line in reader:
print(line)
Excel文件的写入和读取
一个Excel文档也称为一个工作薄(workbook),每个工作薄里可以有多个工作表(wordsheet),当前打开的工作表又叫活动表
每个工作表里有行和列,特定的行与列相交的方格称为单元格(cell)。比如上图第A列和第1行相交的方格我们可以直接表示为A1单元格
Excel文件写入的例子:
import openpyxl
# 创建新的workbook(工作薄)对象,就是创建新的空的Excel文件
wb = openpyxl.Workbook()
# 创建完新的工作薄后,还得创建工作表
sheet = wb.create_sheet('工作表1', 0)
sheet2 = wb.create_sheet('工作表2', 1)
"""添加完工作表,就可以操作单元格,往单元格里写入内容"""
sheet['A1'] = '漫威宇宙'
# 把'漫威宇宙'赋值给第一个工作表的A1单元格,就是往A1的单元格中写入了'漫威宇宙'
"""如果想往工作表里写入一行内容的话,就得用到append函数"""
row = ['美国队长', '钢铁侠', '蜘蛛侠']
# 把我们想写入的一行内容写成列表,赋值给row
sheet.append(row)
# 用sheet.append()就能往表格里添加这一行文字
"""成功写入后,记得保存这个Excel文件,不然就白写啦"""
wb.save('Marvel.xlsx')
Excel文件读取的例子:
import openpyxl
wb = openpyxl.load_workbook('Marvel.xlsx')
# 调用 openpyxl.load_workbook()函数,打开'Marvel.xlsx'文件
sheet = wb['工作表1']
# 获取'Marvel.xlsx'工作薄中名为'工作表1'的工作表。
"""如果不知道工作薄到底有几个工作表,可以把工作表的名字都打印出来"""
sheet_names = wb.sheetnames
print(sheet_names)
A1 = sheet['A1'].value
print(A1)
# 打印出A1单元格的值