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将会大大助益于相关内容的爬取。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值