解决爬虫存储csv格式打开后乱码问题

最近一直在学习爬虫,总会遇到存储数据的需要。但是以csv格式存的时候总是会乱码。这里有两种解决方法:

法一:
将文件以记事本的方式打开然后另存为

如图
然后下面的编码设置为 UTF-8
在这里插入图片描述
这种方法很简单,但是每次都要点,很麻烦。

法二:
需要导入codecs模块,提前以“ab+”的方式打开文件:
具体代码如下:

import codecs

with open("F:/豆瓣图书_2.csv","ab+") as fp:
    fp.write(codecs.BOM_UTF8)# 为了防止在windows下直接打开csv文件出现乱码

我们用一个具体的实例来说演示一下,这里用我之前爬过的豆瓣图书TOP250来做示范:

import requests 
import csv
from lxml import etree
import codecs

with open("F:/豆瓣图书_2.csv","ab+") as fp:
    fp.write(codecs.BOM_UTF8)# 第一次打开,为了防止在windows下直接打开csv文件出现乱码

fp = open("F:/豆瓣图书_2.csv",'a+',newline='',encoding='utf-8')#第二次打开写入数据
writer = csv.writer(fp)
writer.writerow(['书名','图书链接','作者','出版社','日期','价格','评分','评语'])

headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.81 Safari/537.36",
    "Referer": "https://book.douban.com/top250?start=25"
}
urls = ["https://book.douban.com/top250?start={}".format(i) for i in range(0,250,25)]
for url in urls:
    r = requests.get(url, headers = headers)
    html =etree.HTML(r.text)
    infos = html.xpath('//tr[@class="item"]')
    for info in infos:
        name = info.xpath('td[2]/div[1]/a[1]/@title')[0]
        url = info.xpath('td[1]/a[1]/@href')[0]
        authors = info.xpath('td[2]/p/text()')[0]
        author = authors.split('/')[0]
        publish = authors.split('/')[-3]
        date = authors.split('/')[-2]
        price = authors.split('/')[-1]
        score = info.xpath('td[2]/div[2]/span[2]/text()')[0]
        comments = info.xpath('td[2]/p/span/text()')
        comment = comments[0] if len(comments) !=0 else "空"
        writer.writerow([name,url,author,publish,date,price,score,comment])

fp.close()

最后我们打开文件,就会看到直接就是编码好的汉字,没有乱码现象了。
如图