如何利用python实现用户评论挖掘并分析
1、利用函数nextpage获取所需的id
顾名思义,这是一个“翻下一页”的函数。可以通过读取url中的id进行自动翻页,利用该函数对股票代码进行获取。
以沪深股市为例,在当前页面按F12(Fn+F12),在Elements界面查看,找到下一页的id,即可通过正则表达式获得股票代码数据。
注意:使用该函数时,需要download selenium module并在环境变量中配置Chrome 驱动
url = http://quote.eastmoney.com/center/gridlist.html#hs_a_board
import re from selenium import webdriver from selenium.webdriver.support.wait import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By def nextpage(url, pages_num, rule): page = 0 codes = '' codes = [] driver = webdriver.Chrome() driver.get(url) while page < pages_num: WebDriverWait(driver, 15, 0.5).until(EC.presence_of_element_located((By.ID, "table_wrapper"))) code = re.findall(rule, driver.page_source, flags=re.S) codes = code[:] + codes driver.find_element_by_id('main-table_next').click() # selenium的find id用法,找到包含“下一页”的id去点击 page = page + 1 time.sleep(random.uniform(0.3,1)) # sleep一个随机浮点数 driver.quit() return codes
这里的input有三个变量:
url=包含id的网页;pages_num=需要翻页的数量;rule=正则表达式的规则
通畅在翻页时可利用time.sleep函数进行暂停,然后利用set函数对得到的股票代码去重,避免重复爬取。那么在实现股票代码获取的时候可以用如下代码:
# crawl the relevant pages of stocks url = 'http://quote.eastmoney.com/center/gridlist.html#us_stocks' pages_num = 277 items = nextpage(url, pages_num, '/us/(.*?).html') # 从页面中获取股票代码 items = list(set(items)) # 去重,避免重复爬取 print('There are %s items relevant to the us.' % len(items))
这样,通过nextpage和正则处理后,所有原url列表中的股票代码都获取了下来,从而可以为下一步用户评论的获取做准备。
小编准备了一份Python学习资料,给那些正在学习Python的同学,或者准备学习Python的同学,关注,转发,私信小编“01”即可免费获取!
2、通过函数crawl,实现股票评论HTML文件获取
这里要用到的module为urllib,ssl
下面的例子展示了crawl函数爬取所需的HTML。用这种方法批处理时,需要进行try/except判断,然后再把fail的url print出来,把不成功的原因找出来。
注意:访问不要过于频繁,使用sleep()适当暂停!批量获取前先单个测试,并在爬取过程中及时记录成功与否状态。
import ssl from urllib import request def crawl(url): # try: page = request.urlopen(url,context=context,timeout=5) html = page.read().decode('utf-8') return html for item in items: item_url = 'http://guba.eastmoney.com/list,us' + item + '.html' print(item_url) try: item_html = crawl(item_url) file_name = './us_pages/' + item + '.html' with open(file_name,'w',encoding='utf-8') as f: f.write(item_html) print(item, 'success') except: print(item, 'failed', item_url) continue time.sleep(random.uniform(0.3,1)) # sleep一个随机浮点数
3、利用函数cleantext得到并清洗评论
用第三个自己编写的cleantext函数进行评论文本获取和清洗,可以为下一步的分词和分析做准备。cleantext函数用的正则表达式的方法与nextpage中的方法类似,就是从HTML文件中利用正则规则提取评论文本,然后对contents进行re.sub()处理,从而实现清洗评论文本的效果:
def cleantext(html): result = '' contents = re.findall('.html" title="(.*?)">',html) for content in contents: content = re.sub('<|>', '', content, flags=re.S) result += content + ' ' return result #clean for titles of comments files = glob.glob('./us_pages/*.html') # 获取爬取的html文件,返回list all_stocks = open('all_us_stocks.txt','w', encoding='utf-8') # 将所有comments页面清洗结果存于该文件,以备后续分析 for file in files: print('process', file) with open(file,'r',encoding='utf-8') as f: content = f.read() stock = cleantext(content) all_stocks.write(stock) all_stocks.close()
以沪深股票为例,部分评论文本效果如下:
4、利用分词和关键词提取制作词云图
首先使用jieba module分词,主要函数:jieba.cut(),然后使用jieba.analyse.extract_tags()提取关键词及hidf权重,接着使用WordCloud库制作词云图,其中 generate_from_frequencies()函数可以自定义词语权重,即使用jieba计算的h-idf信息,词云图背景可自定义
import jieba.posseg as pseg import jieba.analyse as ale from wordcloud import WordCloud,ImageColorGenerator from scipy.misc import imread filename = './all_xsb_stocks.txt' font_path = './siyuan.ttf' # 指定汉字字体位置,否则中文无法显示 pic_path = './cup.jpg' # step 1. 抽取关键词 with open(filename,'r',encoding='utf-8') as f: content = f.read() keywords = ale.extract_tags(content, topK=100, withWeight=True, allowPOS=()) #keywords = ale.textrank(content, topK=100, withWeight=True) d = {} for kw in keywords: #print(kw) d[kw[0]] = kw[1] # step 2. 绘制词云 pic = imread(pic_path) #读取图片 pic_color = ImageColorGenerator(pic) wc = WordCloud(scale = 4, font_path=font_path, mask=pic, color_func=pic_color, background_color='white') wc.fit_words(d) wc.to_file('./uk_tags.png')
仍然以沪深股市为例,出图效果如下:
下面这个是港股的,可以看出基本为繁体字:
新三板,关注“科技”,“智能”,“生物”:
美股基本上就是英文的公告和评论了:
英股的评论基本上是中文,也不知道为何这么多人觉得英股“垃圾”
但是这个关键词提取方法也存在一定的缺陷,比如频率较高但是不那么重要的词往往占了前几名。