zoukankan      html  css  js  c++  java
  • 在‘句子迷’爬取网友总结的方文山歌词并作词频统计

    要求:

    1. 选一个自己感兴趣的主题。
    2. 用python 编写爬虫程序,从网络上爬取相关主题的数据。
    3. 对爬了的数据进行文本分析,生成词云。
    4. 对文本分析结果进行解释说明。
    5. 写一篇完整的博客,描述上述实现过程、遇到的问题及解决办法、数据分析思想及结论。
    6. 最后提交爬取的全部数据、爬虫及数据分析源代码。

      在此次作业中,我通过爬取网站‘句子迷’中方文山的歌词片段来看其作词中词频以及网友较为喜欢方老师那些句子。
      在爬取的过程中主要遇到的问题是该网站对于请求过来的headers有做检查,所以需要加入headers参数,声明UA
      代码如下:

    import jieba
    import requests
    from bs4 import BeautifulSoup
    
    
    lyrics = ''
    headers = {
        'User-Agent': 'User-Agent:*/*'
    }
    
    resp = requests.get('http://www.juzimi.com/writer/%E6%96%B9%E6%96%87%E5%B1%B1', headers=headers)
    resp.encoding = 'UTF-8'
    print(resp.status_code)
    soup = BeautifulSoup(resp.text, 'html.parser')
    
    page_url = 'http://www.juzimi.com/writer/%E6%96%B9%E6%96%87%E5%B1%B1?page={}'
    page_last = soup.select('.pager-last')
    if len(page_last) > 0:
        page_last = page_last[0].text
    
    for i in range(0, int(page_last)):
        print(i)
        resp = requests.get(page_url.format(i), headers=headers)
        resp.encoding = 'UTF-8'
        soup = BeautifulSoup(resp.text, 'html.parser')
        for a in soup.select('.xlistju'):
            lyrics += a.text + ' '
    
    # 保留爬取的句子
    with open('lyrics.txt', 'a+', encoding='UTF-8') as lyricFile:
        lyricFile.write(lyrics)
    
    # 加载标点符号并去除歌词中的标点
    with open('punctuation.txt', 'r', encoding='UTF-8') as punctuationFile:
        for punctuation in punctuationFile.readlines():
            lyrics = lyrics.replace(punctuation[0], ' ')
    
    # 加载无意义词汇
    with open('meaningless.txt', 'r', encoding='UTF-8') as meaninglessFile:
        mLessSet = set(meaninglessFile.read().split('
    '))
    mLessSet.add(' ')
    
    # 加载保留字
    with open('reservedWord.txt', 'r', encoding='UTF-8') as reservedWordFile:
        reservedWordSet = set(reservedWordFile.read().split('
    '))
        for reservedWord in reservedWordSet:
            jieba.add_word(reservedWord)
    
    keywordList = list(jieba.cut(lyrics))
    keywordSet = set(keywordList) - mLessSet  # 将无意义词从词语集合中删除
    keywordDict = {}
    
    # 统计出词频字典
    for word in keywordSet:
        keywordDict[word] = keywordList.count(word)
    
    # 对词频进行排序
    keywordListSorted = list(keywordDict.items())
    keywordListSorted.sort(key=lambda e: e[1], reverse=True)
    # 将所有词频写出到txt
    for topWordTup in keywordListSorted:
        print(topWordTup)
        with open('word.txt', 'a+', encoding='UTF-8') as wordFile:
            for i in range(0, topWordTup[1]):
                wordFile.write(topWordTup[0]+'
    ')
    

      上面的代码生成的word.txt中,将词汇复制到网站https://wordsift.org/做词云生成,生成后的词云图如下:

    以上代码可在此下载

  • 相关阅读:
    2021,6,10 xjzx 模拟考试
    平衡树(二)——Treap
    AtCoder Beginner Contest 204 A-E简要题解
    POJ 2311 Cutting Game 题解
    Codeforces 990G GCD Counting 题解
    NOI2021 SDPTT D2T1 我已经完全理解了 DFS 序线段树 题解
    第三届山东省青少年创意编程与智能设计大赛总结
    Luogu P6042 「ACOI2020」学园祭 题解
    联合省选2021 游记
    Codeforces 1498E Two Houses 题解 —— 如何用结论吊打标算
  • 原文地址:https://www.cnblogs.com/lger/p/8908426.html
Copyright © 2011-2022 走看看