作业要求
1.选一个自己感兴趣的主题。
2.网络上爬取相关的数据。
3.进行文本分析,生成词云。
4.对文本分析结果解释说明。
5.写一篇完整的博客,附上源代码、数据爬取及分析结果,形成一个可展示的成果。
作文网 网址:http://www.zuowen.com
作文网提供专业、原创中小学生作文,包括中考满分作文、高考满分作文、零分作文、优秀作文大全、作文素材、作文辅导、英语作文等,欢迎大家踊跃投稿。
此次试验主要是爬取历年的高考满分作文数据,并制作词云。
首先是高考满分作文第二页的截图:
高考满分作文的首页链接为:http://www.zuowen.com/gaokaozw/manfen/index.shtml不难看出只有首页是用的index.shtml,接下来的所有数据页都是用的"inde_"+"数字"的组合形式作为子页面的地址的。接下来就要看看页面的源代码了,代码示例如下:
从代码中不难发现在artbox_l下的artbox_l_t为标题同时有链接地址,而artbox_l_c则为概述,同时也有链接地址,这样就可以找出相应的文章信息了。
代码如下:
import requests from bs4 import BeautifulSoup import re import pandas from datetime import datetime import random from wordcloud import WordCloud import matplotlib.pyplot as plt url = 'http://www.zuowen.com/gaokaozw/manfen/index.shtml' list =[] #获取代理IP(获取的代理IP很多不能用,因此不适用) #def get_ip_list(url, headers): # web_data = requests.get(url, headers=headers) # soup = BeautifulSoup(web_data.text, 'lxml') # ips = soup.find_all('tr') # ip_list = [] # for i in range(1, len(ips)): # ip_info = ips[i] # tds = ip_info.find_all('td') # ip_list.append(tds[1].text + ':' + tds[2].text) # return ip_list #def get_random_ip(ip_list): # proxy_list = [] # for ip in ip_list: # proxy_list.append('http://' + ip) # proxy_ip = random.choice(proxy_list) # proxies = {'http': proxy_ip} # return proxies #if __name__ == '__main__': # url = 'http://www.xicidaili.com/nn/' # headers = { # 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36' # } # ip_list = get_ip_list(url, headers=headers) # proxies = get_random_ip(ip_list) # print(proxies) #获取高考满分作文数据 def getListFullMarksArticle(url): #使用获取的代理IP #res = requests.get(url,headers=headers,proxies=proxies) res = requests.get(url) res.encoding = 'GBK' article0 = BeautifulSoup(res.text,"html.parser") articleList = {} for article in article0.select('.artbox_l'): list.append(getAllArticle(articleList,article)) def getAllArticle(articleList,article): articleList['URL'] = article.select('.artbox_l_t')[0].select("a")[0]['href'] articleList['TITLE'] = article.select(".artbox_l_t")[0].select("a")[0].text#标题 articleList['DATE'] = article.select(".artbox_l_t")[0].select("span")[0].text#日期 articleList['DESCRIPTION'] = article.select(".artbox_l_c")[0].select("a")[0].text#描述 url= article.select('.artbox_l_t')[0].select("a")[0]['href'] title = article.select(".artbox_l_t")[0].select("a")[0].text#标题 time = article.select(".artbox_l_t")[0].select("span")[0].text#日期 Decription = article.select(".artbox_l_c")[0].select("a")[0].text#描述 print('\n\n标题',title,'\n时间',time,'\n概述',Decription) return(articleList) #循环总页数进行输出 for i in range(2,4): allUrl='http://www.zuowen.com/gaokaozw/manfen/index_{}.shtml'.format(i) getListFullMarksArticle(allUrl) #保存数据 df = pandas.DataFrame(list) df.to_excel('FullArticleList.xlsx') #制作词云 lo = open ('FullArticleList.xlsx','r',encoding='ISO-8859-1').read() #lo = open ('FullArticleList.xlsx','r','GBK').read() #lo = open ('FullArticleList.xlsx','r','GB2312').read() #lo = open ('FullArticleList.xlsx','r','ASCII').read() #lo = open ('FullArticleList.xlsx','r','ISO-8859-8').read() #lo = open ('FullArticleList.xlsx','r','ISO-8859-7').read() FullMarks = WordCloud().generate(lo) plt.imshow(FullMarks) plt.show()
正确的结果如下(在Python中打印以及输出在Excel中的正确结果):
整体的结果就是编码不正确,词云无法正确显示,还有使用代理IP的话,很多代理IP无法使用(无法连接)。