1、概念
- xlwt为Python操纵Excel的库,具有数据添加、删除、修改等功能,是较为轻量但专一的Excel数据操作库,主要对.xls类型的文件进行操作。
- 读者也可使用pandas、openpyxl等库进行操作,不过这些库更“重”,它们的使用往往伴随着数据分析方向的应用,在此不做演示。
2、安装
pip install xlwt
3、代码
-
还是延续前章,以爬取豆瓣Top250电影网站电影名为例,同时用到了BeautifulSoup、requests、datetime(与时间相关操作)库。
-
导包:
from bs4 import BeautifulSoup
import requests
import xlwt
import datetime as dt
- 定义需要爬取的链接以及headers,其中如下的urls定义可创建一个包含每一页(每一页包含25部电影,故步长为25)url的列表。
urls = ['https://movie.douban.com/top250?start={}'.format(str(i)) for i in range(0, 250, 25)]
headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.105 Safari/537.36'
}
- 获取当前时间,作为备用Excel文件名。其中.strftime()为时间格式控制,%F为“年-月-日”格式。
time = dt.datetime.now().strftime('%F')
- 创建Excel文件与表单,设置第一列列宽为6400像素,并定义一个格式控制变量n。
book = xlwt.Workbook(encoding='UTF-8')
sheet1 = book.add_sheet('sheet1', cell_overwrite_ok=True)
sheet1.col(0).width = 6400
n = 0
- cell_overwrite_ok=True表示可对同一单元格进行重复操作,虽此例中并不进行重复操作,但加上可减少出乎意料的报错←_←。
- xlwt中列宽的值表示方法:默认字符的1/256为衡量单位,一个汉字占两个字符即512个单位,一个字母占一个字符即256个单位。
- 使用for循环对urls列表中每一页链接进行访问并爬取电影名,并定义一个格式控制变量m。在上述for循环中,使用第二个for循环,将电影名写入表单的单元格中(拟定从第一行第一列开始,向下写入电影名)。
for url in urls:
wb_data = requests.get(url,headers=headers)
soup = BeautifulSoup(wb_data.text, 'lxml')
titles = soup.select('#content > div > div.article > ol > li > div > div.info > div.hd > a > span:nth-child(1)')
m = 0
for title in titles:
sheet1.write(m+n, 0, title.get_text())
m = m + 1
n = n + 25
- sheet1.write(x, y, z): x为行下标,y为列下标,z为写入内容。
- n与m的设置逻辑,主要是为了数据的正确写入,依次写入第一列的前250行单元格。
- 保存Excel文件,文件名用到开头定义的时间。
book.save('读者保存路径\{}豆瓣TOP250电影.xls'.format(time))
- 最后将上述代码封装至函数中。
- 完整代码如下:
from bs4 import BeautifulSoup
import requests
import xlwt
import datetime as dt
urls = ['https://movie.douban.com/top250?start={}'.format(str(i)) for i in range(0, 250, 25)]
headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.105 Safari/537.36'
}
time = dt.datetime.now().strftime('%F')
def get_tops():
book = xlwt.Workbook(encoding='UTF-8')
sheet1 = book.add_sheet('sheet1', cell_overwrite_ok=True)
sheet1.col(0).width = 6400
# xlwt中列宽的值表示方法:默认字符的1/256为衡量单位,一个汉字占两个字符即512个单位,一个字母占一个字符即256个单位
n = 0
for url in urls:
wb_data = requests.get(url,headers=headers)
soup = BeautifulSoup(wb_data.text, 'lxml')
titles = soup.select('#content > div > div.article > ol > li > div > div.info > div.hd > a > span:nth-child(1)')
m = 0
for title in titles:
sheet1.write(m+n, 0, title.get_text())
m = m + 1
n = n + 25
book.save('读者保存路径\{}豆瓣TOP250电影.xls'.format(time))
if __name__=='__main__':
get_tops()
- Excel电影数据如下:
4、总结
- xlwt是针对Excel操作的库,此外还有xlrd库用于读取数据等。
- xlwt对.xlsx类型的文件进行操作可能会存在一些问题,目前多对.xls文件进行操作。
- 学如逆水行舟,不进则退!
- (ง •̀-•́)ง