第8讲
整体课程知识点查看 :https://blog.csdn.net/j1451284189/article/details/128713764
本讲总结
数据存储简介
json模块使用
CSV 模块使用
爬虫案例-爬取游戏详情(未完成)
一、数据存储简介
json 轻量级数据交互格式 有且仅有一个[]或{} 不能注释 {'':'','':''}[{}]
csv 逗号分割值的文件格式
MongoDB
Redis
MySQL
二、json
轻量级数据交互格式
有且仅有一个[]或{},不能注释,最后一个数据不带','
(xml 重量级)
模块操作
#总结
list_data = json.loads(data) # 字符串 --》dict list
data = json.dumps(list_data) # dict list --》 字符串
json.dump(data, open('baidu.json', 'w')) # 字典/列表写入文件
json.load(open('detail.json','r')) # 读取文件 转为字典/列表
import json
# 1、字符串和dict list 转换
# 字符串 --》dict list
data = '[{"name":"linda", "age": 18}, {"name":"lily", "age": 20}]' #单括号在外,否则结果不对
list_data = json.loads(data)
print(data,type(data))
print(list_data,type(list_data))
# dict list --》 字符串
data = [{"name":"linda", "age": 18}, {"name":"lily", "age": 20}] #单括号在外,否则结果不对
list_data = json.dumps(data)
print(data,type(data))
print(list_data,type(list_data))
# 2、文件对象 和 dict list 转换
# 字典/列表写入文件
data = [{"name": "linda", "age": 18}, {"name":"lily", "age": 20}]
json.dump(data, open('baidu.json', 'w'))
# 读取文件 转为字典/列表
fp = open('detail.json','r')
result = json.load(fp)
print(result)
三、CSV
def day8_csv_show():
# 将json 中数据 转换成 csv文件
json_fp = open('detail.json','r',encoding='utf-8')
# 写入报错 UnicodeEncodeError: 'gbk' codec can't encode character '\xa0' in position 243: illegal multibyte sequence
# csv_fp = open('baidu.csv','w')
# 修改为 不报错,成功写入
csv_fp = open('baidu.csv', 'w', encoding='utf-8')
data_list = json.load(json_fp)
# 取出表头
sheet_title = data_list[0].keys()
# 取出内容
sheet_data = []
for data in data_list:
sheet_data.append(data.values())
print(sheet_title)
print(sheet_data)
# CSV写入器
writer = csv.writer(csv_fp)
# 写入表头
writer.writerow(sheet_title)
# 写入内容
writer.writerows(sheet_data)
# 保存并关闭文件
json_fp.close()
csv_fp.close()
四、案例爬取不思议迷宫冈布奥(待优化)
class Mystery_dungeon(object):
def __init__(self):
self.header = {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:106.0) Gecko/20100101 Firefox/106.0',
}
self.base_url = 'https://news.4399.com/slmbsymg/shilaimu/'
def get_response(self,url):
data = requests.get(url,headers=self.header).content.decode('gbk')
return data
def parse_gamboo_list(self, data):
soup = BeautifulSoup(data,'lxml')
gamboo_select = soup.select('.clist')[0].select('a')
gamboo_list = []
for gamboo in gamboo_select:
name = gamboo.get_text()
url = 'http:' + gamboo.get('href')
pic_src = gamboo.select('img')[0].get('src')
if pic_src == None:
pic_src = gamboo.select('img')[0].get('lz_src')
pic_src = 'http:' + pic_src
gamboo_list.append({'name':name, 'url':url, 'pic_src':pic_src})
print(name, url, pic_src)
return gamboo_list
def parse_gamboo_detail(self, data):
"""数据格式不好爬虫"""
soup = BeautifulSoup(data, 'lxml')
series = '' # 系列
camp = '' #阵营
get_method = '' #获取方法
talent = '' #天赋
skill = '' #技能
return
def save_data(self,data,file_path):
with open(file_path, 'w', encoding='utf-8') as f:
f.write(data)
def run(self):
# 获取冈布奥的响应
data = self.get_response(self.base_url)
gamboo_list = self.parse_gamboo_list(data)
for gamboo in gamboo_list:
gamboo_url = gamboo['url']
gamboo_data = self.get_response(gamboo_url)
gamboo_detail = self.parse_gamboo_detail(gamboo_data)
# self.save_data(data, 'baidu.html')
pass
Mystery_dungeon().run()