Python rastejando "Dollar Earth" Douban - análise de filmes e visualização de análise de dados

"Wandering Earth" foi lançado em todo o país no dia de ano novo. No escore de Douban, o escore de abertura no primeiro dia ficou acima de 8 pontos, continuando a alta reputação mostrada anteriormente. No Weibo, seguiu-se uma pesquisa de 31 dias por Wu Jing e uma pesquisa quente de 60 milhões de investimentos. A resposta de Zhihu para "como avaliar a nova adaptação de Liu Cixin do filme" Wandering Earth "" atraiu a atenção de muitas pessoas, incluindo a resposta mais alta do diretor, Guo Fan.

Este artigo rastreou parte das resenhas de filmes de "Wandering Earth" no site de Douban e executou análise e visualização de dados. A seguir está todo o processo de análise de rastreamento, vamos começar felizes!

1. Análise de página da web

O Douban.com baniu os dados de rastreamento desde outubro de 2017. Apenas 200 comentários curtos podem ser rastreados no estado sem logon e apenas 500 dados podem ser rastreados no estado de logon. Você pode rastrear até 40 vezes por minuto durante o dia e 60 vezes à noite.Se o número for excedido, o endereço IP será bloqueado. Quando Satoshi Satoshi obteve 400 pedaços de dados rastreados, ele foi bloqueado do IP e sua conta foi forçada a sair. Depois disso, sua conta foi restaurada enviando uma mensagem de texto. Portanto, não é recomendável rastrear várias vezes.

Obter objeto

  • Comentar usuários

  • Conteúdo do comentário

  • Classificação

  • Data do comentário

  • Cidade do usuário

Vale a pena notar que, na barra de endereços, descobriremos que o número de identificação do filme é 26266893 (outros filmes precisam apenas mudar o ID) e cada página tem 20 resenhas curtas, então eu rastejei 20 páginas. A página de comentários não possui a cidade do usuário. É necessário entrar na página do usuário para obter informações.

 

Segundo, aquisição e armazenamento de dados

1  obter cookies

O Komoto usa o navegador Chrome, Ctrl + F12, para entrar na página de ferramentas do desenvolvedor. F5 atualiza os dados que aparecem e localiza cookies e cabeçalhos.

2 Carregue cabeçalhos e cookies e use a biblioteca de solicitações para obter informações

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 Analisando Dados de Demanda

Use a análise xpath aqui. Verificou-se que, embora alguns usuários tenham feito comentários, eles não deram classificações, portanto as posições xpath de pontuação e data serão alteradas. Portanto, é necessário acrescentar julgamento, se for constatado que a pontuação é analisada na data, isso prova que o comentário não deu uma classificação.

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 Obter o nome do filme

Somente o valor de ID de 8 bits do assunto do filme pode ser obtido a partir da URL, causando a necessidade de analisar a página da Web para obter o nome do filme correspondente ao número de ID. Essa função é adicionada em aprimoramentos posteriores, para evitar mais alterações no código existente (roubar um preguiçoso), O uso da atribuição de variável global é movie_namenecessário para prestar atenção à globaldeclaração de variáveis ​​globais .

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 Armazenamento de dados

Como não há muitos dados, escolha armazenamento 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álise e visualização de dados

1  obter cookies

Seleção de informações da cidade em chinês

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

Corresponde à lista de cidades suportadas por pyecharts

 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álise de sentimentos baseada no snownlp

O Snownlp pode executar principalmente segmentação de palavras em chinês (o algoritmo é modelo generativo baseado em caracteres), marcação de parte do discurso (o princípio é TnT, cavalo escondido de 3 gramas), análise de sentimentos (o site oficial tem um princípio de introdução, mas a taxa de precisão das avaliações de compras é maior. De fato, como o corpus é principalmente para compras, você pode criar seu próprio corpus em campos relacionados, substituir o original e a precisão é boa), classificação de texto (o princípio é Naive Bayes), converter Pinyin, tradicional em simplificado, Extrair palavras-chave de texto (o princípio é TextRank), extrair resumos (o princípio é TextRank), frases de segmento e texto é semelhante (o princípio é BM25) [extraído do CSDN]. Antes de ler isso, é recomendável dar uma olhada no site oficial, que contém os comandos mais básicos. Link do site oficial: https://pypi.org/project/snownlp/

Como snownlp é todo codificado em Unicode, preste atenção se os dados são codificados em Unicode. Por ser uma codificação unicode, não há necessidade de remover o inglês contido no texto em chinês, pois será transcodificado em uma codificação unificada. O código acima apenas chama o corpus nativo do snownlp para analisar o texto.O snownlp se concentra no campo de avaliação de compras, para melhorar a precisão da análise de sentimentos Grau pode levar o método de treinamento 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álise da cidade

Chamar função de página pyecharts, você pode criar múltiplos em um objeto de imagem chart, basta adicionar o correspondente.

    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álise de sentimento de filme

Emoções negativas abaixo de 0,5, emoções positivas acima de 0,5. Pode-se ver que os elogios ainda são muito bons: quanto a Douban, existem apenas alguns comentários sobre o declínio.

5 Análise da tendência das classificações de filmes

  • Leia o arquivo csv e salve-o na forma de dataframe (df)

  • Atravessar linha df, salvar na lista

  • Contar o número de mesmas classificações na mesma data

  • Converta para o formato df, defina o nome da coluna

  • Classificar por data

  • Atravessando o novo df, a pontuação de cada data é dividida em 5 tipos, portanto, é necessário inserir o valor ausente.

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)

 

Devido à pequena quantidade permitida de rastreamento e problemas de tempo, alguns dados não são muito óbvios. Mas algumas descobertas ainda podem ser feitas. Dentro de uma semana do lançamento do filme, é o pico das resenhas, especialmente dentro de três dias após o lançamento, o que é senso comum, mas também pode ser tendencioso, porque os dados obtidos pelo rastreador são classificados pelos filmes de Douban. Se a quantidade de dados for grande o suficiente, a tendência poderá ser Mais perto da situação real.

Além disso, verificou-se que existem alguns comentários antes do lançamento do filme.A análise pode ser uma prévia em pequena escala antes do lançamento do cinema, e a classificação média desses usuários pré-aprovados é quase próxima da classificação final das críticas em larga escala após a revisão do filme. Podemos supor que aqueles que podem assistir ao filme com antecedência podem ser fãs seniores de cinema ou praticantes de cinema e televisão, e seus comentários têm um valor de referência muito bom.

6 Film Review Word Cloud

Ao criar a imagem da nuvem de palavras, leia primeiro o arquivo CSV e salve-o na forma de um quadro de dados, remova o texto não chinês nos comentários, selecione a foto Hu Ge como plano de fundo e defina uma lista de palavras de parada.

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)

Pode-se observar que a palavra de alta frequência "pode" mostra o reconhecimento do filme, "efeitos especiais" reflete a importância de lentes de efeitos especiais para filmes de ficção científica e "filmes de ficção científica" mostra o forte interesse dos fãs em filmes de ficção científica.

A descrição acima é o processo e a análise de dados desta breve revisão do Douban.com "Wandering Earth".

Link original para a conta oficial do WeChat

Conta pública do WeChat " aprendiz financeiro que aprende a programar " back-end " vagando na terra " para obter o código-fonte .

 

Publicado 11 artigos originais · Gosto 11 · Visitas 5726

Acho que você gosta

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