zoukankan      html  css  js  c++  java
  • 爬虫综合大作业

    爬虫综合大作业

    作业要求来自于:

    一.把爬取的内容保存取MySQL数据库

    import pandas as pd

    import pymysql

    from sqlalchemy import create_engine

    conInfo = "mysql+pymysql://user:passwd@host:port/gzccnews?charset=utf8"

    engine = create_engine(conInfo,encoding='utf-8')

    df = pd.DataFrame(allnews)

    df.to_sql(name = 'news', con = engine, if_exists = 'append', index = False)

    二.爬虫综合大作业

    选择一个热点或者你感兴趣的主题。

    选择爬取的对象与范围。

    了解爬取对象的限制与约束。

    爬取相应内容。

    做数据分析与文本分析。

    形成一篇文章,有说明、技术要点、有数据、有数据分析图形化展示与说明、文本分析图形化展示与说明。

    文章公开发布。

    三.爬虫注意事项

    1.设置合理的爬取间隔,不会给对方运维人员造成压力,也可以防止程序被迫中止。

    import time

    import random

    time.sleep(random.random()*3)

    2.设置合理的user-agent,模拟成真实的浏览器去提取内容。

    首先打开你的浏览器输入:about:version。

    用户代理:

    收集一些比较常用的浏览器的user-agent放到列表里面。

    然后import random,使用随机获取一个user-agent

    定义请求头字典headers={'User-Agen':}

    发送request.get时,带上自定义了User-Agen的headers

    3.需要登录

    发送request.get时,带上自定义了Cookie的headers

    headers={'User-Agen':

    'Cookie': }

    4.使用代理IP

    通过更换IP来达到不断高 效爬取数据的目的。

    headers = {

    "User-Agent": "",

    }

    proxies = {

    "http": " ",

    "https": " ",

    }

    response = requests.get(url, headers=headers, proxies=proxies)

    正文:

    一、爬取的网站:中国传媒大学南广学院

    爬取范围:中国传媒大学南广学院的新闻

    爬取要求:对新闻信息进行词云分析,新闻时间与事件点击量排序,词频统计。

    二、详细爬取过程:

    1.首先需要对每个新闻页面信息的爬取:alist

    代码如下:

    def alist(url):
        '''
        获取页面的各种新闻,然后逐条进入
        :param url: listUrl
        :return: newsList
        '''
        res=requests.get(listUrl)
        res.encoding='utf-8'
        soup = BeautifulSoup(res.text,'html.parser')
        newsList=[]
        for news in soup.select('li'):#获取li元素
            if len(news.select('.text-list'))>0:#如果存在新闻题目
                newsUrl = news.select('a')[0]['href']#获取新闻的链接
                newsDesc = news.select('span')[0].text#获取时间
                newsDict = anews(newsUrl)#通过进入链接获取详细信息
                newsDict['time'] = newsDesc
                newsList.append(newsDict)#把每个新闻的信息放进字典扩展到列表里
        return newsList

    2.然后再获取新闻页面的url进入新闻详细页面,对新闻详细页面信息的爬取:anews

    代码如下:

    def anews(url):
        '''
        进入后爬取主要内容
        :param url: url
        :return: newsDetail
        '''
        newsDetail = {}
        res = requests.get(url)
        res.encoding = 'utf-8'
        soup = BeautifulSoup(res.text,'html.parser')
        newsDetail['newsTitle'] = soup.select('.zw-title h2')[0].text#题目
        newsDetail['newsClick'] = soup.select('.liulan')[0].text  # 点击次数
        a = len(soup.select('.zw-text p'))#获取存放内容的p标签
        c = ""#后面用来进行每个p标签的内容相加
        for i in range(0,a):#获取每个p标签的文本内容
            if soup.select('.zw-text p')[i].text != "
    
    ":#剔除空内容
                b = ( soup.select('.zw-text p')[i].text)
                c = c+b#文本内容衔接
        newsDetail['newstext'] = c#将文本内容放进字典
        return newsDetail

    3.对新闻新信息进行简单数据处理:更新时间与点击量的排序

    代码如下:

    newsdf = pd.DataFrame(allnews)
    print(newsdf)
    print(newsdf.sort_values(by=['time'],ascending=False))#按更新时间降序排列
    print(newsdf.sort_values(by=['newsClick'],ascending=False))#按点击量降序排列

    4.对新闻文本信息进行数据清洗

    代码如下:

    # 加载停用词表
        stopwords = [line.strip() for line in open('stops_chinese1.txt', encoding='utf-8').readlines()]
        # 分词
        zhuanhua = str(allnews)#将字典转化为string格式
        wordsls = jieba.lcut(zhuanhua)
        wcdict = {}
        for word in wordsls:
            # 不在停用词表中
            if word not in stopwords:
                # 不统计字数为一的词
                if len(word) == 1:
                    continue
                else:
                    wcdict[word] = wcdict.get(word, 0) + 1

    5.对文本信息进行词频排序:

    代码如下:

    wcls=list(wcdict.items())
    wcls.sort(key=lambda x:x[1],reverse=True)
    #输出词频最大TOP20
    for i in range(20):
        print(wcls[i])

    6. 生成词云

    代码如下:

    cut_text = " ".join(wcdict)#join返回通过指定字符连接序列中元素后生成的新字符串
    mywc = WordCloud(font_path = 'msyh.ttc').generate(cut_text)
    plt.imshow(mywc)
    plt.axis("off")
    plt.show()

    7. 设置合理的爬取间隔

    代码如下:

     for i in range(3):
         print(i)
         time.sleep(random.random()*3)#沉睡随机数的3倍秒数

    8. 保存到csv与sql文件

    代码如下:

    newsdf.to_csv(r'F:作业大三下大数据homework8cucn.csv',encoding='utf_8_sig')#保存成csv格式,为避免乱码,设置编码格式为utf_8_sig
    
    with sqlite3.connect(r'F:作业大三下大数据homework8cucnsql.sqlite') as db:#保存文件为sql
        newsdf.to_sql('gzccnewsdb',db)

    三、运行截图:

     

    词云生成如下图所示:

     

    保存成csv文件截图:

  • 相关阅读:
    Kubernetes 认证(证书)过期怎么办
    JavaScript 全屏显示窗口
    IE6下很无语的问题,不知为何
    项目开发-让设计模式成为一种心智(转)
    CSS中Float概念相关文章采撷
    随记浏览器兼容性
    常用正则表达式
    ASP.NET 调用Delphi DLL问题
    ASP.NET调用DELPHI DLL
    转:Oracle 排序中常用的NULL值处理方法
  • 原文地址:https://www.cnblogs.com/lys1894/p/10787125.html
Copyright © 2011-2022 走看看