Python爬虫之爬取学校所有新闻标题并做成词云分析

1、获取数据并导入excel中

在这里插入图片描述

多线程爬取数据,存入excel中

import threading
import time
from queue import Queue
import time,os
from selenium import webdriver
from lxml import etree
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC#seleniunm内置一些条件
from selenium.webdriver.common.by import By
import requests
from excle_wirte import ExcelUtils


class CTBU(threading.Thread):
    def __init__(self,url,queue_page,name):
        super().__init__()
        self.url=url
        self.filename = 'C:/数据.xls'
        self.queue_page=queue_page
        self.name=name
        
        
    def run(self):
        while True:
            if self.queue_page.empty():
                break
            #取页码
            page = self.queue_page.get()  #出队操作
            #请求+解析
            self.parse_page(page)
        
                
    def parse_page(self,page):
        driver = webdriver.PhantomJS() #创建一个驱动
        if page==nlist[0]:
            driver.get('https://news.ctbu.edu.cn/zhxw.htm') 
        else:
            driver.get(self.url.format(page))  
        tree = etree.HTML(driver.page_source)
        li_list  = tree.xpath('/html/body/div[5]/div/div[1]/div[1]/ul/div/ul/li')
        info_list=[]
        for li in li_list :
            try:
                ##提取
                date = li.xpath('./span[@class="box_r"]/text()')
                title = li.xpath('./a[@class="c44525"]/text()')
                url = li.xpath('./a[@class="c44525"]/@href')[0]
                #获取到的信息放入字典
                item = {}
                item['date'] = date
                item['title'] = title
                item['url'] = 'https://news.ctbu.edu.cn/' + url
                info_list.append(item)
            except Exception:
                pass
        if os.path.exists(self.filename):
            #如果文件存在就追加
            ExcelUtils.write_to_excel_append(self.filename,info_list)
        else:
            #不存在就新建
            ExcelUtils.write_to_excel(self.filename,'学校新闻',info_list) 
            
        
if __name__ == '__main__':
   #基础url
    base_url = 'https://news.ctbu.edu.cn/zhxw/{}.htm'
    nlist = sorted(list(range(1,581)),reverse=True)
    #第一步:创建任务队列并初始化
    queue_page = Queue()
    for i in nlist:
        queue_page.put(i) #入队
    #创建5个线程,自定义线程名称
    name_list = ['a','b','c','d','e']
    thread_list = []
    for i in name_list:
        #创建线程
        #queue_page:将创建好的队列传进去
        #传线程名称
        t = CTBU(base_url,queue_page,i)
        t.start()
        thread_list.append(t)  
    #阻塞主线程,保证每个都执行完成之后,来测试程序的执行时间
    for t in thread_list:
        t.join()

在这里插入图片描述

将爬取的结果写入/追加到excel(将下面的代码文件同上面的代码文件放在一个文件夹中)

import xlwt
import xlrd
from xlutils.copy import copy
class ExcelUtils(object):
    #工具类的方法:不适用外部变量
    #静态方法:直接可以用类名.方法名来调用
    # @staticmethod
    #类变量:
    #实例变量

    #类方法
    @staticmethod
    def write_to_excel(filename,sheetname,word_list):
        '''
        写入excel
        :param filename: 文件名
        :param sheetname: 表单名
        :param word_list: [item,item,{}]
        :return:
        '''
        try:
            # 创建workbook
            workbook = xlwt.Workbook(encoding='utf-8')
            # 给工作表添加sheet表单
            sheet = workbook.add_sheet(sheetname)
            # 设置表头
            head = []
            for i in word_list[0].keys():
                head.append(i)
            # print(head)
            # 将表头写入excel
            for i in range(len(head)):
                sheet.write(0, i, head[i])
            # 写内容
            i = 1
            for item in word_list:
                for j in range(len(head)):
                    sheet.write(i, j, item[head[j]])
                i += 1
            # 保存
            workbook.save(filename)
            print('写入excle成功!')
        except Exception as e:
            print(e)
            print('写入失败!')
    @staticmethod
    def write_to_excel_append(filename,infos):
        '''
        追加excel的方法
        :param filename: 文件名
        :param infos: 【item,item】
        :return:
        '''
        #打开excle文件
        work_book = xlrd.open_workbook(filename)
        #获取工作表中的所有sheet表单名称
        sheets = work_book.sheet_names()
        #获取第一个表单
        work_sheet = work_book.sheet_by_name(sheets[0])
        #获取已经写入的行数
        old_rows = work_sheet.nrows
        #获取表头的所有字段
        keys = work_sheet.row_values(0)
        print('===================',keys)
        #将xlrd对象转化成xlwt,为了写入
        new_work_book = copy(work_book)
        #获取表单来添加数据
        new_sheet = new_work_book.get_sheet(0)
        i = old_rows
        for item in infos:
            for j in range(len(keys)):
                new_sheet.write(i, j, item[keys[j]])
            i += 1

        new_work_book.save(filename)
        print('追加成功!')


2.分词,制作词云

import pandas as pd
import jieba
from jieba import analyse
import wordcloud
import matplotlib.pyplot as plt
import numpy as np
import PIL
df=pd.read_excel('C://数据.xls')
title=';'.join([ str(c) for c in df['title'].tolist()])
# 载入自定义词典 
jieba.load_userdict("ctbu_name.txt")
#分词
gen=jieba.lcut(title)
data={}
#统计词频
for i in gen:
    if len(str(i))>1:
        data[i] = data.get(i,0)+1       
hlist=list(data.items())
hlist.sort(key=lambda x:x[1],reverse=True)
# print(h)
dd=pd.DataFrame(hlist)
dd=dd.iloc[:31,:] #只要前30个
dd.to_csv('C:/a.txt',encoding='utf-8',index=False,header=False,sep=':')
# for i in range(10):
#     print('{:<10}{:>5}'.format(hlist[i][0],hlist[i][1]))
mask = np.array(PIL.Image.open('C:/ctbu.bmp'))
cloud=wordcloud.WordCloud(background_color='white',mask=mask,font_path='C:/Windows/Fonts/simhei.ttf')
cloud.generate_from_frequencies(frequencies=data)
plt.figure(dpi=1200) #分辨率
plt.imshow(cloud,interpolation='bilinear')
plt.axis('off')
#保存
plt.savefig('C:/ctbu.jpg')
plt.show()

使用的自定义图片
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值