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