• 章节七:csv&excel


    章节七:csv&excel

    1. 存储数据的方式

    其实,常用的存储数据的方式有两种——存储成csv格式文件、存储成Excel文件(不是复制黏贴的那种)。

    我猜想,此时你会想问“csv”是什么,和Excel文件有什么区别?

    前面,我有讲到json是特殊的字符串。其实,csv也是一种字符串文件的格式,它组织数据的语法就是在字符串之间加分隔符——行与行之间是加换行符,同行字符之间是加逗号分隔。

    它可以用任意的文本编辑器打开(如记事本),也可以用Excel打开,还可以通过Excel把文件另存为csv格式(因为Excel支持csv格式文件)。

    运行以下三行代码,你就能直观清晰地知道csv是什么。

    image.png-148.5kB

    将我们刚刚写入的csv文件下载到本地电脑,再用记事本打开,你会看到:

    image.png-40.7kB

    用Excel打开,则是这样的:

    image.png-86.4kB

    发现了吗?csv文件里的逗号可以充当分隔同行字符串的作用。

    为什么要加分隔符?因为不加的话,数据都堆在一起,会显得杂乱无章,也不方便我们之后提取和查找。这也是一种让数据变得有规律的组织方式。

    另外,用csv格式存储数据,读写比较方便,易于实现,文件也会比Excel文件小。但csv文件缺少Excel文件本身的很多功能,比如不能嵌入图像和图表,不能生成公式。

    至于Excel文件,不用我多说你也知道就是电子表格。它有专门保存文件的格式,即xls和xlsx(Excel2003版本的文件格式是xls,Excel2007及之后的版本的文件格式就是xlsx)。

    image.png-38.1kB

    好啦,csv和Excel文件你都清楚了,我们可以继续学习存储数据的基础知识——如何写入与读取csv格式文件和Excel文件的数据。

    2. 存储数据的基础知识

    image.png-29.6kB

    存储成csv格式文件和存储成Excel文件,这两种不同的存储方式需要引用的模块也是不同的。操作csv文件我们需要借助csv模块;操作Excel文件则需要借助openpyxl模块。

    放心,两个模块都并不复杂。本节的实操环节我们会用到Excel,先来一起学习一下。

    2.1 基础知识:Excel写入与读取

    好。请你跟着我的节奏,我们一起搞清楚如何往Excel格式文件写入和读取数据。

    不过,在开始讲Excel文件的写入与读取前,我们还得稍微了解一下Excel文档的基本概念(考验你对Excel有多了解的时候到了٩(๑❛ᴗ❛๑)۶)。

    【提问抢答环节】请问工作薄、工作表和单元格在Excel里分别是指什么?

    image.png-301.9kB

    一个Excel文档也称为一个工作薄(workbook),每个工作薄里可以有多个工作表(worksheet),当前打开的工作表又叫活动表。

    每个工作表里有行和列,特定的行与列相交的方格称为单元格(cell)。比如上图第A列和第1行相交的方格我们可以直接表示为A1单元格。

    清楚了Excel的基础概念,我们可以来说下openpyxl模块是怎么操作Excel文件的了。照例先说写入后说读取。

    提醒:我们得先提前安装好openpyxl模块。课程的终端是已经安装好了,如果你想要在本地操作的话,就需要在本地上安装。(安装方法:window电脑:在终端输入命令:pip install openpyxl,按下enter键;mac电脑:在终端输入命令:pip3 install openpyxl,按下enter键)

    装好openpyxl模块后,首先要引用它,然后通过openpyxl.Workbook()函数就可以创建新的工作薄,代码如下:

    1. # 引用openpyxl
    2. import openpyxl
    3. # 利用openpyxl.Workbook()函数创建新的workbook(工作薄)对象,就是创建新的空的Excel文件。
    4. wb = openpyxl.Workbook()

    创建完新的工作薄后,还得获取工作表。不然程序会无所适从,不知道要把内容写入哪张工作表里。

    1. # wb.active就是获取这个工作薄的活动表,通常就是第一个工作表。
    2. sheet = wb.active
    3. # 可以用.title给工作表重命名。现在第一个工作表的名称就会由原来默认的“sheet1”改为"new title"。
    4. sheet.title = 'new title'

    image.png-18.8kB

    添加完工作表,我们就能来操作单元格,往单元格里写入内容。

    1. # 把'漫威宇宙'赋值给第一个工作表的A1单元格,就是往A1的单元格中写入了'漫威宇宙'
    2. sheet['A1'] = '漫威宇宙'

    往单元格里写入内容只要定位到具体的单元格,如A1(根据Excel的坐标,A1代表第一列第一行相交的单元格),然后给这个单元格赋值即可。

    如果我们想往工作表里写入一行内容的话,就得用到append函数。

    1. # 把我们想写入的一行内容写成列表,赋值给row
    2. row = ['美国队长','钢铁侠','蜘蛛侠']
    3. # 用sheet.append()就能往表格里添加这一行文字。
    4. sheet.append(row)

    如果我们想要一次性写入的不止一行,而是多行内容,又该怎么办?请你花10s思考一下这个问题。

    想出结果了吗?(提示:用for循环)

    1. # 先把要写入的多行内容写成列表,再放进大列表里,赋值给rows
    2. rows = [['美国队长','钢铁侠','蜘蛛侠'],['是','漫威','宇宙', '经典','人物']]
    3. # 遍历rows,同时把遍历的内容添加到表格里,这样就实现了多行写入。
    4. for i in rows:
    5. sheet.append(i)
    6. # 打印rows
    7. print(rows)

    成功写入后,我们千万要记得保存这个Excel文件,不然就白写啦!

    1. # 保存新建的Excel文件,并命名为“Marvel.xlsx”
    2. wb.save('C://Users//17310//Desktop//ceshi//Marvel.xlsx')

    这样,Excel文件写入的代码我们就写好了,可以运行一下代码。

    image.png-210.6kB

    打开Excel文件查看结果

    image.png-40.9kB

    恭喜你,Excel文件的写入已经学会啦!此处应该有掌声(激动)!

    image.png-23.8kB

    下面,我们来搞定存储数据的另一个基础知识点——Excel文件的读取。

    请你运行一下代码,我们来读取刚刚写入内容的“Marvel.xlsx”文件。

    image.png-299.2kB

    1. import openpyxl
    2. # 写入的代码:
    3. wb = openpyxl.Workbook()
    4. sheet = wb.active
    5. sheet.title = 'new title'
    6. sheet['A1'] = '漫威宇宙'
    7. rows = [['美国队长','钢铁侠','蜘蛛侠','雷神'],['是','漫威','宇宙', '经典','人物']]
    8. for i in rows:
    9. sheet.append(i)
    10. print(rows)
    11. wb.save('C://Users//17310//Desktop//ceshi//Marvel.xlsx')
    12. # 读取的代码:
    13. wb = openpyxl.load_workbook('C://Users//17310//Desktop//ceshi//Marvel.xlsx')
    14. sheet = wb['new title']
    15. sheetname = wb.sheetnames
    16. print(sheetname)
    17. A1_cell = sheet['A1']
    18. A1_value = A1_cell.value
    19. print(A1_value)

    程序打印出来的['new title']是工作表的名字;“漫威宇宙”是我们刚写入A1单元格的文字。

    一行行来看这个读取Excel文件的代码:

    第14行代码:调用openpyxl.load_workbook()函数,打开“Marvel.xlsx”文件。

    第15行代码:获取“Marvel.xlsx”工作薄中名为“new title”的工作表。

    第16、17行代码:sheetnames是用来获取工作薄所有工作表的名字的。如果你不知道工作薄到底有几个工作表,就可以把工作表的名字都打印出来。

    第18-20行代码:把“new title”工作表中A1单元格赋值给A1_cell,再利用单元格value属性,就能打印出A1单元格的值。

    学会Excel写入后,读取Excel还是比较简单的对吧?

    如果你对openpyxl模块感兴趣,想要有更深入的了解的话,推荐阅读openpyxl模块的官方文档:https://openpyxl.readthedocs.io/en/stable/

    2.2 基础知识:csv写入与读取

    接下来,只要我们再搞定csv文件的写入与读取,存储数据就不再是什么难事。

    好。现在请你跟着我的节奏,我们一起先搞清楚如何往csv格式文件写入数据。

    首先,我们要引用csv模块。因为Python自带了csv模块,所以我们不需要安装就能引用它。

    你是不是会困惑,明明前面csv写入我们可以直接用open函数来写,为什么现在还要先引用csv模块?答案:直接运用别人写好的模块,比我们使用open()函数来读写,语法更简洁,功能更强大,待会你就能感受到。那么,何乐而不为?

    1. # 引用csv模块。
    2. import csv
    3. # 创建csv文件,我们要先调用open()函数,传入参数:文件名“demo.csv”、写入模式“w”、newline=''、encoding='utf-8'
    4. csv_file = open('demo.csv','w',newline='',encoding='utf-8')

    然后,我们得创建一个新的csv文件,命名为“demo.csv”。

    “w”就是write,即文件写入模式,它会以覆盖原内容的形式写入新添加的内容。

    友情附上一张文件读写模式表。你不需要背下来,之后不知道用什么模式时查查表就可以了。

    image.png-127.7kB

    newline=' '参数的原因是,可以避免csv文件出现两倍的行距(就是能避免表格的行与行之间出现空白行)。加encoding='utf-8',可以避免编码问题导致的报错或乱码。

    image.png-45kB

    创建完csv文件后,我们要借助csv.writer()函数来建立一个writer对象。

    1. # 引用csv模块。
    2. import csv
    3. # 调用open()函数打开csv文件,传入参数:文件名“demo.csv”、写入模式“w”、newline=''、encoding='utf-8'。
    4. csv_file = open('demo.csv','w',newline='',encoding='utf-8')
    5. # 用csv.writer()函数创建一个writer对象。
    6. writer = csv.writer(csv_file)

    那怎么往csv文件里写入新的内容呢?答案是——调用writer对象的writerow()方法。

    1. # 借助writerow()函数可以在csv文件里写入一行文字 "电影"和“豆瓣评分”。
    2. writer.writerow(['电影','豆瓣评分'])

    提醒:writerow()函数里,需要放入列表参数,所以我们得把要写入的内容写成列表。就像['电影','豆瓣评分']。

    我们试着再写入两部电影的名字和其对应的豆瓣评分,最后关闭文件,就完成csv文件的写入了。

    1. # 引用csv模块。
    2. import csv
    3. # 调用open()函数打开csv文件,传入参数:文件名“demo.csv”、写入模式“w”、newline=''、encoding='utf-8'。
    4. csv_file = open('demo.csv','w',newline='',encoding='utf-8')
    5. # 用csv.writer()函数创建一个writer对象。
    6. writer = csv.writer(csv_file)
    7. # 调用writer对象的writerow()方法,可以在csv文件里写入一行文字 “电影”和“豆瓣评分”。
    8. writer.writerow(['电影','豆瓣评分'])
    9. # 在csv文件里写入一行文字 “银河护卫队”和“8.0”。
    10. writer.writerow(['银河护卫队','8.0'])
    11. # 在csv文件里写入一行文字 “复仇者联盟”和“8.1”。
    12. writer.writerow(['复仇者联盟','8.1'])
    13. # 写入完成后,关闭文件就大功告成啦!
    14. csv_file.close()

    运行代码后,名为“demo.csv”的文件会被创建。用Excel或记事本打开这个文件,你就能看到——

    image.png-81.3kB

    【练习时间】请你把上面csv文件写入的代码敲一遍。毕竟代码是绝对不能光看不敲的,快,敲起来!提示:先引入csv模块,用open()函数打开csv文件,不要忘了加newline=' '参数;然后利用csv.writer()函数创建一个writer对象,再调用writerow()方法,就可以往csv文件里写入内容。

    image.png-283.6kB

    如果打开的是乱码

    image.png-40.5kB

    则可以试试encoding = 'utf-8-sig' 的编码

    open('name', 'w', encoding = 'utf-8-sig')

    既可以这样写:

    1. # 引用csv模块。
    2. import csv
    3. # 调用open()函数打开csv文件,传入参数:文件名“demo.csv”、写入模式“w”、newline=''、encoding='utf-8-sig'。
    4. csv_file = open('C://Users//17310//Desktop//ceshi//demo.csv','w',newline='',encoding='utf-8-sig')
    5. # 用csv.writer()函数创建一个writer对象。
    6. writer = csv.writer(csv_file)
    7. # 调用writer对象的writerow()方法,可以在csv文件里写入一行文字 “电影”和“豆瓣评分”。
    8. writer.writerow(['电影','豆瓣评分'])
    9. # 在csv文件里写入一行文字 “银河护卫队”和“8.0”。
    10. writer.writerow(['银河护卫队','8.0'])
    11. # 在csv文件里写入一行文字 “复仇者联盟”和“8.1”。
    12. writer.writerow(['复仇者联盟','8.1'])
    13. # 写入完成后,关闭文件就大功告成啦!
    14. csv_file.close()

    这样就OK了

    image.png-34.7kB

    用csv模块写入数据这一个知识点我们已经清楚。接下来我们可以继续学习怎么读取csv文件的数据。

    以刚刚创建好的“demo.csv”文件为例。你可以先运行下面的代码,看看会读取出什么结果。

    image.png-178.4kB

    是不是把刚刚写入“demo.csv”文件的内容都打印出了?如果是,说明我们成功读取!

    现在,我们一行行来看刚刚读取“demo.csv”文件的代码,注释要认真阅读。

    1. import csv
    2. csv_file = open('C://Users//17310//Desktop//ceshi//demo.csv','r',newline='',encoding='utf-8')
    3. reader = csv.reader(csv_file)
    4. for row in reader:
    5. print(row)

    第1、2行代码:导入csv模块。用open()打开“demo.csv”文件,'r'是read读取模式,newline=''是避免出现两倍行距。encoding='utf-8'能避免编码问题导致的报错或乱码。

    第3行代码:用csv.reader()函数创建一个reader对象。

    第4、5行代码:用for循环遍历reader对象的每一行。打印row,就能读取出“demo.csv”文件里的内容。

    真棒,csv格式文件的写入和读取都被我们搞定了!

    补充一点:csv模块本身还有很多函数和方法,附上csv模块官方文档链接:

    https://yiyibooks.cn/xx/python_352/library/csv.html#module-csv

    这些函数和方法我们不需要全部都记下来,只要在需要用到的时候,学会查询就行。

    存储数据的基础知识我们就讲完了。接着我们进入实操项目——存储周杰伦的歌曲信息。

    首先,我们要先选择存储数据的方式。由于篇幅有限,在这里我们只选取用openpyxl模块存储成Excel文件的方式做演示。

    2.3 项目:存储周杰伦的歌曲信息

    上一关我们已经爬到了周杰伦歌曲信息的数据,所以只要在上一关代码的基础上,再加入存储数据的代码,【获取数据→解析数据→提取数据→存储数据】这整个爬虫的过程我们就都完成了!

    上一关的代码如下:

    1. import requests
    2. url = 'https://c.y.qq.com/soso/fcgi-bin/client_search_cp'
    3. for x in range(5):
    4. # 将参数封装为字典
    5. params = {
    6. 'ct': '24',
    7. 'qqmusic_ver': '1298',
    8. 'new_json': '1',
    9. 'remoteplace': 'txt.yqq.song',
    10. 'searchid': '64405487069162918',
    11. 't': '0',
    12. 'aggr': '1',
    13. 'cr': '1',
    14. 'catZhida': '1',
    15. 'lossless': '0',
    16. 'flag_qc': '0',
    17. 'p': str(x + 1),
    18. 'n': '20',
    19. 'w': '周杰伦',
    20. 'g_tk': '5381',
    21. 'loginUin': '0',
    22. 'hostUin': '0',
    23. 'format': 'json',
    24. 'inCharset': 'utf8',
    25. 'outCharset': 'utf-8',
    26. 'notice': '0',
    27. 'platform': 'yqq.json',
    28. 'needNewCode': '0'
    29. }
    30. # 调用get方法,下载这个列表
    31. res_music = requests.get(url, params=params)
    32. # 使用json()方法,将response对象,转为列表/字典
    33. json_music = res_music.json()
    34. # 一层一层地取字典,获取歌单列表
    35. list_music = json_music['data']['song']['list']
    36. # list_music是一个列表,music是它里面的元素
    37. for music in list_music:
    38. # 以name为键,查找歌曲名
    39. print(music['name'])
    40. # 查找专辑名
    41. print('所属专辑:' + music['album']['name'])
    42. # 查找播放时长
    43. print('播放时长:' + str(music['interval']) + '秒')
    44. # 查找播放链接
    45. print('播放链接:https://y.qq.com/n/yqq/song/' + music['mid'] + '.html\n\n')

    image.png-45.8kB

    按照Excel文件写入的步骤,我们可以先在上一关的代码上,添加导入openpyxl模块、创建工作薄和获取工作表的代码。

    1. # 在上一关的代码上再导入openpyxl模块。
    2. import requests,openpyxl
    3. # 创建工作薄
    4. wb = openpyxl.Workbook()
    5. # 获取工作薄的活动表
    6. sheet = wb.active
    7. # 工作表重命名为song。
    8. sheet.title = 'song'

    既然我们要存储成Excel文件的话,我们得先添加表头,比如我们现在想存储歌曲名、所属专辑、播放时长和播放链接,那就可以先分别在A1、B1、C1、D1单元格中写入“歌曲名”、“所属专辑”、“播放时长”和“播放链接”。

    1. sheet['A1'] ='歌曲名'
    2. sheet['B1'] ='所属专辑'
    3. sheet['C1'] ='播放时长'
    4. sheet['D1'] ='播放链接'

    接下来,把所有歌曲名、所属专辑、播放时长和播放链接用append()函数,一一写入Excel文件。

    最后,保存这个文件,数据就会被我们都存储下来。

    完整的代码如下(请重点关注加了注释的代码):

    1. import requests,openpyxl
    2. # 创建工作薄
    3. wb=openpyxl.Workbook()
    4. # 获取工作薄的活动表
    5. sheet=wb.active
    6. # 工作表重命名
    7. sheet.title='lyrics'
    8. sheet['A1'] ='歌曲名' # 加表头,给A1单元格赋值
    9. sheet['B1'] ='所属专辑' # 加表头,给B1单元格赋值
    10. sheet['C1'] ='播放时长' # 加表头,给C1单元格赋值
    11. sheet['D1'] ='播放链接' # 加表头,给D1单元格赋值
    12. url = 'https://c.y.qq.com/soso/fcgi-bin/client_search_cp'
    13. for x in range(5):
    14. params = {
    15. 'ct': '24',
    16. 'qqmusic_ver': '1298',
    17. 'new_json': '1',
    18. 'remoteplace': 'txt.yqq.song',
    19. 'searchid': '64405487069162918',
    20. 't': '0',
    21. 'aggr': '1',
    22. 'cr': '1',
    23. 'catZhida': '1',
    24. 'lossless': '0',
    25. 'flag_qc': '0',
    26. 'p': str(x + 1),
    27. 'n': '20',
    28. 'w': '周杰伦',
    29. 'g_tk': '5381',
    30. 'loginUin': '0',
    31. 'hostUin': '0',
    32. 'format': 'json',
    33. 'inCharset': 'utf8',
    34. 'outCharset': 'utf-8',
    35. 'notice': '0',
    36. 'platform': 'yqq.json',
    37. 'needNewCode': '0'
    38. }
    39. res_music = requests.get(url, params=params)
    40. json_music = res_music.json()
    41. list_music = json_music['data']['song']['list']
    42. for music in list_music:
    43. # 以name为键,查找歌曲名,把歌曲名赋值给name
    44. name = music['name']
    45. # 查找专辑名,把专辑名赋给album
    46. album = music['album']['name']
    47. # 查找播放时长,把时长赋值给time
    48. time = music['interval']
    49. # 查找播放链接,把链接赋值给link
    50. link = 'https://y.qq.com/n/yqq/song/' + str(music['mid']) + '.html\n\n'
    51. # 把name、album、time和link写成列表,用append函数多行写入Excel
    52. sheet.append([name,album,time,link])
    53. print('歌曲名:' + name + '\n' + '所属专辑:' + album +'\n' + '播放时长:' + str(time) + '\n' + '播放链接:'+ link)
    54. # 最后保存并命名这个Excel文件
    55. wb.save('C://Users//17310//Desktop//ceshi//Jay.xlsx')

    运行代码,“Jay.xlsx”文件就会被创建。打开这个文件就可以看到存储的数据。

    image.png-414.2kB

    image.png-787kB

    鼓掌ヾ()ノ 我们这一关的内容完美结束!

    3. 复习

    接下来是简单的复习。

    image.png-29.6kB

    image.png-40.5kB

    1. # csv写入的代码:
    2. import csv
    3. csv_file = open('demo.csv','w',newline='')
    4. writer = csv.writer(csv_file)
    5. writer.writerow(['电影','豆瓣评分'])
    6. csv_file.close()

    image.png-39.3kB

    1. # csv读取的代码:
    2. import csv
    3. csv_file = open('demo.csv','r',newline='')
    4. reader=csv.reader(csv_file)
    5. for row in reader:
    6. print(row)

    image.png-45.8kB

    1. # Excel写入的代码:
    2. import openpyxl
    3. wb = openpyxl.Workbook()
    4. sheet = wb.active
    5. sheet.title ='new title'
    6. sheet['A1'] = '漫威宇宙'
    7. rows = [['美国队长','钢铁侠','蜘蛛侠','雷神'],['是','漫威','宇宙', '经典','人物']]
    8. for i in rows:
    9. sheet.append(i)
    10. print(rows)
    11. wb.save('Marvel.xlsx')

    image.png-48.7kB

    1. # Excel读取的代码:
    2. import openpyxl
    3. wb = openpyxl.load_workbook('Marvel.xlsx')
    4. sheet = wb['new title']
    5. sheetname = wb.sheetnames
    6. print(sheetname)
    7. A1_value = sheet['A1'].value
    8. print(A1_value)

    这一关,我们引用了csv模块和openpyxl模块。这两个都是前人编写好的模块,我们拿来就能实现存储数据的操作。

    正是有了前人编写好的模块,我们才不用费心费力,再去编写一个全新的能实现存储功能的代码。

    这种前人创造的知识沉淀,以无私的方式分享给我们使用的精神,叫开源精神。在编程世界里,这种精神就是最宝贵的财富。

    也是因为开源,我们才得以领略和获得到前人的精神财富。比如,借助openpyxl模块的其他函数和方法,我们甚至可以实现自动化办公(自动处理数据繁杂的Excel文件等),解放我们的双手。

    当然,这需要学习关于这个模块更多的知识。不过这不是本课程的重点,可能之后我们会专门开设一个自动化办公的课程。

    说这些的目的,是想让你了解开源精神的伟大,以及更深层的意义——彻底减少重复性工作,提高效率。

    最后,希望我们既能是开源精神的受益者,也可以成为开源精神的倡导者和实践者。

    4. 习题练习

    1.练习介绍
    记得我们第四关的时候爬取了豆瓣TOP250的电影名/评分/推荐语/链接,现在呢,我们要把它们存储下来,记得用今天课上学的csv和excel,分别存储下来哦~

    2.第一步:分析问题,明确结果
    问题需求就是把豆瓣TOP250里面的 序号/电影名/评分/推荐语/链接 都爬取下来,结果是存储在csv和Excel中

    3.第二步:书写爬虫代码
    回顾下第三关的爬虫代码

    1. # 引用csv模块
    2. import requests, bs4, csv
    3. # 调用open()函数打开csv文件,传入参数:文件名“movieTop250.csv”、写入模式“w”、newline=''
    4. csv_file=open('C://Users//17310//Desktop//ceshi//movieTop250.csv', 'w', newline='')
    5. # 用csv.writer()函数创建一个writer对象。
    6. writer = csv.writer(csv_file)
    7. # 调用writer对象的writerow()方法,可以在csv文件里写入title:'序号', '电影名', '评分', '推荐语', '链接'
    8. writer.writerow(['序号', '电影名', '评分', '推荐语', '链接'])
    9. headers={'user-agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36'}
    10. for x in range(10):
    11. url = 'https://movie.douban.com/top250?start=' + str(x*25) + '&filter='
    12. res = requests.get(url, headers=headers)
    13. bs = bs4.BeautifulSoup(res.text, 'html.parser')
    14. bs = bs.find('ol', class_="grid_view")
    15. for titles in bs.find_all('li'):
    16. num = titles.find('em',class_="").text
    17. title = titles.find('span', class_="title").text
    18. comment = titles.find('span',class_="rating_num").text
    19. url_movie = titles.find('a')['href']
    20. if titles.find('span',class_="inq") != None:
    21. tes = titles.find('span',class_="inq").text
    22. # 把num, title, comment, tes和url_movie写成列表,用append函数多行写入Excel
    23. writer.writerow([num , title , comment , tes , url_movie])
    24. else:
    25. writer.writerow([num , title , comment , '', url_movie])
    26. csv_file.close()

    4.第三步: 完善代码,用Excel存储信息
    要存储在Excel中呢,需要先创建工作表,重命名,再设置表头,把爬取的信息写成列表,然后用append函数多行写入Excel,最后命名保存这个Excel 文件。
    请改写下方的爬虫代码,实现使用Excel存储信息。

    image.png-554.5kB

    image.png-647.2kB

    1. import requests, bs4, openpyxl
    2. # 创建工作薄
    3. wb=openpyxl.Workbook()
    4. # 获取工作薄的活动表
    5. sheet=wb.active
    6. # 工作表重命名
    7. sheet.title='movies'
    8. sheet['A1'] ='序号' # 加表头,给A1单元格赋值
    9. sheet['B1'] ='电影名' # 加表头,给B1单元格赋值
    10. sheet['C1'] ='评分' # 加表头,给C1单元格赋值
    11. sheet['D1'] ='推荐语' # 加表头,给D1单元格赋值
    12. sheet['E1'] ='链接' # 加表头,给E1单元格赋值
    13. headers={'user-agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36'}
    14. for x in range(10):
    15. url = 'https://movie.douban.com/top250?start=' + str(x*25) + '&filter='
    16. res = requests.get(url, headers=headers)
    17. bs = bs4.BeautifulSoup(res.text, 'html.parser')
    18. bs = bs.find('ol', class_="grid_view")
    19. for titles in bs.find_all('li'):
    20. num = titles.find('em',class_="").text
    21. title = titles.find('span', class_="title").text
    22. comment = titles.find('span',class_="rating_num").text
    23. url_movie = titles.find('a')['href']
    24. if titles.find('span',class_="inq") != None:
    25. tes = titles.find('span',class_="inq").text
    26. sheet.append([num, title, comment, tes, url_movie])
    27. # 把num, title, comment, tes和url_movie写成列表,用append函数多行写入Excel
    28. print(num + '.' + title + '——' + comment + '\n' + '推荐语:' + tes +'\n' + url_movie)
    29. else:
    30. sheet.append([num, title, comment, None,url_movie])
    31. print(num + '.' + title + '——' + comment + '\n' +'\n' + url_movie)
    32. # 最后保存并命名这个Excel文件
    33. wb.save('C://Users//17310//Desktop//ceshi//movieTop250.xlsx')

    5.第四步:另辟蹊径,用csv格式存储信息
    思考下如何用csv创建写入存储呢?
    请修改下方代码,实现使用csv存储信息。

    image.png-498.8kB

    image.png-635.8kB

    1. # 引用csv模块
    2. import requests, bs4, csv
    3. # 调用open()函数打开csv文件,传入参数:文件名“movieTop250.csv”、写入模式“w”、newline=''
    4. csv_file=open('C://Users//17310//Desktop//ceshi//movieTop250.csv', 'w', newline='')
    5. # 用csv.writer()函数创建一个writer对象。
    6. writer = csv.writer(csv_file)
    7. # 调用writer对象的writerow()方法,可以在csv文件里写入title:'序号', '电影名', '评分', '推荐语', '链接'
    8. writer.writerow(['序号', '电影名', '评分', '推荐语', '链接'])
    9. headers={'user-agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36'}
    10. for x in range(10):
    11. url = 'https://movie.douban.com/top250?start=' + str(x*25) + '&filter='
    12. res = requests.get(url, headers=headers)
    13. bs = bs4.BeautifulSoup(res.text, 'html.parser')
    14. bs = bs.find('ol', class_="grid_view")
    15. for titles in bs.find_all('li'):
    16. num = titles.find('em',class_="").text
    17. title = titles.find('span', class_="title").text
    18. comment = titles.find('span',class_="rating_num").text
    19. url_movie = titles.find('a')['href']
    20. if titles.find('span',class_="inq") != None:
    21. tes = titles.find('span',class_="inq").text
    22. # 把num, title, comment, tes和url_movie写成列表,用append函数多行写入Excel
    23. writer.writerow([num , title , comment , tes , url_movie])
    24. else:
    25. writer.writerow([num , title , comment , '', url_movie])
    26. csv_file.close()
  • 相关阅读:
    【濡白的C语言】部分string.h库函数的实现
    Hbase Coprocessor 协处理器 与 JavaAPI
    中国范围逐月夜间灯光数据(2012-2021年)
    文献阅读(37)——使用深度卷积神经网络的增强型糖网检测和分类的方法
    Fabric中的私有数据
    [Android]修改应用包名、名称、版本号、Icon以及环境判断和打包
    45.120.101.X 如何找出网站建设中弱点和漏洞
    代理和多级代理
    中小型企业文档管理和工作流程解决方案
    秋风过处,五谷飘香
  • 原文地址:https://blog.csdn.net/weixin_43279138/article/details/125451357