濟(jì)南哪家公司做網(wǎng)站微信指數(shù)是搜索量嗎
文章目錄
- 基于Python旅游數(shù)據(jù)采集可視化分析推薦系統(tǒng)
- 一、項(xiàng)目概述
- 二、項(xiàng)目說(shuō)明
- 三、開(kāi)發(fā)環(huán)境
- 四、功能實(shí)現(xiàn)
- 五、系統(tǒng)頁(yè)面實(shí)現(xiàn)
- 用戶登錄注冊(cè)
- 系統(tǒng)首頁(yè)
- 數(shù)據(jù)操作管理
- 價(jià)格與銷量分析
- 旅游城市和景點(diǎn)等級(jí)分析
- 旅游數(shù)據(jù)評(píng)分情況分析
- 旅游數(shù)據(jù)評(píng)論情況分析
- 旅游景點(diǎn)推薦
- Django系統(tǒng)后臺(tái)管理
- 六、結(jié)語(yǔ)
基于Python旅游數(shù)據(jù)采集可視化分析推薦系統(tǒng)
一、項(xiàng)目概述
在互聯(lián)網(wǎng)時(shí)代,各行各業(yè)的人們都在尋求增長(zhǎng)點(diǎn),人們的日常生活越來(lái)越離不開(kāi)互聯(lián)網(wǎng)。以旅游信息為例,線下大量的各種旅游信息基本只會(huì)出現(xiàn)在旅游會(huì)上,但是現(xiàn)如今,人們?cè)絹?lái)越重視時(shí)間成本,所以越來(lái)越多的年輕人在網(wǎng)上查找自己想要查找的旅游就業(yè)信息。然而,在互聯(lián)網(wǎng)信息和海量數(shù)據(jù)源混合的情況下,如何快速精確的找到自己想要的數(shù)據(jù)是一個(gè)值得探討的問(wèn)題。
本系統(tǒng)主要針對(duì)解決獲取旅游信息滯后、參加線下旅行社和人工檢索時(shí)間成本高等問(wèn)題,運(yùn)用網(wǎng)絡(luò)爬蟲(chóng)信息技術(shù)設(shè)計(jì)思想,實(shí)現(xiàn)了一個(gè)基于Python的旅游信息推薦系統(tǒng)。本系統(tǒng)以Python語(yǔ)言為基礎(chǔ),使用 requests爬蟲(chóng)對(duì)去哪兒旅游信息源進(jìn)行抓取,針對(duì)網(wǎng)頁(yè)信息編寫(xiě)抽取規(guī)則,對(duì)旅游信息進(jìn)行必要的過(guò)濾和提取,使用MySql對(duì)旅游信息進(jìn)行數(shù)據(jù)存儲(chǔ)。然后使用 Python 開(kāi)源web框架 Django進(jìn)行系統(tǒng)搭建,基于旅游信息采用機(jī)器學(xué)習(xí)協(xié)同過(guò)濾推薦算法完成對(duì)用戶的旅游信息推薦,完成整個(gè)爬取以及數(shù)據(jù)檢索到成功進(jìn)行旅游推薦的網(wǎng)頁(yè)端操作展示。
二、項(xiàng)目說(shuō)明
基于python旅游采集數(shù)據(jù)分析可視化推薦系統(tǒng)是基于Django框架開(kāi)發(fā)的一個(gè)旅游信息采集和推薦的應(yīng)用。該系統(tǒng)通過(guò)爬蟲(chóng)技術(shù)從各個(gè)旅游網(wǎng)站抓取旅游信息,并利用推薦算法對(duì)用戶進(jìn)行個(gè)性化推薦,同時(shí)提供可視化展示界面。
以下是該系統(tǒng)的主要功能和組成部分的介紹:
旅游信息采集:系統(tǒng)通過(guò)編寫(xiě)爬蟲(chóng)程序,定期從各大旅游網(wǎng)站抓取旅游景點(diǎn)、酒店、機(jī)票等相關(guān)信息,包括價(jià)格、評(píng)價(jià)、位置等。這些采集到的數(shù)據(jù)會(huì)被保存到數(shù)據(jù)庫(kù)中供后續(xù)使用。
用戶注冊(cè)與登錄:用戶可以注冊(cè)自己的賬號(hào),并通過(guò)登錄來(lái)獲取個(gè)性化推薦和享受更多功能。
個(gè)性化推薦:系統(tǒng)會(huì)根據(jù)用戶的歷史瀏覽記錄、收藏記錄以及其他行為數(shù)據(jù),利用推薦算法生成個(gè)性化推薦結(jié)果。推薦算法使用協(xié)同過(guò)濾、內(nèi)容過(guò)濾方法,根據(jù)用戶的興趣和偏好為其推薦最相關(guān)的旅游信息。
可視化展示界面:系統(tǒng)會(huì)將采集的旅游信息以可視化方式展示給用戶,包括地圖標(biāo)記、圖片展示、價(jià)格對(duì)比等功能。用戶可以通過(guò)地圖選擇感興趣的地區(qū),查看該地區(qū)的旅游景點(diǎn)、酒店等信息。
用戶交互和反饋:系統(tǒng)提供用戶評(píng)價(jià)、評(píng)論和收藏等功能,用戶可以對(duì)自己的旅游經(jīng)歷進(jìn)行評(píng)價(jià),同時(shí)也可以保存自己喜歡的旅游信息以便日后查看。
后臺(tái)管理:系統(tǒng)提供一個(gè)后臺(tái)管理界面,管理員可以對(duì)用戶信息、采集的數(shù)據(jù)、推薦算法參數(shù)等進(jìn)行管理和配置。
三、開(kāi)發(fā)環(huán)境
開(kāi)發(fā)環(huán)境 | 版本/工具 |
---|---|
PYTHON | 3.9.0 |
開(kāi)發(fā)工具 | PyCharm2021.2.1 |
操作系統(tǒng) | Windows 10 |
內(nèi)存要求 | 16GB |
瀏覽器 | Firefox |
數(shù)據(jù)庫(kù) | MySQL 8.0.26 |
數(shù)據(jù)庫(kù)工具 | Navicat 15 for MySQL |
項(xiàng)目技術(shù)棧 | Python語(yǔ)言、Django框架、MySQL數(shù)據(jù)庫(kù)、requests網(wǎng)絡(luò)爬蟲(chóng)技術(shù)、機(jī)器學(xué)習(xí)算法、BootStrap、數(shù)據(jù)可視化 |
四、功能實(shí)現(xiàn)
系統(tǒng)爬蟲(chóng)部分核心代碼
def spiderMain(self,resp,province):respJSON = resp.json()['data']['sightList']for index,travel in enumerate(respJSON):print('正在爬取該頁(yè)第%s數(shù)據(jù)' % str(index + 1))time.sleep(2)detailAddress = travel['address']discount = travel['discount']shortIntro = travel['intro']price = travel['qunarPrice']saleCount = travel['saleCount']try:level = travel['star'] + '景區(qū)'except:level = '未評(píng)價(jià)'title = travel['sightName']cover = travel['sightImgURL']sightId = travel['sightId']# ================================= 詳情爬取detailUrl = self.detailUrl % sightIdrespDetailXpath = etree.HTML(self.send_request(detailUrl).text)score = respDetailXpath.xpath('//span[@id="mp-description-commentscore"]/span/text()')if not score:score = 0star = 0else:score = score[0]star = int(float(score)*10)commentsTotal = respDetailXpath.xpath('//span[@class="mp-description-commentCount"]/a/text()')[0].replace('條評(píng)論','')detailIntro = respDetailXpath.xpath('//div[@class="mp-charact-intro"]//p/text()')[0]img_list = respDetailXpath.xpath('//div[@class="mp-description-image"]/img/@src')[:6]# ================================= 評(píng)論爬取commentSightId = respDetailXpath.xpath('//div[@class="mp-tickets-new"]/@data-sightid')[0]commentsUrl = self.commentUrl % commentSightIdcomments = []try:commentsList = self.send_request(commentsUrl).json()['data']['commentList']for c in commentsList:if c['content'] != '用戶未點(diǎn)評(píng),系統(tǒng)默認(rèn)好評(píng)。':author = c['author']content = c['content']date = c['date']score = c['score']comments.append({'author': author,'content': content,'date': date,'score': score})except:comments = []resultData = []
基于用戶的協(xié)同過(guò)濾推薦算法,用于根據(jù)用戶的評(píng)分?jǐn)?shù)據(jù)推薦其可能喜歡的其他景點(diǎn)。
基于用戶的協(xié)同過(guò)濾算法部分核心代碼:
def user_bases_collaborative_filtering(user_id,user_ratings,top_n=20):
# def user_bases_collaborative_filtering(user_id, user_ratings, top_n=3):# 獲取目標(biāo)用戶的評(píng)分?jǐn)?shù)據(jù)target_user_ratings = user_ratings[user_id]# 初始化一個(gè)字段,用于保存其他用戶與目標(biāo)用戶的相似度得分user_similarity_scores = {}# 將目標(biāo)用戶的評(píng)分轉(zhuǎn)化為numpy數(shù)組target_user_ratings_list = np.array([rating for _ , rating in target_user_ratings.items()])# 計(jì)算目標(biāo)用戶與其他用戶之間的相似度得分for user,ratings in user_ratings.items():if user == user_id:continue# 將其他用戶的評(píng)分轉(zhuǎn)化為numpy數(shù)組user_ratings_list = np.array([ratings.get(item,0) for item in target_user_ratings])# 計(jì)算余弦相似度similarity_score = cosine_similarity([user_ratings_list],[target_user_ratings_list])[0][0]user_similarity_scores[user] = similarity_score# 對(duì)用戶相似度得分進(jìn)行降序排序sorted_similar_user = sorted(user_similarity_scores.items(),key=lambda x:x[1],reverse=True)# 選擇 TOP N 個(gè)相似用戶喜歡的景點(diǎn) 作為推薦結(jié)果recommended_items = set()for similar_user,_ in sorted_similar_user[:top_n]:recommended_items.update(user_ratings[similar_user].keys())# 過(guò)濾掉目標(biāo)用戶已經(jīng)評(píng)分過(guò)的景點(diǎn)recommended_items = [item for item in recommended_items if item not in target_user_ratings]return recommended_items
user_bases_collaborative_filtering
函數(shù)接受三個(gè)參數(shù):user_id
: 目標(biāo)用戶的ID。user_ratings
: 包含用戶評(píng)分信息的字典,其中鍵是用戶ID,值是包含景點(diǎn)及其評(píng)分的字典。top_n
: 選擇推薦結(jié)果的前N個(gè)景點(diǎn),默認(rèn)為20。
target_user_ratings = user_ratings[user_id]
:獲取目標(biāo)用戶的評(píng)分?jǐn)?shù)據(jù),即目標(biāo)用戶對(duì)各個(gè)景點(diǎn)的評(píng)分。user_similarity_scores = {}
:初始化一個(gè)空字典,用于保存其他用戶與目標(biāo)用戶的相似度得分。target_user_ratings_list = np.array([...])
:將目標(biāo)用戶的評(píng)分轉(zhuǎn)換為 NumPy 數(shù)組,以便后續(xù)計(jì)算余弦相似度。- 遍歷
user_ratings
中的每個(gè)用戶,計(jì)算目標(biāo)用戶與其他用戶之間的相似度得分:- 將其他用戶的評(píng)分轉(zhuǎn)化為 NumPy 數(shù)組。
- 使用余弦相似度計(jì)算兩個(gè)用戶之間的相似度得分。
- 將相似度得分存儲(chǔ)在
user_similarity_scores
字典中。
sorted_similar_user = sorted(user_similarity_scores.items(),key=lambda x:x[1],reverse=True)
:對(duì)用戶相似度得分進(jìn)行降序排序,得到一個(gè)包含用戶ID和相似度得分的元組列表。recommended_items = set()
:初始化一個(gè)集合,用于保存推薦的景點(diǎn)。- 遍歷排序后的相似用戶列表,選擇前
top_n
個(gè)相似用戶喜歡的景點(diǎn),將這些景點(diǎn)添加到recommended_items
集合中。 recommended_items = [item for item in recommended_items if item not in target_user_ratings]
:過(guò)濾掉目標(biāo)用戶已經(jīng)評(píng)分過(guò)的景點(diǎn),得到最終的推薦結(jié)果。- 返回
recommended_items
,即推薦給目標(biāo)用戶的景點(diǎn)列表。
這個(gè)函數(shù)接受目標(biāo)用戶ID、用戶評(píng)分字典以及要返回的推薦結(jié)果數(shù)量作為參數(shù)。它計(jì)算目標(biāo)用戶與其他用戶的相似度得分,然后選擇相似度最高的用戶喜歡的景點(diǎn)作為推薦結(jié)果。
– 獲取目標(biāo)用戶的評(píng)分?jǐn)?shù)據(jù)
– 初始化一個(gè)字典,用于保存其他用戶與目標(biāo)用戶的相似度得分
– 將目標(biāo)用戶的評(píng)分轉(zhuǎn)化為numpy數(shù)組
– 計(jì)算目標(biāo)用戶與其他用戶之間的相似度得分(余弦相似度)
– 對(duì)用戶相似度得分進(jìn)行降序排序
– 選擇TOP N個(gè)相似用戶喜歡的景點(diǎn)作為推薦結(jié)果
– 過(guò)濾掉目標(biāo)用戶已經(jīng)評(píng)分過(guò)的景點(diǎn)
五、系統(tǒng)頁(yè)面實(shí)現(xiàn)
啟動(dòng)項(xiàng)目,在終端窗口輸入命令,這里我設(shè)置的端口在8091:
python manage.py runserver 8091
用戶登錄注冊(cè)
系統(tǒng)首頁(yè)
數(shù)據(jù)操作管理
價(jià)格與銷量分析
旅游城市和景點(diǎn)等級(jí)分析
旅游數(shù)據(jù)評(píng)分情況分析
旅游數(shù)據(jù)評(píng)論情況分析
旅游景點(diǎn)推薦
Django系統(tǒng)后臺(tái)管理
http://127.0.0.1:8091/admin
六、結(jié)語(yǔ)
基于python旅游采集數(shù)據(jù)分析可視化推薦系統(tǒng)的目標(biāo)是為用戶提供便捷的旅游信息獲取和個(gè)性化推薦,并通過(guò)可視化展示使用戶更好地了解和選擇適合自己的旅游產(chǎn)品。它可以幫助用戶節(jié)省時(shí)間和精力,提高旅行的滿意度。
需項(xiàng)目資料/商業(yè)合作/交流探討等可以添加下面?zhèn)€人名片,后續(xù)有時(shí)間會(huì)持續(xù)更新更多優(yōu)質(zhì)內(nèi)容,感謝各位的喜歡與支持!