1. csv文件操作
csv文件windows默认是excel打开的,是一种表格式文件
import csv #导入csv的库
# 一次写入多行文本时,会多换一行,可以设置newline=""来解决
with open("喜喜.csv", "w",newline="",encoding="utf-8") as file:
# writer: 获取csv的写编辑对象
csvWriter = csv.writer(file)
info = [ # 定义一个二维列表作为表格内容
["英雄", "技能", "装备", "年龄"],
["后羿", "射日", "弓", "12"],
]
# 写入一行内容用writerow 写入多行内容writerows
csvWriter.writerows(info) #把info作为多行内容写入excel
# 用记事本打开,然后另存为,使用带BOM的UTF-8保存,然后再用excel打开,便不会有乱码了
with open("喜喜.csv", "r", encoding="utf-8") as file2:
csvReader = csv.reader(file2) #reader: 获取csv文件的内容以二维列表的形式返回
for reader in csvReader:
print(reader)
2.查看页面信息的方法
-
进入要查看的页面,右键->检查->network->刷新,显示如下信息
-
查看网页链接,找到最后这部分,在network的name标签中找出相同的
-
单击该name,在右侧general中从Request Header中找出需要的信息
3. 爬虫抓取豆瓣影评并写入csv文件
import requests
from bs4 import BeautifulSoup
import csv
# 自定义一个抓取每页影评的方法
def getCommentByPage(url):
# response = requests.get(url)
# print(response.status_code) # 瓣做了反爬虫处理,会返回错误代码418
# 程序模拟浏览器向服务器发请求(浏览器发请求时会带有一些请求信息,而python脚本没用)
# 1. 设置请求头(伪装浏览器)
#因为豆瓣做了反爬虫处理。一般需要的信息包括浏览器信息和用户信息
# 格式应该为:变量名={"标签1":"内容","标签2","内容"} 如果标签中含有双引号,就换成单引号
header = {
#浏览器信息
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.102 Safari/537.36",
# 用户信息
'Cookie': 'll="118104"; bid=lcfxfqam0UI; __utmz=30149280.1600249245.1.1.utmcsr=baidu|utmccn=(organic)|utmcmd=organic; gr_user_id=84e4d664-c0db-4b2f-9063-5db2220d00b9; _vwo_uuid_v2=D5A4EEC3511DE982EE357AC0DEFCBDD68|a2199e2a903fdca1c047a02bf8ff8a91; viewed="34710120"; __utmz=223695111.1600249273.1.1.utmcsr=douban.com|utmccn=(referral)|utmcmd=referral|utmcct=/; __yadk_uid=pWo4BT7vwgPHXL7Bg7HkUFrerRqxQMVc; _pk_ref.100001.4cf6=%5B%22%22%2C%22%22%2C1600305602%2C%22https%3A%2F%2Fwww.douban.com%2F%22%5D; _pk_ses.100001.4cf6=*; ap_v=0,6.0; __utma=30149280.132873610.1600249245.1600249245.1600305602.2; __utmc=30149280; __utma=223695111.407950405.1600249273.1600249273.1600305602.2; __utmc=223695111; __utmt=1; ct=y; __utmt=1; __utmb=30149280.1.10.1600305602; __gads=ID=2019ca7fb5b75ca8:T=1600249841:S=ALNI_MazhI6AdCCbmBvG3dw7KIZ7zE6hAg; __utmb=223695111.10.10.1600305602; _pk_id.100001.4cf6=0741429674f84c3c.1600249273.2.1600305674.1600250207.'
}
# 携带请求头发请求
response = requests.get(url, headers=header) #带请求信息的函数
if (response.status_code != 200):
print("访问失败")
else:
bs = BeautifulSoup(response.content, "html5lib") #使用靓汤结合 html5lib 结合解析获取到的网页内容
reviewItemList = bs.find_all("div", attrs={"class": "review-item"}) # 使用bs查找所有标签div 1.div标签 2. class=“review-item”
for reviewItem in reviewItemList:
# 找作者
author = reviewItem.find("a", attrs={"class": "name"}).text
# 找评分
rating = reviewItem.find("span", attrs={"class": "main-title-rating"})
if (rating != None):
star = rating.get("title")
content = reviewItem.find("div", attrs={"class": "short-content"}).text.replace("\n"," ")
# 将作者、评分、评论写成列表,并且添加到reviewList
reviewList.append([author, star, content])
def writeReview():
with open("最受欢迎影评.csv","w",newline="",encoding="utf-8") as fileW:
scvW = csv.writer(fileW)
scvW.writerows(reviewList)
# main方法:程序运行的入口
if __name__ == '__main__':
# 存储影评
reviewList = [] # 在main方法中定义的变量是全局变量
for i in range(10):
baseUrl = "https://movie.douban." \
"com/review/best/?start={}".format(i*20)
getCommentByPage(baseUrl)
# 将短评写入csv文件
writeReview()
4. 结巴分词和词云库
同样是在cmd界面下载
# pip install jieba 结巴分词:将句子切割为词语
# pip install WordCloud 词云库
# 结巴分词:将句子拆分成词语
# 结巴分词的示例:
from wordcloud import WordCloud
import jieba
list1 = ["my","name","is","linxu"]
print(" ".join(list1)) # join函数:把list1列表以" "链接起来
msg = "我喜欢看辰东写的遮天"
result = jieba.cut(msg) #静态类,直接调用,cut:切割句子
print(" ".join(result))
5. 将例3的csv影评生成词云
import csv
from wordcloud import WordCloud
import jieba
from PIL import Image # 安装词云的时候一起装上的
import numpy # 安装词云的时候一起装上的
# 读取影评,返回影评列表
def readComment():
with open("最受欢迎影评.csv",'r',encoding="utf-8") as file:
csvRead = csv.reader(file) #加载文件数据
return [item[2] for item in csvRead] #这是一个列表生成式
#生成的item应该是一个二维列表。item[2]则表示item的第二列元素
#返回值是一个列表,列表元素是影评的内容
# 生成词云图
def generateWordCloud():
commentlist = readComment() #获取影评内容
finalComment = ""
for comment in commentlist:
finalComment+=comment #把所有影评拼接成一个字符串
# 读取轮廓图片,并且处理为ndarray的格式(numpy)
image = numpy.array(Image.open('1.jpg')) # 1.jpg 必须是一个白底图片,且图片内容不能有白色
# 使用了image属性,词云会生成为所选用图片轮廓的形状
# 词云的属性
wordCloud = WordCloud(
width = 800, #词云的高度
height = 400, #词云的宽度
font_path = "STLITI.TTF", # 字体路径 在C:\Windows\Fonts目录下找一个中文样式的字体复制到工作目录
background_color = "yellow", # 背景颜色
mask = image # 图片的轮廓 #可选属性,不选择默认是矩形词云
).generate(" ".join(jieba.cut(finalComment))) #jieba.cut(finalComment)) :把影评的字符串切割成词语 generate:把词语组成词云
# 生成词云文件
wordCloud.to_file("受欢迎.png")
if __name__ == '__main__':
generateWordCloud()