您现在的位置是:首页 >技术交流 >python电影评论网站首页技术交流

python电影评论

NPC的克星 2024-06-13 06:01:02
简介python电影评论

1电影评论首先得对网页进行访问,然后才能查看相关评论,因此,我们得先下载用于访问网页的requests库。因为这些库都是放在国外的,所以我们使用国内的镜像源提高下载速度,这里用的是清华的镜像。然后管理员模式打开命令行输入
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple requests
2接着便是要下载lxml库,lxml中的etree可以帮助我们将获取的网页内容整理成一个节点树,方便我们使用Xpath找到评论,评分等内容所在的节点。
下载方式也是同样的,将requests替换成etree即可。
3要访问一个网页,必不可少的是网址,但同时也需要header,什么是header?header是发送请求时携带的头部信息,里面包含一些相应的参数告诉网站一些客户端的相关信息,我们这里提供header是为了使python更像人为的,而非机器,从而尽量避免网站的反爬措施。
如何获取header?
获取方式为要的打开要获取的网页,F12 选择网络(为空的话重载网页),选择全部,选择第一个文件的header部分,拉至底下可看见header的User-Agent内容。
在这里插入图片描述

4所以访问前的准备就全部做好,使用rquetsts的get函数进行访问,编写成代码如下

import requests
from lxml import etree
url = "https://movie.douban.com/subject/33420285/comments?status=P"
headers = {
'Referer': 'https://movie.douban.com/subject/33420285/comments?status=P',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.51 Safari/537.36'
}
request = requests.get(url,headers=headers)
print(request.status_code)

在这里插入图片描述可以看到状态码为200,即为访问成功
5在获取网页内容之前,我们先看些html的代码编码格式
在这里插入图片描述可以看到为utf-8,所以获取内容时设置的编码方式时也要相同

html = request.content.decode('utf-8')
print(html)

获取内容如下
在这里插入图片描述
6接下来便是将获取到的内容整理成一个节点树,并通过Xpath获取其中的评论节点的文本。这里我们要获取评论人的昵称,评论内容,评论分数。
首先鼠标悬浮于评论人名右键检查在这里插入图片描述可以看到这里的昵称是标签a里面的文本,而标签a是包括在上一级的class属性名为comment-info的sapn标签中,而这一标签又是包含在id为comments的dive中的。所以他的Xpath路径可以这样写

//*[@id="comments"]//span[@class="comment-info"]/a/text()

表示的从任意节点开始的id为comments的子孙节点span的class值为comment-info的a标签中的文本
所以这一段的代码为:

tree = etree.HTML(html)
name = tree.xpath('//*[@id="comments"]//span[@class="comment-info"]/a/text()')
print(name)
print(len(name))

在这里插入图片描述
7接下来便是同样的操作,观察评论的所在位置,获取写出Xpaht的表达式为

//*[@id="comments"]//div[@class="comment"]/p/span/text()

代码如下

comments = tree.xpath('//*[@id="comments"]//div[@class="comment"]/p/span/text()')
print(comments)
print(len(comments))

在这里插入图片描述8接下来便是获取评分的星的数量
同样的Xpath表示为:

//*[@id="comments"]//div[@class="comment"]//span[2]/span[2]/@class

代码如下:

star_text = tree.xpath('//*[@id="comments"]//div[@class="comment"]//span[2]/span[2]/@class')
print(len(star_text))
print(star_text)

在这里插入图片描述由于这里获取到的星数文本包含了其他字符,而且是实际给予星树的十倍,所以这里对该列表进行操作。
我们首先想到通过re表达式提取其中的数字,并转换为整型进行除10操作,然后保存至一个新的列表中。
但是此时的这里是一个列表,re只适用字符串,因此,我们需要使用join方法来使得此列表变成一个字符串,并以空格隔开。
同时,在代码的首位我们也要导入re这个库
在这里插入图片描述

代码如下:

mid = " ".join(star_text)
star_num = re.findall(r'd+',mid)
star_num1 = list()
for i in star_num:
    star_num1.append(int(i)/10)
print(star_num)
print(star_num1)
print(len(star_num1))

在这里插入图片描述
9这样的话,name中包含了评论的人名,comments包含了评论内容,star_num中包含了观众给的星树。我们导入openpyxl中的Workbook
在这里插入图片描述来对excel文件进行操作,以便将数据写入excel中。
代码如下:

wb = Workbook()
sheet = wb.active
sheet.title = "comments_doubian_真心半解"
sheet["A%d" % 1].value = "姓名"
sheet["B%d" % 1].value = "评论"
sheet["C%d" % 1].value = "评分"
for i in range(len(star_num1)):
    sheet["A%d" % (i+2)].value = name[i]
    sheet["B%d" % (i+2)].value = comments[i]
    sheet["C%d" % (i+2)].value = star_num1[i]
    print(i)
    
wb.save("D:\tem\001\comments2.xlsx")

在这里插入图片描述
这样,我们就完成了对一页网站的爬取。
获取接下来的几个页面,只需观察网址差异,使用for循环访问,并将昵称,评论,星树这些保存下路即可。
我也是参考了这篇文章,写得很好,点击前往
但是不考虑comments = comments +Xpath路径这种方式,你之前有运行,内存保存有初始的comments的值时不会出错,但当你重新开机,或者在其他机子上运行时,会由于找不到comments的值就会报错。
因此,我改进了下改为:comments += Xpath这种方式

 comments += tree.xpath('//*[@id="comments"]//div[@class="comment"]/p/span/text()')

全文最后总代码即为:

import requests
from lxml import etree
import re
from openpyxl import Workbook
url = "https://movie.douban.com/subject/33420285/comments?status=P"
headers = {
'Referer': 'https://movie.douban.com/subject/33420285/comments?status=P',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.51 Safari/537.36'
}

for i in range(0,100,20):
    url = f'https://movie.douban.com/subject/33420285/comments?start={i}&limit=20&sort=new_score&status=P'
    request = requests.get(url,headers=headers)
    print(request.status_code)
    html = request.content.decode('utf-8')
    print(html)
    tree = etree.HTML(html)
    name += tree.xpath('//*[@id="comments"]//div[@class="avatar"]/a/@title')
    print(name)
    print(len(name))
	comments += tree.xpath('//*[@id="comments"]//div[@class="comment"]/p/span/text()')   
    print(comments)
    print(len(comments))
    star_text += tree.xpath('//*[@id="comments"]//div[@class="comment"]//span[2]/span[2]/@class')
    print(len(star_text))
star='//*[@id="comments"]/div[2]/div[2]/h3/span[2]/span[2]'
print(star_text)
mid = " ".join(star_text)
star_num = re.findall(r'd+',mid)
star_num1 = list()
for i in star_num:
    star_num1.append(int(i)/10)
print(star_num)
print(star_num1)
print(len(star_num1))
wb = Workbook()
sheet = wb.active
sheet.title = "comments_doubian_真心半解"
sheet["A%d" % 1].value = "姓名"
sheet["B%d" % 1].value = "评论"
sheet["C%d" % 1].value = "评分"
for i in range(len(star_num1)):
    sheet["A%d" % (i+2)].value = name[i]
    sheet["B%d" % (i+2)].value = comments[i]
    sheet["C%d" % (i+2)].value = star_num1[i]
    print(i)
    
wb.save("D:\tem\001\comments5.xlsx")
    

在这里插入图片描述
总结:熟练使用re以及Xpath将会大大助益于相关内容的爬取。

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。