scrapy爬蟲(chóng)框架和selenium的使用:對(duì)優(yōu)惠券推薦網(wǎng)站數(shù)據(jù)LDA文本挖掘
原文鏈接:http://tecdat.cn/?p=12203
介紹
每個(gè)人都喜歡省錢(qián)。我們都試圖充分利用我們的資金,有時(shí)候這是最簡(jiǎn)單的事情,可以造成最大的不同。長(zhǎng)期以來(lái),優(yōu)惠券一直被帶到超市拿到折扣,但使用優(yōu)惠券從未如此簡(jiǎn)單,這要?dú)w功于Groupon。
Groupon是一個(gè)優(yōu)惠券推薦服務(wù),可以在您附近的餐館和商店廣播電子優(yōu)惠券。其中一些優(yōu)惠券可能非常重要,特別是在計(jì)劃小組活動(dòng)時(shí),因?yàn)檎劭劭梢愿哌_(dá)60%。
?
數(shù)據(jù)
這些數(shù)據(jù)是從Groupon網(wǎng)站的紐約市區(qū)域獲得的。網(wǎng)站的布局分為所有不同groupon的專輯搜索,然后是每個(gè)特定groupon的深度頁(yè)面。網(wǎng)站外觀如下所示:

兩個(gè)頁(yè)面的布局都不是動(dòng)態(tài)的,所以建立了一個(gè)自定義scrapy ,以便快速瀏覽所有的頁(yè)面并檢索要分析的信息。然而,評(píng)論,重要的信息,通過(guò)JavaScript呈現(xiàn)和加載 。Selenium腳本使用從scrapy獲取的groupons的URL,實(shí)質(zhì)上模仿了人類點(diǎn)擊用戶注釋部分中的“next”按鈕。
for url in url_list.url[0:50]:
try:
driver.get(url)
time.sleep(2)
#關(guān)閉出現(xiàn)的任何彈出窗口#
# 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()
從每個(gè)組中檢索的數(shù)據(jù)如下所示。
Groupon標(biāo)題?
分類信息
交易功能位置
總評(píng)分?jǐn)?shù)網(wǎng)址
作者日期
評(píng)論網(wǎng)址
大約有89,000個(gè)用戶評(píng)論。從每個(gè)評(píng)論中檢索的數(shù)據(jù)如下所示。
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
探索性數(shù)據(jù)分析
一個(gè)有趣的發(fā)現(xiàn)是在過(guò)去的幾年里,群體的使用已經(jīng)大大增加了。我們通過(guò)檢查評(píng)論提供的日期來(lái)發(fā)現(xiàn)這一點(diǎn)。看下面的圖像,其中x軸表示月/年和y軸,表示計(jì)數(shù),這個(gè)結(jié)論變得明顯。最后的小幅下滑是由于當(dāng)時(shí)的一些小組可能是季節(jié)性的。
?

一個(gè)有趣的發(fā)現(xiàn)是在過(guò)去的幾年里,群體的使用已經(jīng)大大增加了。我們通過(guò)檢查評(píng)論提供的日期來(lái)發(fā)現(xiàn)這一點(diǎn)??聪旅娴膱D像,其中x軸表示月/年和y軸,表示計(jì)數(shù)。最后的小幅下滑是由于當(dāng)時(shí)的一些小組可能是季節(jié)性的。
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')

最后,由于大部分?jǐn)?shù)據(jù)是通過(guò)文本:價(jià)格(原價(jià)),導(dǎo)出了一個(gè)正則表達(dá)式來(lái)解析價(jià)格信息,以及它們提供的交易數(shù)量。該信息顯示在以下條形圖中:
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)
?

最后,利用用戶評(píng)論數(shù)據(jù)生成一個(gè)文字云:
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")

主題建模
為了進(jìn)行主題建模,使用的兩個(gè)最重要的軟件包是gensim和spacy。創(chuàng)建一個(gè)語(yǔ)料庫(kù)的第一步是刪除所有停用詞,如“,”等。最后創(chuàng)造trigrams。
選擇的模型是Latent Dirichlet Allocation,因?yàn)樗軌騾^(qū)分來(lái)自不同文檔的主題,并且存在一個(gè)可以清晰有效地將結(jié)果可視化的包。由于該方法是無(wú)監(jiān)督的,因此必須事先選擇主題數(shù)量,在模型的25次連續(xù)迭代中最優(yōu)數(shù)目為3。結(jié)果如下:



上面的可視化是將主題投影到兩個(gè)組件上,其中相似的主題會(huì)更接近,而不相似的主題會(huì)更遠(yuǎn)。右邊的單詞是組成每個(gè)主題的單詞,lambda參數(shù)控制單詞的排他性。0的lambda表示每個(gè)主題周?chē)淖钆懦獾膯卧~,而1的lambda表示每個(gè)主題周?chē)淖铑l繁的單詞。
第一個(gè)話題代表服務(wù)的質(zhì)量和接待。第二個(gè)話題有描述鍛煉和身體活動(dòng)的詞語(yǔ)。最后,第三個(gè)話題有屬于食品類的詞語(yǔ)。
結(jié)論
主題建模是無(wú)監(jiān)督學(xué)習(xí)的一種形式,這個(gè)項(xiàng)目的范圍是簡(jiǎn)要地檢查在基礎(chǔ)詞語(yǔ)背后發(fā)現(xiàn)模式的功能。雖然我們認(rèn)為我們對(duì)某些產(chǎn)品/服務(wù)的評(píng)論是獨(dú)一無(wú)二的,但是這個(gè)模型清楚地表明,實(shí)際上,某些詞匯在整個(gè)人群中被使用。

?