在‘句子迷’爬取网友总结的方文山歌词并作词频统计
要求:
- 选一个自己感兴趣的主题。
- 用python 编写爬虫程序,从网络上爬取相关主题的数据。
- 对爬了的数据进行文本分析,生成词云。
- 对文本分析结果进行解释说明。
- 写一篇完整的博客,描述上述实现过程、遇到的问题及解决办法、数据分析思想及结论。
- 最后提交爬取的全部数据、爬虫及数据分析源代码。
在此次作业中,我通过爬取网站‘句子迷’中方文山的歌词片段来看其作词中词频以及网友较为喜欢方老师那些句子。
在爬取的过程中主要遇到的问题是该网站对于请求过来的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('\n'))
mLessSet.add(' ')
# 加载保留字
with open('reservedWord.txt', 'r', encoding='UTF-8') as reservedWordFile:
reservedWordSet = set(reservedWordFile.read().split('\n'))
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]+'\n')
上面的代码生成的word.txt
中,将词汇复制到网站https://wordsift.org/做词云生成,生成后的词云图如下:
以上代码可在此下载