作为一个PUBG迷,刷论坛是每天必不可少的事,上面有很多技术贴和职业比赛的帖子,突发奇想,想知道论坛里谈论最多的是什么,便做了一个爬虫爬取了论坛上最新的帖子标题和部分回复,然后利用jieba与wordcloud进行分词然后做了一个词云图。

爬虫的构建与数据的爬取

首先导入制作爬虫需要的包:

from bs4 import BeautifulSoup
import requests
import pandas as pd
import chardet
import numpy as np

生成爬虫的函数:

'''
creat beautifulsoup
'''
def creat_bs(url):result = requests.get(url)e=chardet.detect(result.content)['encoding']#set the code of request object to the webpage's coderesult.encoding=ec = result.contentsoup=BeautifulSoup(c,'lxml')return soup

这里利用了chardet.detect自动检测所获取网页内容的编码并转化,防止request识别错误。

接着构建所要获取网页的集合函数:

'''
build urls group
'''
def build_urls(prefix,suffix):urls=[]for item in suffix:url=prefix+itemurls.append(url)return urls

接下来便可以开始获取论坛帖子标题与帖子链接,首先观察一下PUBG论坛首页的html代码:

可以看到我们要爬取的帖子标题所在的<b></b>标签,但是html的常识告诉我,这个标签表示加粗,从左边的网页显示也可以看出字体被加粗了。我们再往下看:

没有加粗的标题并没有<b></b>标签。看清了网页的代码,便可以开始编写爬虫了:

'''
acquire all the page titles and links and save it
'''
def find_title_link(soup):titles=[]links=[]try:contanier=soup.find('div',{'class':'container_padd'})ajaxtable=contanier.find('form',{'id':'ajaxtable'})page_list=ajaxtable.find_all('li')for page in page_list:titlelink=page.find('a',{'class':'truetit'})if titlelink.text==None:                   title=titlelink.find('b').textelse:title=titlelink.textif np.random.uniform(0,1)>0.90:link=titlelink.get('href')titles.append(title)links.append(link)except:print 'have none value'return titles,links

首先寻找未加粗标题,如果没有标题,则寻找加粗标题。另外由于帖子数量太多,便按10%的概率储存帖子地址。为了避免未搜寻到标签等异常产生,使用了try-except忽略所有异常。

接着,编写爬取回复的函数,同样,先看看网页代码构架:


可以看到,主楼是由<div></div>并且class='floor'的标签所包含,但其id='tpc',而普通回复是由同样的标签包含,但其id为回复用户的编码。由于爬取主楼出现一些奇怪的错误,最后决定就不爬取主楼只爬取回复:


'''
acquire reply in every topic of 10 page
'''
def find_reply(soup):replys=[]try:details=soup.find('div',{'class':'hp-wrap details'})form=details.find('form')floors=form.find_all('div',{'class':'floor'})for floor in floors:table=floor.find('table',{'class':'case'})if floor.id!='tpc':if table.find('p')!=None:reply=table.find('p').textelse:reply=table.find('td').textreplys.append(reply)elif floor.id=='tpc':continueexcept:return Nonereturn replys

构建完函数后,便可以开始爬取数据了,首先创建爬取页面的url集合,这次我选择了前30页贴子进行爬取:

'''
acquire information from hupu pubg bbs
'''
url='https://bbs.hupu.com/pubg'
page_suffix=['','-2','-3','-4','-5','-6','-7','-8','-9','-10','-11','-12',
'-13','-14','-15','-16','-17','-18','-19','-20','-21','-22','-23','-24',
'-25','-26','-27','-28','-29','-30']
urls=build_urls(url,page_suffix)

爬取标题与链接:

title_group=[]
link_group=[]
for url in urls:soup=creat_bs(url)titles,links=find_title_link(soup)for title in titles:title_group.append(title)for link in links:link_group.append(link)

接着爬取所选帖子的第一页回复:

reply_urls=build_urls('https://bbs.hupu.com',link_group)
reply_group=[]
for url in reply_urls:soup=creat_bs(url)    replys=find_reply(soup)if replys!=None:for reply in replys:reply_group.append(reply)

爬取完毕后,综合所有数据并保存:

'''
creat wordlist and save as txt
'''
wordlist=str()
for title in title_group:wordlist+=titlefor reply in reply_group:wordlist+=replydef savetxt(wordlist):f=open('wordlist.txt','wb')f.write(wordlist.encode('utf8'))f.close()
savetxt(wordlist)

由于使用beautifulsoup解析网页内容时会自动将数据转码成unicode形式,所以如果是中文网页在输出时要转码成utf-8,不然就是乱码了。
好了,网页爬取部分已经完成,接下来就可以开始词云图的制作了。

词云图的制作

首先我们使用第三方库jieba进行中文的分词。导入jieba包:

'''
using jieba to splice words in title group
'''
import jieba

为了使其分词更加准确,我们可以导入自己设置的分词词典,尤其是在论坛的回复中,经常会有一些别称或者俗语等,利用普通的分词规则很难准确区分,这时自制的分词词典就很有用了:

jieba.load_userdict('user_dict.txt')     

可以看看我设置的词典,由于时间关系,只是写了一些印象深刻的词:


后面的数字代表词频,虽然我也不知道具体是什么意思,就随便设置了数字。

接着进行分词:

wordlist_af_jieba=jieba.cut_for_search(wordlist)
wl_space_split=' '.join(wordlist_af_jieba)

分词完后,便可以开始制作词云图了,导入所需包:

from wordcloud import WordCloud,STOPWORDS
import matplotlib.pyplot as plt

首先设置停止词,去掉一些连词或者语气词等,这里我们可以上网下载中文常用停止词词典:

stopwords=set(STOPWORDS)
fstop=open('stopwords.txt','r')
for eachWord in fstop:stopwords.add(eachWord.decode('utf-8'))

最后,制作词云图:


wc=WordCloud(font_path=r'C:\Windows\Fonts\STHUPO.ttf', background_color='black',max_words=200,width=700,height=1000,stopwords=stopwords,max_font_size=100,random_state=30)
wc.generate(wl_space_split)
wc.to_file('hupu_pubg2.png')
plt.imshow(wc,interpolation='bilinear')
plt.axis('off')

由于是中文,我们需要使用font_path设置中文可用的字体。max_words设置显示的最大词数,max_font_size设置词最大的大小,random_state设置颜色的随机程度。

输出图像:

还不错,从图像中可以看到游戏名当之无愧成了高频词汇,还有包括4AM战队,PCPI比赛,加速器,决赛圈等热词。但是很遗憾不知道是因为中文分词的原因还是词云图制作的原因,所有和数字有关的词全都被剔除了,所以少了很多和17有关的热词。具体原因还有待挖掘。

利用python爬虫抓取虎扑PUBG论坛帖子并制作词云图相关推荐

  1. python爬虫爬取虎扑湖人论坛专区帖子数据,并存入MongoDB数据库中

    今天就带大家从头到尾一步一步带着大家爬取虎扑论坛帖子的数据,里面涉及到的一些知识,我会给出学习的连接,大家可以自行去学习查看. 前期准备 首先我们打开虎扑NBA论坛,我选择的是湖人专区(小湖迷一个). ...

  2. [python 爬虫]Python爬虫抓取虎扑论坛帖子图片

    自从可以实现抓取文字了,自然要尝试更多的类型,比如图片.我是一个有逛虎扑论坛习惯的人,经常会发现有些帖子的图片挺好看的想保存下来,但是如果人为保存的话,一个帖子至少都有二三十张,这将是一个庞大的工作量 ...

  3. 利用Python爬虫抓取小说网站全部文章

    我们先来选定爬取目标,我爬取的网站是https://www.17k.com/ ,一些大型的网站(如起点.豆瓣等)做了反爬虫的部署,这会大大增加我们抓取的难度,所以尽量还是选一些不那么热门的网站. 爬虫 ...

  4. 利用Python爬虫抓取猫眼电影排行(BeautifulSoup方式初试手,欢迎改进)

    from bs4 import BeautifulSoup import requests import json import time from requests.exceptions impor ...

  5. Python学习教程:Python爬虫抓取技术的门道

    Python学习教程:Python爬虫抓取技术的门道 web是一个开放的平台,这也奠定了web从90年代初诞生直至今日将近30年来蓬勃的发展.然而,正所谓成也萧何败也萧何,开放的特性.搜索引擎以及简单 ...

  6. Python爬虫抓取东方财富网股票数据并实现MySQL数据库存储(转)

    Python爬虫可以说是好玩又好用了.现想利用Python爬取网页股票数据保存到本地csv数据文件中,同时想把股票数据保存到MySQL数据库中.需求有了,剩下的就是实现了. 在开始之前,保证已经安装好 ...

  7. Python爬虫抓取东方财富网股票数据并实现MySQL数据库存储

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理. PS:如有需要Python学习资料的小伙伴可以加点击下方链接自行获取 python免费学习资 ...

  8. python中plguba_Python量化交易进阶讲堂-爬虫抓取东方财富网股吧帖子

    欢迎大家订阅<Python实战-构建基于股票的量化交易系统>小册子,小册子会陆续推出与小册内容相关的专栏文章,对涉及到的知识点进行更全面的扩展介绍.本篇专栏为小册子内容的加推篇!!! 前言 ...

  9. python爬虫抓取网站技巧总结

    不知道为啥要说是黑幕了??哈哈哈-..以后再理解吧 python爬虫抓取网站的一些总结技巧 学用python也有3个多月了,用得最多的还是各类爬虫脚本:写过抓代理本机验证的脚本,写过在discuz论坛 ...

最新文章

  1. 上拉电阻下拉电阻高阻态
  2. 常用的130个vim命令
  3. zookeeper3.4.6安装
  4. window server 安装与卸载
  5. 大数据时代的3V3高
  6. 关于苹果, 有多少事可以重提
  7. 使用java理解程序逻辑(16)
  8. Keras——用Keras搭建自编码神经网络(AutoEncoder)
  9. 高精度算法 万字详解(C++)
  10. [Publish AAR To Maven] 使用 Gradle 发布 AAR 到 Maven 仓库
  11. gitee错误: remote gite already exists.
  12. LM2596/LM2596S多路降压稳压DC-DC开关电源芯片详解(第二部分:电路设计)(12V转5V、12V转3.3V、任意电压转任意电压)
  13. workerman执行busy,http请求不返回导致阻塞
  14. AP 计算机 一次完美的逆袭
  15. python 期货策略_Python版商品期货跨期布林对冲策略 (教学)
  16. windows快速回到桌面快捷键
  17. Aspose.Slides for .NET V23 Crack
  18. u盘出现该项目不在计算机中怎么办,怎么解决U盘使用过程中出现的各种问题
  19. Redis基本命令大全
  20. R语言有RStan的多维验证性因子分析(CFA)

热门文章

  1. 在传统软件公司的悲惨经历
  2. seo优化之外链建设
  3. 常见的卷积神经网络模型
  4. Springboot项目开发(三)文件结构(个人理财系统)
  5. 如何加速 Web 应用程序并提高网站性能
  6. 说说瀑布流式网站里那些可人的小细节
  7. mysql add decimal类型_MySQL数据类型DECIMAL用法
  8. vc++2010微软官方下载地址
  9. 一篇杂乱无章的中职教资面试备考学习笔记(计算机应用)
  10. 深入理解Java中的不可变对象