• 爬虫大作业


    1.选一个自己感兴趣的主题。

    2.用python 编写爬虫程序,从网络上爬取相关主题的数据。

    3.对爬了的数据进行文本分析,生成词云。

    4.对文本分析结果进行解释说明。

    5.写一篇完整的博客,描述上述实现过程、遇到的问题及解决办法、数据分析思想及结论。

    6.最后提交爬取的全部数据、爬虫及数据分析源代码。

    前言:由于自己对赛车情有独钟,所以本次作业去爬取腾讯F1赛车频道的列表页中的有关新闻

    实现过程:

    1. 首先找到列表页,通过开发者工具获取到每条新闻列表的链接,进入新闻详细页面。
    2. 进入新闻详细页面后,通过开发者工具去获取正文的内容,发现正文都是用一对<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 + '
    '
        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")

     生成的词云结果图如下:

    由此可以看出,赛车新闻通常报道车手的表现,对赛场上各种事情的看法,比赛时使用的战术以及赛车的各个部件情况

    结果如下:附件下载

  • 相关阅读:
    django保存一个object的时候会发出信号
    转:django在生成数据库时常常遇到的问题
    转发一篇关于django模型详解的一篇好的博客
    OAutho2 请求响应格式
    在ASP.NET应用中执行后台任务
    编写一个简单的Web Server
    Xamarin改变移动开发的五个理由
    从AngularJS2谈到前台开发工程化
    Nancy启用跨站攻击防护(CSRF)
    Angular2
  • 原文地址:https://www.cnblogs.com/BennyKuang/p/8927006.html
Copyright © 2020-2023  润新知