python爬虫,,一、主题本次只是简单


一、主题

本次只是简单的爬取广东轻工职业技术学院的校园新闻并将爬取信息生成词云进行分析

二、实现过程

1.在广东轻工职业技术学院官网中进入校园新闻模块,首先点击其中一条新闻,通过开发者工具(F12)分析获取新闻的标题,发布时间以及链接以字典news{}存放起来,并将新闻内容写到content.txt中

技术分享图片

# 获取一条新闻的信息def getNewDetails(newsUrl):    resd = requests.get(newsUrl)    resd.encoding = ‘utf-8‘    soup = BeautifulSoup(resd.text, ‘html.parser‘)    news = {}    news[‘标题‘] = soup.select(‘div > h3‘)[0].text    a = news[‘标题‘]    news[‘发布时间‘] = (soup.select(‘.title‘)[0].text).lstrip( ‘{}发布时间   ‘.format(a))    news[‘链接‘] = newsUrl    content = soup.find_all(‘div‘,class_=‘content‘)[0].text    writeNewsDetail(content)    return news

# 将获取到的新闻内容写到content.txt中def writeNewsDetail(content):    f = open(‘content.txt‘,‘a‘,encoding=‘utf-8‘)    f.write(content)    f.close()

 技术分享图片

 

2.既然能将一条新闻的信息获取到了,就可以将一个新闻页面的所有新闻也获取到。如何获取到页面中所有新闻的网址呢?老办法,摁F12打开开发者工具,找到新闻网址所在标签就行啦

技术分享图片

# 获取一个新闻页面的所有新闻的网址def getListPage(newsurl):    res = requests.get(newsurl)    res.encoding = ‘utf-8‘    soup = BeautifulSoup(res.text, ‘html.parser‘)    soup = soup.find(‘div‘, class_=‘mainl‘)    newslist = []    for new in soup.select(‘ul > li > a‘):        newsUrl = new.attrs[‘href‘]        newslist.append(getNewDetails(newsUrl))    return newslist

 

3.搞定一个页面也就可以把其他页面也解决了,由于广轻工的校园新闻只有54页,所以我就都爬下来了

# 由于第一个新闻页面的网址跟其他新闻页面不同# 所以先将第一个页面的所有新闻的信息写入到newsTotal里面newsurl = ‘http://www.gdqy.edu.cn/viscms/xiaoyuanxinwen2538/index.html‘newsTotal = []newsTotal.extend(getListPage(newsurl))# 再将剩下的页面的新闻信息以循环写入for i in range(2,55):    listPageUrl = ‘http://www.gdqy.edu.cn/viscms/xiaoyuanxinwen2538/index_{}.html‘.format(i)    newsTotal.extend(getListPage(listPageUrl))

  

4.将之前获取到的新闻信息(标题,发布时间以及链接)存放到Excel表里面

# 将获取到新闻信息存放到Excel表news.xlsx里面df = pandas.DataFrame(newsTotal)df.to_excel(‘news.xlsx‘,encoding=‘utf-8‘)

技术分享图片

技术分享图片

5.到了这里就已经将所有信息爬取完了,接下来就可以对信息进行结巴分词并生成词云了

file = codecs.open(‘content.txt‘, ‘r‘,‘utf-8‘)# 以所给图片为背景生成词云图片image=np.array(Image.open(‘tree.jpg‘))# 词云字体设置font=r‘C:\Windows\Fonts\simhei.ttf‘word=file.read()#去掉英文,保留中文resultword=re.sub("[A-Za-z0-9\[\`\~\!\@\#\$\^\&\*\(\)\=\|\{\}\‘\:\;\‘\,\[\]\.\<\>\/\?\~\!\@\#\\\&\*\%]", "",word)wordlist_after_jieba = jieba.cut(resultword, cut_all = True)wl_space_split = " ".join(wordlist_after_jieba)print(wl_space_split)my_wordcloud = WordCloud(font_path=font,mask=image,background_color=‘white‘,max_words = 100,max_font_size = 100,random_state=50).generate(wl_space_split)#根据图片生成词云iamge_colors = ImageColorGenerator(image)#my_wordcloud.recolor(color_func = iamge_colors)#显示生成的词云plt.imshow(my_wordcloud)plt.axis("off")plt.show()#保存生成的图片,当关闭图片时才会生效,中断程序不会保存my_wordcloud.to_file(‘result.jpg‘)

 生成词云的图片(大家可根据自己喜欢的图片进行词云形状的生成)

技术分享图片

技术分享图片

三、遇到的问题及解决办法

问题:安装词云的时候出错(当时出错的时候没有截图)

解决方法:通过上网了解,发现是由于本人电脑的Python版本是32位的,而之前安装的词云是64位的,所以出现了错误,在网上重新下载并安装了32位的词云之后就解决了

步骤:1.选择wordcloud-1.4.1-cp36-cp36m-win32.whl进行下载

技术分享图片

2.打开命令行输入 pip installwordcloud-1.4.1-cp36-cp36m-win32.whl以及 pip install wordcloud 进行安装

3.安装成功后到pycharm添加依赖就行了

四、数据分析及结论

通过数据我们看到校园新闻主要是对校园各院的情况(其中设计学院为甚)、党委工作以及职业技术等信息的报道

五、完整代码

import requestsfrom bs4 import BeautifulSoupimport pandasimport jiebaimport matplotlib.pyplot as pltfrom wordcloud import WordCloud, ImageColorGeneratorimport codecsimport numpy as npfrom PIL import Imageimport re# 将获取到的新闻内容写到content.txt中def writeNewsDetail(content):    f = open(‘content.txt‘,‘a‘,encoding=‘utf-8‘)    f.write(content)    f.close()# 获取一条新闻的信息def getNewDetails(newsUrl):    resd = requests.get(newsUrl)    resd.encoding = ‘utf-8‘    soup = BeautifulSoup(resd.text, ‘html.parser‘)    news = {}    news[‘标题‘] = soup.select(‘div > h3‘)[0].text    a = news[‘标题‘]    news[‘发布时间‘] = (soup.select(‘.title‘)[0].text).lstrip( ‘{}发布时间   ‘.format(a))    news[‘链接‘] = newsUrl    content = soup.find_all(‘div‘,class_=‘content‘)[0].text    writeNewsDetail(content)    return news# 获取一个新闻页面的所有新闻的网址def getListPage(newsurl):    res = requests.get(newsurl)    res.encoding = ‘utf-8‘    soup = BeautifulSoup(res.text, ‘html.parser‘)    soup = soup.find(‘div‘, class_=‘mainl‘)    newslist = []    for new in soup.select(‘ul > li > a‘):        newsUrl = new.attrs[‘href‘]        newslist.append(getNewDetails(newsUrl))    return newslist# 由于第一个新闻页面的网址跟其他新闻页面不同# 所以先将第一个页面的所有新闻的信息写入到newsTotal里面newsurl = ‘http://www.gdqy.edu.cn/viscms/xiaoyuanxinwen2538/index.html‘newsTotal = []newsTotal.extend(getListPage(newsurl))# 再将剩下的页面的新闻信息以循环写入for i in range(2,55):    listPageUrl = ‘http://www.gdqy.edu.cn/viscms/xiaoyuanxinwen2538/index_{}.html‘.format(i)    newsTotal.extend(getListPage(listPageUrl))for news in newsTotal:    print(news)# 将获取到新闻信息存放到Excel表news.xlsx里面df = pandas.DataFrame(newsTotal)df.to_excel(‘news.xlsx‘,encoding=‘utf-8‘)file = codecs.open(‘content.txt‘, ‘r‘,‘utf-8‘)# 以所给图片为背景生成词云图片image=np.array(Image.open(‘tree.jpg‘))# 词云字体设置font=r‘C:\Windows\Fonts\simhei.ttf‘word=file.read()#去掉英文,保留中文resultword=re.sub("[A-Za-z0-9\[\`\~\!\@\#\$\^\&\*\(\)\=\|\{\}\‘\:\;\‘\,\[\]\.\<\>\/\?\~\!\@\#\\\&\*\%]", "",word)wordlist_after_jieba = jieba.cut(resultword, cut_all = True)wl_space_split = " ".join(wordlist_after_jieba)print(wl_space_split)my_wordcloud = WordCloud(font_path=font,mask=image,background_color=‘white‘,max_words = 100,max_font_size = 100,random_state=50).generate(wl_space_split)#根据图片生成词云iamge_colors = ImageColorGenerator(image)#my_wordcloud.recolor(color_func = iamge_colors)#显示生成的词云plt.imshow(my_wordcloud)plt.axis("off")plt.show()#保存生成的图片,当关闭图片时才会生效,中断程序不会保存my_wordcloud.to_file(‘result.jpg‘)

  

六、个人感受与体会

其实本来我是想爬英雄联盟官网的的赛事新闻模块的,可是在爬的过程遇到很多,比如某条新闻的网址跟新闻页标签的网址是不一样的,而且就算网址解决了,在获取新闻信息的时候,明明标签等打对了,获取到的信息根本不是目标信息或者根本找不到,最后不得不放弃选择广轻工的新闻模块进行爬取。虽然两次爬虫经历遇到的问题很多,但看到爬取的信息一条条显示出来的时候心里还是有点成就感的,在过程中也学到了不少新知识,比如词云的生成。总得来说,有尝试就有收获,还需多练习努力。

 

python爬虫

评论关闭