Python rastreando la revisión de la película de Douban "Dollar Earth" y la visualización del análisis de datos

"Wandering Earth" se lanzó en todo el país el día de Año Nuevo. En el puntaje de Douban, el puntaje inicial en el primer día se situó por encima de 8 puntos, continuando con la alta reputación que se mostró anteriormente. En Weibo, siguió una búsqueda de invitados de 31 días en Wu Jing y una búsqueda en caliente de 60 millones de inversiones. La respuesta de Zhihu a "cómo evaluar la adaptación novedosa de Liu Cixin de la película" Wandering Earth "" ha atraído la atención de muchas personas, incluida la más alta respuesta de alabanza del director de cine Guo Fan.

Este artículo rastreó parte de las reseñas de películas de "Wandering Earth" en el sitio web de Douban, y realizó análisis y visualización de datos. El siguiente es todo el proceso de análisis de rastreo, ¡comencemos felizmente!

1. Análisis de la página web

Douban.com ha prohibido los datos de rastreo desde octubre de 2017. Solo se pueden rastrear 200 comentarios breves en el estado sin inicio de sesión, y solo se pueden rastrear 500 datos en el estado de inicio de sesión. Puede gatear hasta 40 veces por minuto durante el día y 60 veces por la noche. Si se excede el número, se bloqueará la dirección IP. Cuando Satoshi Satoshi obtuvo 400 datos rastreados, se le bloqueó la dirección IP y su cuenta se vio obligada a cerrar la sesión. Después de eso, su cuenta se restableció por mensajes de texto. Por lo tanto, no se recomienda rastrear varias veces (además, hay muchas soluciones, busque por sí mismo).

Obtener objeto

  • Comentar usuarios

  • Comentar contenido

  • Calificación

  • Fecha de comentario

  • Ciudad del usuario

Vale la pena señalar que en la barra de direcciones encontraremos el número de identificación de la película 26266893 (otras películas solo necesitan cambiar la identificación), y cada página tiene 20 reseñas cortas, así que rastreé 20 páginas. La página de comentarios no tiene la ciudad del usuario. Debe ingresar a la página del usuario para obtener información.

 

Segundo, adquisición y almacenamiento de datos.

1  conseguir galletas

Komoto usa el navegador Chrome, Ctrl + F12 para ingresar a la página de herramientas del desarrollador. F5 actualiza los datos que aparecen y encuentra cookies y encabezados.

2 Cargue encabezados y cookies, y use la biblioteca de solicitudes para obtener información

def get_content(id, page):
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36'}
    cookies = {'cookie': 'bid=GOOb4vXwNcc; douban-fav-remind=1; ps=y; ue="[email protected]"; push_noty_num=0; push_doumail_num=0; ap=1; ll="108288"; dbcl2="181095881:BSb6IVAXxCI"; ck=Fd1S; ct=y'}
    url = "https://movie.douban.com/subject/" + str(id) + "/comments?start=" + str(page * 10) + "&limit=20&sort=new_score&status=P"
    res = requests.get(url, headers=headers, cookies=cookies)

 

3 Análisis de datos de demanda

Use el análisis xpath aquí. Se descubrió que aunque algunos usuarios hicieron comentarios, no dieron calificaciones, por lo que las posiciones xpath de puntaje y fecha cambiarán. Por lo tanto, es necesario agregar juicio, si se determina que el puntaje se analiza en la fecha, demuestra que el comentario no dio una calificación.

for i in range(1, 21):   # 每页20个评论用户
    name = x.xpath('//*[@id="comments"]/div[{}]/div[2]/h3/span[2]/a/text()'.format(i))
    # 下面是个大bug,如果有的人没有评分,但是评论了,那么score解析出来是日期,而日期所在位置spen[3]为空
    score = x.xpath('//*[@id="comments"]/div[{}]/div[2]/h3/span[2]/span[2]/@title'.format(i))
    date = x.xpath('//*[@id="comments"]/div[{}]/div[2]/h3/span[2]/span[3]/@title'.format(i))
    m = '\d{4}-\d{2}-\d{2}'
    try:
        match = re.compile(m).match(score[0])
    except IndexError:
        break
    if match is not None:
        date = score
        score = ["null"]
    else:
        pass
    content = x.xpath('//*[@id="comments"]/div[{}]/div[2]/p/span/text()'.format(i))
    id = x.xpath('//*[@id="comments"]/div[{}]/div[2]/h3/span[2]/a/@href'.format(i))
    try:
        city = get_city(id[0], i)  # 调用评论用户的ID城市信息获取
    except IndexError:
        city = " "
    name_list.append(str(name[0]))
    score_list.append(str(score[0]).strip('[]\''))  # bug 有些人评论了文字,但是没有给出评分
    date_list.append(str(date[0]).strip('[\'').split(' ')[0])
    content_list.append(str(content[0]).strip())
    city_list.append(city)

 

4 Obtener el nombre de la película

Solo el valor de ID de 8 bits del tema de la película se puede obtener de la URL, lo que provoca la necesidad de analizar la página web para obtener el nombre de la película correspondiente al número de ID. Esta función se agrega en mejoras posteriores, para evitar más cambios en el código existente (robar un código diferido), Se movie_namerequiere el uso de la asignación de variables globales para prestar atención a la globaldeclaración de variables globales .

pattern = re.compile('<div id="wrapper">.*?<div id="content">.*?<h1>(.*?) 短评</h1>', re.S)
global movie_name
movie_name = re.findall(pattern, res.text)[0]  # list类型

 

5 almacenamiento de datos

Como no hay muchos datos, elija el almacenamiento CSV.

def main(ID, pages):
    global movie_name
    for i in tqdm(range(0, pages)):  # 豆瓣只开放500条评论
        get_content(ID, i)  # 第一个参数是豆瓣电影对应的id序号,第二个参数是想爬取的评论页数
        time.sleep(round(random.uniform(3, 5), 2))  # 设置延时发出请求
    infos = {'name': name_list, 'city': city_list, 'content': content_list, 'score': score_list, 'date': date_list}
    data = pd.DataFrame(infos, columns=['name', 'city', 'content', 'score', 'date'])
    data.to_csv(movie_name + ".csv")  # 存储名为 电影名.csv

 

 

3. Análisis y visualización de datos.

1  conseguir galletas

Examen de información de la ciudad en chino

def translate(str):
    line = str.strip()
    p2 = re.compile('[^\u4e00-\u9fa5]')   # 中文的编码范围是:\u4e00到\u9fa5
    zh = " ".join(p2.split(line)).strip()
    zh = ",".join(zh.split())
    str = re.sub("[A-Za-z0-9!!,%\[\],。]", "", zh)
    return str

Coincide con la lista de ciudades compatibles con diagramas gráficos

 d = pd.read_csv(csv_file, engine='python', encoding='utf-8')
 motion_list = []
 for i in d['content']:
   try:
       s = round(SnowNLP(i).sentiments, 2)
       motion_list.append(s)
   except TypeError:
       continue
   result = {}
   for i in set(motion_list):
       result[i] = motion_list.count(i)
   return result

 

2 Análisis de opinión basado en snownlp

Snownlp puede realizar principalmente la segmentación de palabras en chino (el algoritmo es el modelo generativo basado en caracteres), el etiquetado de parte del discurso (el principio es TnT, caballo oculto de 3 gramos), el análisis de sentimientos (el sitio web oficial tiene un principio de introducción, pero la tasa de precisión de las revisiones de compras es mayor. De hecho, debido a que su corpus es principalmente para compras, puede construir su propio corpus en campos relacionados, reemplazar el original y la precisión es bastante buena), clasificación de texto (el principio es Naive Bayes), convertir Pinyin, tradicional a simplificado, Extraiga palabras clave de texto (el principio es TextRank), extraiga resúmenes (el principio es TextRank), segmente las oraciones y el texto es similar (el principio es BM25) [extraído de CSDN]. Antes de leer esto, se recomienda echar un vistazo al sitio web oficial, que contiene los comandos más básicos. Enlace oficial al sitio web: https://pypi.org/project/snownlp/

Como snownlp está codificado en unicode, preste atención a si los datos están codificados en unicode. Debido a que es una codificación unicode, no hay necesidad de eliminar el inglés contenido en el texto chino, ya que se transcodificará en una codificación unificada. Lo anterior solo llama al corpus nativo de snownlp para analizar el texto. Snownlp se enfoca en el campo de evaluación de compras, por lo que para mejorar la precisión del análisis de sentimientos Grado puede tomar el método de entrenamiento corpus.

attr, val = [], []
info = count_sentiment(csv_file)
info = sorted(info.items(), key=lambda x: x[0], reverse=False)  # dict的排序方法
for each in info[:-1]:
    attr.append(each[0])
    val.append(each[1])
line = Line(csv_file+":影评情感分析")
line.add("", attr, val, is_smooth=True, is_more_utils=True)
line.render(csv_file+"_情感分析曲线图.html")

 

3 Análisis de la ciudad

Llame a la función de página de diagramas, puede crear múltiples en un objeto de imagen chart, solo necesita agregar el correspondiente.

    geo1 = Geo("", "评论城市分布", title_pos="center", width=1200, height=600,
              background_color='#404a59', title_color="#fff")
    geo1.add("", attr, val, visual_range=[0, 300], visual_text_color="#fff", is_geo_effect_show=False,
            is_piecewise=True, visual_split_number=10, symbol_size=15, is_visualmap=True, is_more_utils=True)
    # geo1.render(csv_file + "_城市dotmap.html")
    page.add_chart(geo1)
    geo2 = Geo("", "评论来源热力图",title_pos="center", width=1200,height=600, background_color='#404a59', title_color="#fff",)
    geo2.add("", attr, val, type="heatmap", is_visualmap=True, visual_range=[0, 50],visual_text_color='#fff', is_more_utils=True)
    # geo2.render(csv_file+"_城市heatmap.html")  # 取CSV文件名的前8位数
    page.add_chart(geo2)
    bar = Bar("", "评论来源排行", title_pos="center", width=1200, height=600 )
    bar.add("", attr, val, is_visualmap=True, visual_range=[0, 100], visual_text_color='#fff',mark_point=["average"],mark_line=["average"],
            is_more_utils=True, is_label_show=True, is_datazoom_show=True, xaxis_rotate=45)
    bar.render(csv_file+"_城市评论bar.html")  # 取CSV文件名的前8位数
    page.add_chart(bar)
    pie = Pie("", "评论来源饼图", title_pos="right", width=1200, height=600)
    pie.add("", attr, val, radius=[20, 50], label_text_color=None, is_label_show=True, legend_orient='vertical', is_more_utils=True, legend_pos='left')
    pie.render(csv_file + "_城市评论Pie.html")  # 取CSV文件名的前8位数
    page.add_chart(pie)
    page.render(csv_file + "_城市评论分析汇总.html")

 

 

4 Análisis de sentimiento de la película

Emociones negativas por debajo de 0.5, emociones positivas por encima de 0.5. Se puede ver que los elogios siguen siendo muy buenos. En cuanto a Douban, solo hay algunos comentarios sobre el declive.

5 Análisis de la tendencia de las clasificaciones de películas

  • Lea el archivo csv y guárdelo en forma de marco de datos (df)

  • Recorrer la línea df, guardar en la lista

  • Cuente el número de calificaciones iguales en la misma fecha

  • Convierte a formato df, establece el nombre de la columna

  • Ordenar por fecha

  • Al atravesar el nuevo df, la puntuación de cada fecha se divide en 5 tipos, por lo que es necesario insertar valores faltantes adicionales.

creat_df = pd.DataFrame(columns = ['score', 'date', 'votes']) # 创建空的dataframe
for i in list(info_new['date']):
    location = info_new[(info_new.date==i)&(info_new.score=="力荐")].index.tolist()
    if location == []:
        creat_df.loc[mark] = ["力荐", i, 0]
        mark += 1
    location = info_new[(info_new.date==i)&(info_new.score=="推荐")].index.tolist()
    if location == []:
        creat_df.loc[mark] = ["推荐", i, 0]
        mark += 1
    location = info_new[(info_new.date==i)&(info_new.score=="还行")].index.tolist()
    if location == []:
        creat_df.loc[mark] = ["还行", i, 0]
        mark += 1
    location = info_new[(info_new.date==i)&(info_new.score=="较差")].index.tolist()
    if location == []:
        creat_df.loc[mark] = ["较差", i, 0]
        mark += 1
    location = info_new[(info_new.date==i)&(info_new.score=="很差")].index.tolist()
    if location == []:
        creat_df.loc[mark] = ["很差", i, 0]
        mark += 1
info_new = info_new.append(creat_df.drop_duplicates(), ignore_index=True)

 

Debido a la pequeña cantidad de rastreo permitido y los problemas de tiempo, algunos datos no son muy obvios. Pero todavía se pueden extraer algunos hallazgos. Dentro de una semana del lanzamiento de la película, es el pico de críticas, especialmente dentro de los 3 días posteriores al lanzamiento, lo cual es de sentido común, pero también puede estar sesgado, porque los datos obtenidos por el rastreador están ordenados por películas de Douban. Si la cantidad de datos es lo suficientemente grande, la tendencia puede ser Más cerca de la situación real.

Además, se descubrió que hay algunos comentarios antes del lanzamiento de la película. El análisis puede ser una vista previa a pequeña escala antes del lanzamiento del teatro, y la calificación promedio de estos usuarios preaprobados es casi cercana a la calificación final de las revisiones a gran escala después de la revisión de la película. Podemos suponer que aquellos que pueden ver la película con anticipación pueden ser fanáticos de la película o practicantes de cine y televisión, y sus comentarios tienen un muy buen valor de referencia.

6 Film Review Word Cloud

Al crear la imagen de la nube de palabras, primero lea el archivo CSV y guárdelo en forma de un marco de datos, elimine el texto no chino en los comentarios, seleccione la foto Hu Ge como fondo y establezca una lista de palabras de detención.

wc = WordCloud(width=1024, height=768, background_color='white',
     mask=backgroud_Image, font_path="C:\simhei.ttf",
     stopwords=stopwords, max_font_size=400,random_state=50)

Se puede ver que la palabra de alta frecuencia "mayo" muestra el reconocimiento de la película, "efectos especiales" refleja la importancia de las lentes de efectos especiales para las películas de ciencia ficción y "películas de ciencia ficción" muestra el gran interés de los fanáticos en las películas de ciencia ficción.

Lo anterior es el proceso y el análisis de datos de esta breve revisión de Douban.com "Wandering Earth".

Enlace original a la cuenta oficial de WeChat

WeChat cuenta pública " aprendiz financiero que aprende programación " back-end " vagando por la tierra " para obtener el código fuente .

 

11 artículos originales publicados · Me gusta 11 · Visitas 5726

Supongo que te gusta

Origin blog.csdn.net/weixin_39270299/article/details/87200198
Recomendado
Clasificación