python豆瓣评论爬取任意电影评论

python豆瓣评论爬取任意电影评论

java川
2021-08-28 / 0 评论 / 97 阅读 / 正在检测是否收录...
温馨提示:
本文最后更新于2021年09月02日,已超过95天没有更新,若内容或图片失效,请留言反馈。

本脚本可以配合词语图一起使用。 该脚本 爬取电影评论放入txt文档,词云图脚本 可以读取文档生成词云图。
本脚本可以配合词语图一起使用。 该脚本 爬取电影评论放入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()

测试

代码测试

结果:

结果

5

评论 (0)

取消