最近一直在学习爬虫,总会遇到存储数据的需要。但是以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()
最后我们打开文件,就会看到直接就是编码好的汉字,没有乱码现象了。