本脚本可以配合词语图一起使用。 该脚本 爬取电影评论放入txt文档,词云图脚本 可以读取文档生成词云图。
使用方式
1.如下headers内Cookie需要自己补充。因为爬取数据需要登录才可以~~~
代码运行错误,要么是相关库没装,要么就是Cookie失效,要么就是Cookie没有填。
代码
import json #json数据解析
import time
import requests
from bs4 import BeautifulSoup #解析页面
from lxml import etree #xpath库
from tqdm import tqdm
# 查询电影 https://search.douban.com/movie/subject_search?search_text=%E6%B5%B7%E4%B8%8A%E9%92%A2%E7%90%B4%E5%B8%88&cat=1002
# 获取查询后电影的链接 //*[@id="root"]//div[@class="item-root"]/a/@href
## 查询电影url执行后会跳转到这个js: https://img3.doubanio.com/dae/accounts/resources/d3e2921/movie/bundle.js
## 搜索词: suggResult
# 电影详情url https://movie.douban.com/subject/5300054/?from=subject-page
#5300054是 电影id
#电影详情页面 主演名字 //*[@id="info"]/span[3]/span[2]/span/a/text()
###导演名://*[@id="info"]/span[1]/span[2]/a/text()
#全部评论 https://movie.douban.com/subject/1292001/comments
#热门评论的url https://movie.douban.com/subject/5300054/comments?sort=time
#根据sort排序 sort=time 就是最新评论 new_score&status=P 最热排序
# 获取评论xpath /html/body//div[@id='comments']/div[1]/div[2]/p
headers={
"User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36",
#自己填写补充 豆瓣登录后的cookie
"Cookie":''
}
session = requests.sessions.Session()
def get_tree(url):
res =session.get(url,headers=headers)
html= res.content.decode('utf-8')
tree = etree.HTML(html)
return tree
#得到电影的数据信息
def get_movie_id(movie_name):
getmovie_url = "https://movie.douban.com/j/subject_suggest?q={movie_name}".format(movie_name=movie_name)
res=session.get(getmovie_url,headers=headers).text
movie_datas = json.loads((res)) #json反序列化 变python对象
print("--------------------搜索的电影信息有--------------------\n")
for i in range(len(movie_datas)):
movie_data_name = movie_datas[i]["title"]
movie_data_year = movie_datas[i]["year"]
movie_data_id = movie_datas[i]["id"]
movie_data_url = movie_datas[i]["url"]
#print(movie_data_name)
print(str((i+1))+": "+movie_data_year+"年 "+movie_data_name+"\n")
movie_xh="" #输入的电影id
movie={
"id":"",
"name":""
}
try:
movie_xh=int(input("请问确定是哪一部电影(输入序号即可,例如1 2 3):"))
if(movie_xh>len(movie_datas)):
print("------数字超了!!!----")
movie_xh = int(input("请问确定是哪一部电影(输入序号即可,例如1 2 3):"))
except:
print("-------------格式输入错误!!!--------------")
movie['id'] = movie_datas[ movie_xh - 1]["id"]
movie['name']=movie_datas[movie_xh-1]["title"]
return movie
def get_movie_xiangqing(movie_xiangqing_url):
tree=get_tree(movie_xiangqing_url)
path=tree.xpath("//*[@id='info']/span[3]/span[2]/span/a/text()")
def main():
# 评论数据存放的目录
save_path = r'C:\Users\MI\Desktop'
movie_name=str(input("请输入电影名:"))
movie_id=get_movie_id(movie_name)['id']
comment_count_tree = get_tree("https://movie.douban.com/subject/{movie_id}/reviews?rating=".format(movie_id=movie_id))
# 总共的评论条数
comment_num = str(comment_count_tree.xpath("//*[@id='content']/h1/text()"))
comment_num =comment_num.split("(")[1].split(")")[0]
print("-----------------\n总共有{}条评论,你需要下载多少条评论?\n-----------------".format(comment_num))
try:
num = int(input("请重新输入数字:"))
except:
print("-------------格式输入错误!!!--------------")
num = int(input("请重新输入数字:"))
# 所有评论 rating=5就是5星 rating= 全评论 start=20×下标
all_comments_url = "https://movie.douban.com/subject/{movie_id}/reviews?rating=&start=".format(movie_id=movie_id)
comment_data_list = []
for index in tqdm(range(0,num,20),ascii=True,desc="下载完成:"):
tree=get_tree(all_comments_url+str(index))
comments = tree.xpath("//*[@class='short-content']/text()")
for comment in comments[::]:
comment_data = str(comment).strip().replace("(","").replace(")","").strip()
comment_data_list.append(comment_data)
#percent = str(((index + 20) / 20) / (num / 20) * 100).split(".")[0]
#print("--" + str(percent) + "%--")
path=save_path+"\豆瓣"+movie_name+"评论数据.txt"
try:
with open(path,"w",encoding='utf-8') as f:
f.writelines(comment_data_list)
f.close()
except:
print("-----------------"+save_path+"目录不存在!!请检查------------------")
main()
print("-------------------------------{} 数据写完---------------------------".format(path))
main()
if __name__ == '__main__':
main()
测试
结果:
别多爬这就是结果:
直接封ip