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()
使用的自定义图片