爬虫大作业
1.选一个自己感兴趣的主题。
2.用python 编写爬虫程序,从网络上爬取相关主题的数据。
3.对爬了的数据进行文本分析,生成词云。
4.对文本分析结果进行解释说明。
5.写一篇完整的博客,描述上述实现过程、遇到的问题及解决办法、数据分析思想及结论。
6.最后提交爬取的全部数据、爬虫及数据分析源代码。
前言:由于自己对赛车情有独钟,所以本次作业去爬取腾讯F1赛车频道的列表页中的有关新闻
实现过程:
- 首先找到列表页,通过开发者工具获取到每条新闻列表的链接,进入新闻详细页面。
- 进入新闻详细页面后,通过开发者工具去获取正文的内容,发现正文都是用一对<p class="text">标签存放的
遇到的问题:
由于正文的内容都是用一对对<p class="text">存放的,刚开始的时候用for循环去寻找<p class="text">的个数,这种方法对于一条新闻有用,但对其他的新闻会报错,所以经过一番思考才想到了用现在这种方法,即先找到所有带这个标签的元素,再统计个数,这样就不会出现报错了。详细代码如下:
import requests from bs4 import BeautifulSoup import jieba import re # 将得到的新闻内容写入文件 def write_news_to_document(filename, content): f = open(filename, 'w', encoding='utf-8') for detail in content: f.write(detail['content']) f.close() # 将得到的关键词写入文件 def write_keywords_to_document(filename, keywords): f = open(filename, 'w', encoding='utf-8') for word in keywords: f.write(' ' + word) f.close() # 通过jieba分词得到关键词 def get_keywords(filename): f = open(filename, 'r', encoding='utf-8') content = f.read() f.close() word_set = set(jieba.lcut(''.join(re.findall("[\u4e00-\u9fa5_a-zA-Z0-9]", content)))) # 通过正则表达式选取中文,字母及数字字符数组,拼接为无标点字符内容,再转换为字符集合 word_dict = {} delete_list = [] keywords = [] for a in word_set: word_dict[a] = content.count(a) # 生成词云字典 for j in word_dict.keys(): if len(j) < 2: delete_list.append(j) # 生成单字无意义字符列表 for k in delete_list: del word_dict[k] # 在词云字典中删除无意义字符 dict_list = list(word_dict.items()) dict_list.sort(key=lambda item: item[1], reverse=True) for dict in dict_list: keywords.append(dict[0]) print(keywords) write_keywords_to_document("NewsKeyword.txt", keywords) # 获取详细新闻内容 def get_news_detail(news_url): res_d = requests.get(news_url) res_d.encoding = 'gbk' soup_d = BeautifulSoup(res_d.text, 'html.parser') content = '' for p in range(0, len(soup_d.select(".text"))): content += soup_d.select('.text')[p].text + '\n' detail = {'content': content} return detail # 获取新闻列表 def get_news_list(list_url): res = requests.get(list_url) res.encoding = 'gbk' soup = BeautifulSoup(res.text, 'html.parser') page_detail = [] for newsList in soup.select('.newslist')[0].select('li'): news_detail = get_news_detail(newsList.select('a')[0]['href']) page_detail.append(news_detail) return page_detail # 添加自定义词汇 jieba.add_word('维斯塔潘') jieba.add_word('维特尔') jieba.add_word("范多恩") jieba.add_word("加斯利") jieba.add_word("托斯特") jieba.add_word("小红牛") jieba.add_word("大红牛") jieba.add_word("库比卡") jieba.add_word("马格努森") jieba.add_word("倍耐力") jieba.add_word("博塔斯") jieba.add_word("罗斯伯格") jieba.add_word("红牛车队") # 主函数 url = "http://sports.qq.com/l/f1/allf1news/list20100311191657.htm" Page_detail = get_news_list(url) write_news_to_document("News.txt", Page_detail) # 由于只有100页列表,所以循环范围是2到101 for i in range(2, 101): news_url = "http://sports.qq.com/l/f1/allf1news/list20100311191657_{}.htm".format(i) Page_detail = get_news_list(url) write_news_to_document("News.txt", Page_detail) get_keywords("News.txt")
生成的词云结果图如下:
由此可以看出,赛车新闻通常报道车手的表现,对赛场上各种事情的看法,比赛时使用的战术以及赛车的各个部件情况
结果如下:附件下载