首页 > 技术文章 > python3爬虫 -----华东交大校园新闻爬取与数据分析

z-712 2019-03-30 08:58 原文

~~~~~~~~~~~~~~~~步骤~~~~~~~~~~~~~~~~~~~

~~                    ~~

1):获取新闻代码如下

 1 import requests
 2 import requests.exceptions
 3 import re
 4 import json
 5 
 6 #请求头,防止防爬虫的网页
 7 headers={
 8 "user-agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36"
 9 }
10 
11 #获取一张网页上的内容
12 def get_one_page(url):
13     try:
14         res = requests.get(url, headers=headers)
15         if res.status_code == 200:
16             return res.text
17         return None
18     except Exception:
19         return None
20 
21 #根据网页上的内容,再析取新闻标题
22 def parse_one_page(html):
23     pattern=re.compile('<td align="left".*?<a href.*?>(.*?)</a>.*?</td>',re.S)
24     items=re.findall(pattern,html)
25     return items
26     # for item in items:
27     #     yield {
28     #          "title":item.split()
29     #     }
30 
31 
32 #写入文件
33 def write_to_file(content):
34     with open('news_ecjtu.txt','a',encoding='utf-8') as f:
35         f.write(json.dumps(content,ensure_ascii=False)+'\n')
36         f.close()
37 
38 
39 def main(page):
40     if(page):
41         page+=1
42         url='http://xw.ecjtu.jx.cn/1083/list'+str(page)+'.htm'
43     else:
44         url='http://xw.ecjtu.jx.cn/1083/list.htm'
45     html=get_one_page(url)
46 
47     for item in parse_one_page(html):
48        write_to_file(item)
49 
50 
51 if __name__ == '__main__':
52     for i in range(10): #582
53         main(i)

 

2):获取结果如下

"中国铁总和江西省政府正式签署共建我校协议"
"江西省第十五届运动会我校捷报频传"
"多措并举促进毕业生更高质量更充分就业"
"【公益广告】“时代楷模”王传喜"
"我校2位学生荣获“茅以升铁道教育希望之星奖”"
"学校推进落实《大型科研设备规划》"
"校领导到基础实验与工程实践中心调研:培育工匠精神 实现智能化管理"
"青年师生学习宣传贯彻团十八大精神"
~~~~~~~~~样例~~~~~~~~~~

  

3):分析新闻关键词词频

    CountVectorizer,通过fit_transform函数将文本中的词语转换为词频矩阵

 

功能代码如下:

 1 # -*- coding :utf-8 -*-
 2 # CountVectorizer是通过fit_transform函数将文本中的词语转换为词频矩阵,
 3 # 矩阵元素weight[i][j] 表示j词在第i个文本下的词频,即各个词语出现的次数;
 4 # 通过get_feature_names()
 5 # 可看到所有文本的关键字,通过toarray()可看到词频矩阵的结果。
 6 # TfidfTransformer也有个fit_transform函数,它的作用是计算tf-idf值。
 7 
 8 
 9 import jieba
10 import jieba.posseg
11 import os
12 import sys
13 from sklearn import feature_extraction
14 from sklearn.feature_extraction.text import TfidfTransformer
15 from sklearn.feature_extraction.text import CountVectorizer
16 import sys
17 
18 
19 from numpy import *
20 
21 def read_from_file(file_name):
22     with open(file_name,'r',encoding='utf-8') as f:
23         words=f.read()
24     return words
25 
26 
27 def main(path1,name,path2):
28 
29     with open(path1+name+".txt",'r',encoding="utf-8") as f:
30         f_list=f.read()
31         dataList=f_list.split('\n')
32         data=[]
33         words=read_from_file("D:\\PyCharm_Project\\My_project\\Dictionary\\chineseStop_word")
34         for line in dataList:
35             data.append(" ".join(jieba.cut(line)))
36 
37 
38 
39     freqWord=CountVectorizer(stop_words='english') #将所得的词转换为词频矩阵
40 
41     # 第一个fit_transform是计算tf-idf,第二个fit_transform是将文本转为词频矩阵
42     tfidf=TfidfTransformer().fit_transform(freqWord.fit_transform(data))
43 
44     words=freqWord.get_feature_names() #获得词袋模型中所有的词语
45     weight=tfidf.toarray()
46     tfidfDict={}
47 
48     for i in range(len(weight)):
49         for j in range(len(words)):
50             getWord=words[j]
51             getValue=weight[i][j]
52             if getValue !=0:
53                 if getWord in tfidfDict.keys():
54                     tfidfDict[getWord]+=float(getValue)
55                 else:
56                     tfidfDict.update({getWord:getValue})
57     sortted_tfidf=sorted(tfidfDict.items(),key=lambda d:d[1],reverse=True)
58 
59     print('Start Kmeans:')
60     from sklearn.cluster import KMeans
61     clf = KMeans(n_clusters=10)
62     s = clf.fit(weight)
63     print(s)
64 
65     # 20个中心点
66     print(clf.cluster_centers_)
67 
68     # 每个样本所属的簇
69     print(clf.labels_)
70     i = 1
71     while i <= len(clf.labels_):
72         print(i, clf.labels_[i - 1])
73         i = i + 1
74 
75     # 用来评估簇的个数是否合适,距离越小说明簇分的越好,选取临界点的簇个数
76     print(clf.inertia_)
77     with open(path2+name+'result.csv',"w",encoding="utf-8") as f:
78         for i in sortted_tfidf:
79             f.write(i[0]+'\t'+str(i[1])+'\n')
80 
81 
82 if __name__ == '__main__':
83     # names={'story','story2'}
84     # for name in names:
85     #     main(name)
86     path1="D:\\PyCharm_Project\\My_project\\news\\"
87     name="news_ecjtu"
88     path2="D:\\PyCharm_Project\\My_project\\parseResult\\"
89     main(path1,name,path2)

 

效果如下:    

我校	7.0208354759542715
学院	3.8223325570171203
2018	3.815764749721242
教育	3.399237761450319
调研	3.2971327488479263
工作	3.1346706185473137
合作	2.9082744591115333
毕业生	2.6176374142071013
公益广告	2.4443878020399605
时代	2.4443878020399605
楷模	2.4443878020399605
来校	2.3190139465687243
校领导	2.1889679172246517
作风	2.1637628125695234
江西省	2.16162847305444
高校	2.128702943062588
建设	2.0958223398319404
张黎明	2.0646025671476895
校友	1.9667841510938553
推进	1.9569110239878906
学校	1.7725392141069154
提升	1.732203497544248
学生	1.6831009269305646
评估	1.6419528753463422
创业	1.6353791486937332
落实	1.6293337473008869
特色	1.6019056409789132
大学生	1.581282636609164
交通	1.5618754858859953
全省	1.5235338340894855
万明	1.4743835231840472
花椒	1.451354632105049
师生	1.4082883987540953
招生	1.3684278178093492
发展	1.3471490121262661
作品展	1.3273917270546678
做好	1.31886337322391
工程	1.310089644126616
宣传	1.3097551321730325
毕业	1.2968027899458847
创新	1.291911022554044
走访	1.287239425873281
参加	1.2846089388204354
全国	1.2521245761589734
带队	1.2409721952698711
服务	1.2248869078147047
大学	1.2216528368982398
人工智能	1.1866932552420832
强化	1.143664790062435
管理	1.132810412234202
研究生	1.1220288442489132
举行	1.1002480430262072
成立	1.0979689466014984
办学	1.0631396741720918
人才	1.0413024537617568
青年	1.039299679715829
建筑学	1.0390330826994207
检查	1.0341832074088995
中心	1.0280680758280576
现场	1.010890033456509
专家	1.0100044382096787
孔目	0.9947013515882996
改革	0.9941181774133574
协议	0.9894497085333555
签署	0.9894497085333555
经管	0.9862496233342563
开展	0.9707440311967135
~~~~~~~~~~~样例~~~~~~~~~~~

 

4):可视化学校间联系

  注意pyecharts的坑!,,地图显示一半什么的,

  1 from sklearn.feature_extraction.text import TfidfVectorizer
  2 import jieba
  3 
  4 with open("news_ecjtu.txt", 'r', encoding="utf-8") as f:
  5     f_list = f.read()
  6     dataList = f_list.split('\n')
  7     data = []
  8     for line in dataList:
  9         data.append(" ".join(jieba.cut(line)))
 10 
 11 
 12 tfidf=TfidfVectorizer(token_pattern=r"(?u)\b\w\w+\b")
 13 weight=tfidf.fit_transform(data).toarray()
 14 word=tfidf.get_feature_names()
 15 
 16 dict1 = {}
 17 f = open('D:\\PyCharm_Project\\My_project\\Dictionary\\provinces.txt', 'r', encoding="utf-8")
 18 i = 0
 19 for line in f.readlines():
 20     tmp = line.strip()
 21     dict1[tmp] = i
 22 
 23 dict2 = {}
 24 f = open('D:\\PyCharm_Project\\My_project\\Dictionary\\Universities.txt', 'r', encoding="utf-8")
 25 i=0
 26 for line in f.readlines():
 27     tmp = line.strip()
 28     dict2[tmp] = i
 29 
 30 
 31 for key,value in tfidf.vocabulary_.items():
 32     if key in dict1.keys():
 33         dict1[key] = value
 34     if key in dict2.keys():
 35         dict2[key]=value
 36 
 37 print(dict1)
 38 print(dict2)
 39 
 40 
 41 
 42 from pyecharts import GeoLines, Style
 43 import  echarts_china_cities_pypkg
 44 import echarts_china_counties_pypkg
 45 import echarts_china_provinces_pypkg
 46 
 47 style = Style(
 48     title_top="#fff",
 49     title_pos = "center",
 50     width=1200,
 51     height=600,
 52     background_color="#404a59"
 53 )
 54 
 55 style_geo = style.add(
 56     is_label_show=True,
 57     line_curve=0.2,
 58     line_opacity=0.6,
 59     legend_text_color="#eee",
 60     legend_pos="right",
 61     geo_effect_symbol="plane",
 62     geo_effect_symbolsize=15,
 63     label_color=['#a6c84c', '#ffa022', '#46bee9'],
 64     label_pos="right",
 65     label_formatter="{b}",
 66     label_text_color="#eee",
 67 )
 68 
 69 data_ganzhou = [
 70     ['赣州', '上海'],
 71     ['赣州', '北京'],
 72 ]
 73 
 74 
 75 
 76 
 77 data_nanchang = [
 78     ['南昌','赣州'],
 79     ['南昌','北京'],
 80     ['南昌','深圳'],
 81     ['南昌','广州'],
 82 ]
 83 
 84 
 85 
 86 for key,value in dict1.items():
 87     if key=="南昌":
 88         continue
 89     else:
 90         if value !=0:
 91             tmp = ['南昌']
 92             tmp.append(key)
 93             data_nanchang.append(tmp)
 94 
 95 print(data_nanchang)
 96 
 97 geolines = GeoLines("各省份联系图 ", **style.init_style)
 98 geolines.add("赣州", data_ganzhou,**style_geo)
 99 geolines.add("南昌", data_nanchang,**style_geo)
100 
101 geolines.render()

 

输出结果部分如下:

{'北京市': 11, '天津市': 26, '上海市': 1, '重庆市': 53, '河北省': 0, '山西省': 0, '辽宁省': 0, '吉林省': 0, '黑龙江省': 0, '江苏省': 0, '浙江省': 0, '安徽省': 0, '福建省': 0, '': 0, '山东省': 0, '河南省': 0, '湖北省': 0}
{'北京大学': 0, '清华大学': 42, '浙江大学': 40, '复旦大学': 22, '中国人民大学': 4, '上海交通大学': 0, '武汉大学': 36, '南京大学': 15, '中山大学': 5, '吉林大学': 18, '华中科技大学': 13, '四川大学': 20, '天津大学': 25, '南开大学': 16, '西安交通大学': 49, '中国科学技术大学': 0, '中南大学': 2, '哈尔滨工业大学': 19, '北京师范大学': 12, '山东大学': 27, '厦门大学': 17, '东南大学': 0, '同济大学': 0, '北京航空航天大学': 0, '大连理工大学': 0, '东北大学': 0, '华南理工大学': 0, '华东师范大学': 0, '北京理工大学': 0, '西北工业大学': 0, '重庆大学': 0, '兰州大学': 0, '中国农业大学': 0, '电子科技大学': 0, '湖南大学': 0, '东北师范大学': 0, '西南大学': 0, '武汉理工大学': 0, '西南交通大学': 0, '北京交通大学': 0, '华中师范大学': 0, '河海大学': 0, '南京农业大学': 0, '南京理工大学': 0, '南京师范大学': 0, '西安电子科技大学': 0, '北京科技大学': 0, '华中农业大学': 0, '郑州大学': 0, '中国海洋大学': 0, '西北大学': 0, '华东理工大学': 0, '中国矿业大学': 0, '南京航空航天大学': 0, '上海大学': 0, '北京协和医学院': 0, '西北农林科技大学': 0, '苏州大学': 0, '北京邮电大学': 0, '中国地质大学(武汉)': 0, '北京化工大学': 0, '上海财经大学': 0, '长安大学': 0, '云南大学': 0, '哈尔滨工程大学': 0, '合肥工业大学': 0, '中国政法大学': 0, '湖南师范大学': 0, '东华大学': 0, '南昌大学': 0, '中南财经政法大学': 0, '昆明理工大学': 0, '深圳大学': 0, '暨南大学': 0, '华南师范大学': 0, '陕西师范大学': 0, '首都师范大学': 0, '江南大学': 0, '福建师范大学': 0, '中央民族大学': 0, '福州大学': 0, '北京工业大学': 0, '广西大学': 0, '燕山大学': 0, '河南大学': 0, '中国石油大学(华东)': 0, '宁波大学': 0, '华南农业大学': 0, '浙江工业大学': 0, '山西大学': 0, '对外经济贸易大学': 0, '浙江师范大学': 0, '北京林业大学': 0, '西南财经大学': 0, '杭州电子科技大学': 0, '上海理工大学': 0, '扬州大学': 0, '天津师范大学': 0, '中央财经大学': 0, '首都医科大学': 0, '东北林业大学': 0, '河北大学': 0, '安徽大学': 0, '辽宁大学': 0, '太原理工大学': 0, '南京工业大学': 0, '新疆大学': 0, '华北电力大学': 0, '湘潭大学': 0, '东北财经大学': 
[['南昌', '赣州'], ['南昌', '北京'], ['南昌', '深圳'], ['南昌', '广州'], ['南昌', '北京市'], ['南昌', '天津市'], ['南昌', '上海市'], ['南昌', '重庆市']]

 

效果图如下:

 

 

 

推荐阅读