zoukankan      html  css  js  c++  java
  • scrapy爬虫框架和selenium的使用:对优惠券推荐网站数据LDA文本挖掘

    原文链接:http://tecdat.cn/?p=12203


    介绍

    每个人都喜欢省钱。我们都试图充分利用我们的资金,有时候这是最简单的事情,可以造成最大的不同。长期以来,优惠券一直被带到超市拿到折扣,但使用优惠券从未如此简单,这要归功于Groupon。

    Groupon是一个优惠券推荐服务,可以在您附近的餐馆和商店广播电子优惠券。其中一些优惠券可能非常重要,特别是在计划小组活动时,因为折扣可以高达60%。

    数据

    这些数据是从Groupon网站的纽约市区域获得的。网站的布局分为所有不同groupon的专辑搜索,然后是每个特定groupon的深度页面。网站外观如下所示:

     
     

    两个页面的布局都不是动态的,所以建立了一个自定义scrapy ,以便快速浏览所有的页面并检索要分析的信息。然而,评论,重要的信息,通过JavaScript呈现和加载 。Selenium脚本使用从scrapy获取的groupons的URL,实质上模仿了人类点击用户注释部分中的“next”按钮。

    for url in url_list.url[0:50]:
    	try:
    		driver.get(url)
    		time.sleep(2)
    		#Close Any Popup That Occurs#
    		# if(driver.switch_to_alert()):
    		try:
    			close = driver.find_element_by_xpath('//a[@id="nothx"]')
    			close.click()
    		except:
    			pass
    		time.sleep(1)
    		try:
    			link = driver.find_element_by_xpath('//div[@id="all-tips-link"]')
    			driver.execute_script("arguments[0].click();", link)
    			time.sleep(2)
    		except:
    			next
    		i = 1
    		print(url)
    		while True:
    			try:
    				time.sleep(2)
    				print("Scraping Page: " + str(i))
    				reviews = driver.find_elements_by_xpath('//div[@class="tip-item classic-tip"]')
    				next_bt = driver.find_element_by_link_text('Next')
    				for review in reviews[3:]:
    					review_dict = {}
    					content = review.find_element_by_xpath('.//div[@class="twelve columns tip-text ugc-ellipsisable-tip ellipsis"]').text
    					author = review.find_element_by_xpath('.//div[@class="user-text"]/span[@class="tips-reviewer-name"]').text
    					date = review.find_element_by_xpath('.//div[@class="user-text"]/span[@class="reviewer-reviewed-date"]').text
    					review_dict['author'] = author
    					review_dict['date'] = date
    					review_dict['content'] = content
    					review_dict['url'] = url
    
    					writer.writerow(review_dict.values())
    				i += 1 
    				next_bt.click()
    			except:
    				break
    	except:
    		next
    
    csv_file.close()
    driver.close()

    从每个组中检索的数据如下所示。

    Groupon标题 

    分类信息

    交易功能位置

    总评分数网址

    作者日期

    评论网址

    大约有89,000个用户评论。从每个评论中检索的数据如下所示。

    print(all_groupon_reviews[all_groupon_reviews.content.apply(lambda x: isinstance(x, float))])
    indx = [10096]
    all_groupon_reviews.content.iloc[indx]
                author       date content  
    10096  Patricia D. 2017-02-15     NaN   
    15846       Pat H. 2016-09-24     NaN   
    19595      Tova F. 2012-12-20     NaN   
    40328   Phyllis H. 2015-06-28     NaN   
    80140     Andre A. 2013-03-26     NaN   
    
                                                     url  year  month  day  
    10096  https://www.groupon.com/deals/statler-grill-9  2017      2   15  
    15846         https://www.groupon.com/deals/impark-3  2016      9   24  
    19595   https://www.groupon.com/deals/hair-bar-nyc-1  2012     12   20  
    40328     https://www.groupon.com/deals/kumo-sushi-1  2015      6   28  
    80140  https://www.groupon.com/deals/woodburybus-com  2013      3   26  

    探索性数据分析

    一个有趣的发现是在过去的几年里,群体的使用已经大大增加了。我们通过检查评论提供的日期来发现这一点。看下面的图像,其中x轴表示月/年和y轴,表示计数,这个结论变得明显。最后的小幅下滑是由于当时的一些小组可能是季节性的。

     

    一个有趣的发现是在过去的几年里,群体的使用已经大大增加了。我们通过检查评论提供的日期来发现这一点。看下面的图像,其中x轴表示月/年和y轴,表示计数。最后的小幅下滑是由于当时的一些小组可能是季节性的。

    pie_chart_df = Groupons.groupby('categories').agg('count')
    
    plt.rcParams['figure.figsize'] = (8,8)
    
    sizes = list(pie_chart_df.mini_info)
    labels = pie_chart_df.index
    plt.pie(sizes, shadow=True, labels = labels, autopct='%1.1f%%', startangle=140)
    # plt.legend(labels, loc="best")
    plt.axis('equal')
     

    最后,由于大部分数据是通过文本:价格(原价),导出了一个正则表达式来解析价格信息,以及它们提供的交易数量。该信息显示在以下条形图中:

    
    objects = list(offer_counts.keys())
    y = list(offer_counts.values())
    tst = np.arange(len(y))
    
    plt.bar(tst,y, align = 'center')
    plt.xticks(tst, objects)
    plt.ylabel('Total Number of Groupons')
    plt.xlabel('Different Discounts Offers')
    plt.show()
     
    
    plt.ylabel('Number of Offerings')
    plt.xticks(ind, ('Auto', 'Beauty', 'Food', 'Health', 'Home', 'Personal', 'Things'))
    plt.xlabel('Category of Groupon')
    plt.legend((p0[0], p1[0], p2[0], p3[0], p4[0], p5[0], p6[0], p7[0], p10[0]), ('0', '1', '2', '3', '4', '5', '6', '7', '10'))
     

    sns.violinplot(data = savings_dataframe)
    

    最后,利用用户评论数据生成一个文字云:

    plt.rcParams['figure.figsize'] = (20,20)
    wordcloud = WordCloud(width=4000, height=2000, max_words=150, background_color='white').generate(text)
    plt.imshow(wordcloud, interpolation='bilinear')
    plt.axis("off")

     

    主题建模

    为了进行主题建模,使用的两个最重要的软件包是gensimspacy。创建一个语料库的第一步是删除所有停用词,如“,”等。最后创造trigrams。

    选择的模型是Latent Dirichlet Allocation,因为它能够区分来自不同文档的主题,并且存在一个可以清晰有效地将结果可视化的包。由于该方法是无监督的,因此必须事先选择主题数量,在模型的25次连续迭代中最优数目为3。结果如下:

     

    上面的可视化是将主题投影到两个组件上,其中相似的主题会更接近,而不相似的主题会更远。右边的单词是组成每个主题的单词,lambda参数控制单词的排他性。0的lambda表示每个主题周围的最排斥的单词,而1的lambda表示每个主题周围的最频繁的单词。

    第一个话题代表服务的质量和接待。第二个话题有描述锻炼和身体活动的词语。最后,第三个话题有属于食品类的词语。

    结论

    主题建模是无监督学习的一种形式,这个项目的范围是简要地检查在基础词语背后发现模式的功能。虽然我们认为我们对某些产品/服务的评论是独一无二的,但是这个模型清楚地表明,实际上,某些词汇在整个人群中被使用。

  • 相关阅读:
    unity打包iOS上线归纳
    unity update优化
    3dmax 法线重置
    unity2017分离动作
    unity5 manifest
    Unity5 AssetBundle资源管理架构设计
    ue4 tags 与 cast
    3dmax tcb控制器
    ue4 创建简易动画
    即时战略游戏中实用的寻路算法都有哪些,比较如何?
  • 原文地址:https://www.cnblogs.com/tecdat/p/12737316.html
Copyright © 2011-2022 走看看