疫情下的舆情预测系统工作报告part.4

项目地址:

https://github.com/Lee991211/Innovation_training.git

数据清洗

当获取了大量的微博数据,需要对冗余数据进行清洗,使数据满足一定格式,以达到模型训练的要求@杨涛同学。当然这个任务相对于爬取就比较简单了,出于保存数据备份的想法,我的清洗脚本分为两步。

wash:

import pandas as pd

data1 = pd.read_csv("keyword.csv")
#data2 = pd.read_csv("Aprilplus.csv")

data1.drop(data1.columns[[0, 1, 2, 3, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15, 16]], axis=1, inplace=True)
#data2.drop(data2.columns[[0, 1, 2, 3, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15, 16]], axis=1, inplace=True)

df1 = pd.DataFrame(data1)
#df2 = pd.DataFrame(data2)

df1.to_csv('keywordtemp.csv', index=None)
#df2.to_csv('washAprilPlus.csv', index=None)

wash可以将微博爬取的原文件去掉多余的列,只留下微博正文和发布时间两列。

wash2:

import pandas as pd
import csv

data1 = pd.read_csv("keywordtemp.csv",)
# data2 = pd.read_csv("washAprilPlus.csv",)

data1['发布时间'] = data1['发布时间'].str.split(' ', expand=True)[0]
# data2['发布时间'] = data2['发布时间'].str.split(' ', expand=True)[0]

data1['发布时间'] = data1['发布时间'].str.split('-', expand=True)[1] + '/' + data1['发布时间'].str.split('-', expand=True)[2]
# data2['发布时间'] = data2['发布时间'].str.split('-', expand=True)[1] + '/' + data2['发布时间'].str.split('-', expand=True)[2]

count = 1

result = []
temp = []

for row in data1.index:
    if data1.loc[row].values[1] == '05/01':
        temp.append(data1.loc[row].values)
        count = count + 1
    if count == 16:
        result = result + temp
        temp = []
        count = 1
        break

for row in data1.index:
    if data1.loc[row].values[1] == '05/02':
        temp.append(data1.loc[row].values)
        count = count + 1
    if count == 16:
        result = result + temp
        temp = []
        count = 1
        break

for row in data1.index:
    if data1.loc[row].values[1] == '05/03':
        temp.append(data1.loc[row].values)
        count = count + 1
    if count == 16:
        result = result + temp
        temp = []
        count = 1
        break

for row in data1.index:
    if data1.loc[row].values[1] == '05/04':
        temp.append(data1.loc[row].values)
        count = count + 1
    if count == 16:
        result = result + temp
        temp = []
        count = 1
        break

for row in data1.index:
    if data1.loc[row].values[1] == '05/05':
        temp.append(data1.loc[row].values)
        count = count + 1
    if count == 16:
        result = result + temp
        temp = []
        count = 1
        break

for row in data1.index:
    if data1.loc[row].values[1] == '05/06':
        temp.append(data1.loc[row].values)
        count = count + 1
    if count == 16:
        result = result + temp
        temp = []
        count = 1
        break

for row in data1.index:
    if data1.loc[row].values[1] == '05/07':
        temp.append(data1.loc[row].values)
        count = count + 1
    if count == 16:
        result = result + temp
        temp = []
        count = 1
        break

for row in data1.index:
    if data1.loc[row].values[1] == '05/08':
        temp.append(data1.loc[row].values)
        count = count + 1
    if count == 16:
        result = result + temp
        temp = []
        count = 1
        break

for row in data1.index:
    if data1.loc[row].values[1] == '05/09':
        temp.append(data1.loc[row].values)
        count = count + 1
    if count == 16:
        result = result + temp
        temp = []
        count = 1
        break

for row in data1.index:
    if data1.loc[row].values[1] == '05/10':
        temp.append(data1.loc[row].values)
        count = count + 1
    if count == 16:
        result = result + temp
        temp = []
        count = 1
        break

for row in data1.index:
    if data1.loc[row].values[1] == '05/11':
        temp.append(data1.loc[row].values)
        count = count + 1
    if count == 16:
        result = result + temp
        temp = []
        count = 1
        break

for row in data1.index:
    if data1.loc[row].values[1] == '05/12':
        temp.append(data1.loc[row].values)
        count = count + 1
    if count == 16:
        result = result + temp
        temp = []
        count = 1
        break

for row in data1.index:
    if data1.loc[row].values[1] == '05/13':
        temp.append(data1.loc[row].values)
        count = count + 1
    if count == 16:
        result = result + temp
        temp = []
        count = 1
        break

for row in data1.index:
    if data1.loc[row].values[1] == '05/14':
        temp.append(data1.loc[row].values)
        count = count + 1
    if count == 16:
        result = result + temp
        temp = []
        count = 1
        break

for row in data1.index:
    if data1.loc[row].values[1] == '05/15':
        temp.append(data1.loc[row].values)
        count = count + 1
    if count == 16:
        result = result + temp
        temp = []
        count = 1
        break

for row in data1.index:
    if data1.loc[row].values[1] == '05/16':
        temp.append(data1.loc[row].values)
        count = count + 1
    if count == 16:
        result = result + temp
        temp = []
        count = 1
        break

for row in data1.index:
    if data1.loc[row].values[1] == '05/17':
        temp.append(data1.loc[row].values)
        count = count + 1
    if count == 16:
        result = result + temp
        temp = []
        count = 1
        break

for row in data1.index:
    if data1.loc[row].values[1] == '05/18':
        temp.append(data1.loc[row].values)
        count = count + 1
    if count == 16:
        result = result + temp
        temp = []
        count = 1
        break

for row in data1.index:
    if data1.loc[row].values[1] == '05/19':
        temp.append(data1.loc[row].values)
        count = count + 1
    if count == 16:
        result = result + temp
        temp = []
        count = 1
        break

for row in data1.index:
    if data1.loc[row].values[1] == '05/20':
        temp.append(data1.loc[row].values)
        count = count + 1
    if count == 16:
        result = result + temp
        temp = []
        count = 1
        break

for row in data1.index:
    if data1.loc[row].values[1] == '05/21':
        temp.append(data1.loc[row].values)
        count = count + 1
    if count == 16:
        result = result + temp
        temp = []
        count = 1
        break

for row in data1.index:
    if data1.loc[row].values[1] == '05/22':
        temp.append(data1.loc[row].values)
        count = count + 1
    if count == 16:
        result = result + temp
        temp = []
        count = 1
        break

for row in data1.index:
    if data1.loc[row].values[1] == '05/23':
        temp.append(data1.loc[row].values)
        count = count + 1
    if count == 16:
        result = result + temp
        temp = []
        count = 1
        break

for row in data1.index:
    if data1.loc[row].values[1] == '05/24':
        temp.append(data1.loc[row].values)
        count = count + 1
    if count == 16:
        result = result + temp
        temp = []
        count = 1
        break

for row in data1.index:
    if data1.loc[row].values[1] == '05/25':
        temp.append(data1.loc[row].values)
        count = count + 1
    if count == 16:
        result = result + temp
        temp = []
        count = 1
        break

for row in data1.index:
    if data1.loc[row].values[1] == '05/26':
        temp.append(data1.loc[row].values)
        count = count + 1
    if count == 16:
        result = result + temp
        temp = []
        count = 1
        break

for row in data1.index:
    if data1.loc[row].values[1] == '05/27':
        temp.append(data1.loc[row].values)
        count = count + 1
    if count == 16:
        result = result + temp
        temp = []
        count = 1
        break

for row in data1.index:
    if data1.loc[row].values[1] == '05/28':
        temp.append(data1.loc[row].values)
        count = count + 1
    if count == 16:
        result = result + temp
        temp = []
        count = 1
        break

for row in data1.index:
    if data1.loc[row].values[1] == '05/29':
        temp.append(data1.loc[row].values)
        count = count + 1
    if count == 16:
        result = result + temp
        temp = []
        count = 1
        break

for row in data1.index:
    if data1.loc[row].values[1] == '05/30':
        temp.append(data1.loc[row].values)
        count = count + 1
    if count == 16:
        result = result + temp
        temp = []
        count = 1
        break

for row in data1.index:
    if data1.loc[row].values[1] == '05/31':
        temp.append(data1.loc[row].values)
        count = count + 1
    if count == 16:
        result = result + temp
        temp = []
        count = 1
        break

with open('keywordfinal.csv', 'w', encoding='utf-8', newline='') as csvfile:
    writer = csv.writer(csvfile)
    for row in result:
        writer.writerow(row)

wash2能够将wash清洗后的文件截取每天15条(可自编辑)

观察者网

观察者网首页的爬取没有微博数据那么复杂,只需要获取网页中的url、author、title、publish_time、content数据并存到数据库中就ok
爬取部分:

    def spider(self):
        while not self.url_queue.empty():
            item = {}
            url = self.url_queue.get()
            if self.check_url(url):
                print('正在爬取{url}')
                response = requests.get(url, headers=headers)
                response.encoding = "utf-8"
                html = etree.HTML(response.text)
                results = html.xpath('//ul/li[contains(@class,"left left-main")]')

                for result in results:
                    item['url'] = url
                    author = result.xpath('./ul/li/div[contains(@class,author-intro)]/p/a/text()')
                    if not author:
                        author = html.xpath('//div[contains(@class,"time")]/span[3]/text()')
                    if not author:
                        self.get_news(response.text, item)
                        continue
                    item['author'] = author[0]

                    item['title'] = result.xpath('./h3/text()')[0]

                    item['publish_time'] = result.xpath('./div[contains(@class,"time")]/span[1]/text()')[0]

                    content = result.xpath('./div[contains(@class,"content")]/p/text()')
                    content = ''.join(content)
                    content = re.sub('\s', '', content)
                    item['content'] = content

                self.save(item)

存储部分:

    def save(self, item):
        self.cursor.execute(self.sql,
                            [item['title'], item['author'], item['publish_time'], item['content'], item['url']])
        self.cnn.commit()

为了避免重复爬取相同的数据,需要在爬取时检查url是否已存在于本地中,于是addurl和checkurl方法产生了

def check_url(self, url):
        if url in self.urls:
            print('{url}已存在')
            return False
        else:
            self.urls.append(url)
            return True
            
def add_urls(urls, queue):
    for url in urls:
        url = 'https://www.guancha.cn' + url
        queue.put(url)

结语

这次项目比较有现实意义,尤其是在2020年的现在更是如此。我们已经进入大数据时代,用数据说话成为研究社会科学的有效手段。任何系统的分析模型训练都需要数据的获取,因此爬取数据成为了一个数据分析系统最底层的部分,下一步希望能将爬虫脚本自动化、并行化运行。

热门文章

暂无图片
编程学习 ·

操作系统——银行家算法

银行家算法安全性检测C++实现,求安全序列 #include <bits/stdc++.h>using namespace std; const int N = 100;const int total_resources = 3; //资源总数struct process {/* data */int resources_max[total_resources]; //每种资源的总大需求量int resources_a…
暂无图片
编程学习 ·

dnf强化系统实测 java代码

import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader;/*** dnf强化系统实测*/ public class Qianghua {public static void main(String[] args) throws IOException {//手动强化//manualQianghua();//自动强化autoQianghua(0,16);}…
暂无图片
编程学习 ·

文献管理之 Citavi & Latex

文章目录为什么选择Citavi安装地址使用指南不足之处官方文档 为什么选择Citavi 比较好的文献管理软件主要有Citavi、Endnote、Mendeley、Zotero,根据Citavi、Endnote、Mendeley 功能大比拼!到底哪一款才是众望所归的终极文献管理软件?总结,Citavi不仅是个免费的软件,而且功…
暂无图片
编程学习 ·

Spring学习笔记(一):工厂模式

Spring学习笔记一:工厂模式1.简介2.工厂模式简单工厂设计通⽤⼯⼚的设计通用工厂的使用方式 1.简介 1.Spring是⼀个轻量级的 JavaEE 解决⽅案,整合众多优秀的设计模式。 2.EJB(Enterprise Java Bean):重量级框架,存在问题包括:运行环境苛刻,代码移植性差。 什么是轻量级?…
暂无图片
编程学习 ·

销售分析 II

题目描述:Table: Product+--------------+---------+ | Column Name | Type | +--------------+---------+ | product_id | int | | product_name | varchar | | unit_price | int | +--------------+---------+ product_id 是这张表的主键 Table: Sales+----…
暂无图片
编程学习 ·

面试题:从 URL 在浏览器被输入到页面展现的过程中发生了什么?

曾经有这么一道面试题:从 URL 在浏览器被被输入到页面展现的过程中发生了什么?相信大多数准备过的同学都能回答出来,但是如果继续问:收到的 HTML 如果包含几十个图片标签,这些图片是以什么方式、什么顺序、建立了多少连接、使用什么协议被下载下来的呢?要搞懂这个问题,我…
暂无图片
编程学习 ·

nginx从下载到部署全过程(Linux)

导航NGINX官网下载NGINX安装环境解压,编译,安装启动及测试NGINX官网以下列举了三个网址,分别是:NGINX官网,下载网址及官方文档。官方网站:http://nginx.org/下载网址:http://nginx.org/en/download.html官方文档:http://nginx.org/en/docs/ 下载NGINX 通过官方下载地址…
暂无图片
编程学习 ·

小甲鱼python听课笔记p11-p15

p11 7.1 列表1 = 打了激素的数组列表可以存放不同类型的数,还可以创建空列表append():向列表里面添加数据末尾添加一个元素但是只能一次插入一个数据extend():扩张的方式来扩展列表末尾添加多个元素,但要求已列表的格式添加[x,x,x,x]用一个列表来扩展另一个列表,所以他…
暂无图片
编程学习 ·

MySQL数据类型(最大值和最小值--类型定义的值)

MySQL数据类型定义的值:1、整型MySQL数据类型含义(有符号)tinyint(m)1个字节 范围(-128~127)smallint(m)2个字节 范围(-32768~32767)mediumint(m)3个字节 范围(-8388608~8388607)int(m)4个字节 范围(-2147483648~2147483647)bigint(m)8个字节 范围(+-9.22*10的18次方)取…
暂无图片
编程学习 ·

Centos7中iptables防火墙的设置

防火墙的种类:包过滤防火墙 代理防火墙 状态检测技术通信原理: 一台客户端>iptables>服务器 数据包---》iptables把数据包分类进行处理(各种表rew,mangle,nat,filter表等)-- -》 filter:允许,不允许通过数据包。 nat:进行数据转换的数据包。 mangle:对数据包做…
暂无图片
编程学习 ·

JAVA学习之路(3) request的总结

文章目录引言Request对请求行数据的操作Request对请求头数据的操作Request对请求头数据的操作通用方式中文乱码问题请求转发 引言 在httpServlet类中,我们只需要调用doGet和doPost方法即可以实现对应的功能。对应这两个方法,有两个穿进去的参数对象,一个是response,一个是r…
暂无图片
编程学习 ·

Design-装饰者模式

装饰者模式介绍实现代码 介绍 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供…
暂无图片
编程学习 ·

web 页面如何实现不同分组数据的连续序号?

如果没有报表工具的话,可以通过前端代码来实现,主要分两部分实现:第一部分是数据进行排序之后添加序号设置,第二部分把分组字段对应的列数据进行同值合并。但是当数据有分页情况或者隐藏行时,代码处理复杂度会高,而且当数据量比较大时,性能处理上对开发人员的能力要求比…
暂无图片
编程学习 ·

react全局监听路由变化

关于WithRouter作用:把不是通过路由切换过来的组件中,将react-router 的 history、location、match 三个对象传入props对象上介绍一个简单应用通过withRouter将三个属性传入组件的props上,路径变化,属性就会变化,属性变化,就会触发componentWillReciveProps这个钩子,我们…
暂无图片
编程学习 ·

流表

如前文所述,OpenFlow的设计目标之一就是将网络设备的控制功能与转发功能进行分离,进而将控制功能全部集中到远程的控制器上完成,而OpenFlow交换机只负责在本地做简单高速的数据转发。在OpenFlow交换机的运行过程中,其数据转发的依据就是流表。所谓流表,其实可被视作是Open…
暂无图片
编程学习 ·

一遇“高并发”系统就难逃一“崩”,性能测试的方法你真的选对了吗?

大促常态化的当下,平台总是会提前做各种排查测试,严阵以待,生怕出现高并发带来的,但往往还是防不胜防。事实上,在移动互联网盛行的当下,超高并发压力并不只存在于电商领域,在线教育、在线办公、社交娱乐等领域同样深受其扰。 在超高并发量下,IT系统如何才能挺住不崩?有…
暂无图片
编程学习 ·

要哭了!一下午终于弄好了,pycharm和python的pyqt5安装

安装pyqt5和sip还有pyqt5-tools,我遇到了所有能遇到的问题,诸如配置问题,没安装sip,缺少vcruntime140_1.dll文件,还有 pyqt5打开designer提示This application failed to start because no Qt platform plugin could be initialized问题,搞了一下午,真的要哭了,慢慢就解…