唐伯虎 发表于 2021-6-24 10:00:23

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:
try:

      driver.get(url)
      time.sleep(2)
      #关闭出现的任何弹出窗口#
      # 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.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:
                  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)
indx = 
all_groupon_reviews.content.iloc
            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, p1, p2, p3, p4, p5, p6, p7, p10), ('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")
 主题建模为了进行主题建模,使用的两个最重要的软件包是gensim和spacy。创建一个语料库的第一步是删除所有停用词,如“,”等。最后创造trigrams。选择的模型是Latent Dirichlet Allocation,因为它能够区分来自不同文档的主题,并且存在一个可以清晰有效地将结果可视化的包。由于该方法是无监督的,因此必须事先选择主题数量,在模型的25次连续迭代中最优数目为3。结果如下: 上面的可视化是将主题投影到两个组件上,其中相似的主题会更接近,而不相似的主题会更远。右边的单词是组成每个主题的单词,lambda参数控制单词的排他性。0的lambda表示每个主题周围的最排斥的单词,而1的lambda表示每个主题周围的最频繁的单词。第一个话题代表服务的质量和接待。第二个话题有描述锻炼和身体活动的词语。最后,第三个话题有属于食品类的词语。结论主题建模是无监督学习的一种形式,这个项目的范围是简要地检查在基础词语背后发现模式的功能。虽然我们认为我们对某些产品/服务的评论是独一无二的,但是这个模型清楚地表明,实际上,某些词汇在整个人群中被使用。 
页: [1]
查看完整版本: scrapy爬虫框架和selenium的使用:对优惠券推荐网站数据LDA文本挖掘