※已完成架構與部份功能,還有許多細節沒有處理
-------------------------------------------------------------------------------------------------------------
待修正:
爬蟲系統:分類出現亂碼、用update更新
未登入不可追蹤,判斷是否登入,未登入則改為連接至登入頁面(可以跳出js提醒或是登入框)
無追蹤商品時,追蹤頁面要顯示無商品
已解決:
追蹤商品:model創建list屬性、存入List在迴圈取出(取出時使用方法ex.get_method()),無法存入外鍵(分類),需從外鍵模組取出
搜尋引擎:使用whoosh+haystack+jieba進行中文模糊搜索
下拉式選單:全域模板標籤
商品清單對齊:CSS使用min-height,值略大於最大高度即可
根據參數對主頁進行價格排序
爬蟲系統:分類出現亂碼。html.parser自動判斷編碼偶爾會判斷錯誤,所以改用lxml(需要pip安裝)
未開發 :
下拉式選單:停在當前標籤、異步更新資料
嘗試利用js更新商品
js追蹤商品與移除追蹤
追蹤商品改為創建一個關聯用戶的模組紀錄,而不是用列表
-------------------------------------------------------------------------------------------------------------
Python Django 專案:購物網站比價網
一、網站分析
1.功能分析
(1)網站方向
(2)網站功能
(3)爬蟲系統
(4)網站頁面
(5)網站應用


二、爬蟲系統
1.momo購物網
(1)依照商品編號爬蟲
#momo爬蟲 商品數量約 5912700 def momogoods(goodnumber): link = 'https://www.momoshop.com.tw/goods/GoodsDetail.jsp?i_code=' url = link+str(goodnumber) #選擇網址 user_agent = 'Mozilla/5.0 (Windows; U; Windows NT 6.1; zh-CN; rv:1.9.2.15) Gecko/20110303 Firefox/3.6.15' #偽裝使用者 headers = {'User-Agent':user_agent} data_res = urllib.request.Request(url=url,headers=headers) data = urllib.request.urlopen(data_res) sp = BeautifulSoup(data, "lxml") try: #商品名稱 pdname_bs4 = sp.find("div",{"class":"prdnoteArea"}).find("h1") pdname_text = str(pdname_bs4.text) if re.findall('】',pdname_text): pdname_getname = re.findall('(】.*)',pdname_text) pdname_removesymbol = str(pdname_getname).strip('[').strip(']').strip("'").strip('】') momopdname = pdname_removesymbol #商品品牌 if re.match('(【.*】.*【.*】)',pdname_text): #若商品名稱出現兩次賣場名稱 pdshop_removesecond = re.findall('(.*】.*【)',pdname_text) #先拿掉一個下括號避免查找錯誤 pdname_text = pdshop_removesecond pdshop_bs4 = re.findall('(【.*】)',str(pdname_text)) pdshop_removesymbol = str(pdshop_bs4).replace("['【","").replace("】']","") momopdshop = pdshop_removesymbol else: momopdname = pdname_text momopdshop = '暫無賣場資訊' #商品類別 try: pdclass_bs4 = sp.find("div",{"id":"bt_2_layout_NAV"}).find("h5") momopdclass = pdclass_bs4.text except: momopdclass = '尚無類別' #商品價格 pdprice_bs4 = sp.find("li",{"class":"special"}).find("span") momopdprice_removesymbol = str(pdprice_bs4.text).replace(',','') momopdprice = momopdprice_removesymbol #商品圖片連結 momoimgs_bs4 = sp.find("div",{"class":"gmclass"}).findAll("a", href = re.compile('goodsimg')) for momoimg_getlink in momoimgs_bs4: momoimg = 'https:'+ momoimg_getlink['href'] print(momopdname) print(momopdprice) print(momopdclass) print(momopdshop) print(momoimg) print(url) momosql(momopdname,momopdprice,momopdclass,momopdshop,momoimg,url) except: print('該編號無商品') def momosql(momopdname,momopdprice,momopdclass,momopdshop,momoimg,url): goodname = momopdname goodprice = momopdprice goodshop = momopdshop goodtype = momopdclass goodlink = url goodimglink = momoimg try: typename = GoodsType.objects.get(type_name=goodtype) print('存入分類') except: typename = GoodsType.objects.create(type_name=goodtype) print('創建分類') typename.save() try: momodb = GoodsDetail.objects.get(goodlink=goodlink) momodb.goodname = goodname momodb.goodprice = momopdprice momodb.goodshop = momopdshop momodb.goodtype = typename momodb.goodlink = url momodb.goodimglink = momoimg momodb.save() print('更新資料') except: momodb = GoodsDetail.objects.create(goodname=goodname, goodprice=goodprice, goodshop=goodshop, goodtype=typename, goodlink=goodlink, goodimglink=goodimglink) momodb.save() print('成功存入一筆資料') def momocrawler(request): for code in range(5600000,5900000): momogoods(code) return redirect('home')
三、網站架設流程
1.環境建置
- 建置虛擬環境
- 安裝Django
- 資料遷移應用、創建超級使用者
- 配置、註冊資料庫
- 配置基礎模板、路徑
- 導入bootstrap、jquery
2.爬蟲系統
- 將爬取的資料存入資料庫(暫時放入一個url使用)
- 在搜尋應用中創建<crawler.py>將爬蟲程式放入其中
- 導入modes的模型、爬蟲套件,最後將資料存入資料庫
- 在應用的<urls.py>import crawler,並寫好爬蟲程式路徑
- 在主頁導覽列添加爬蟲程式的路徑,以供測試使用
3.主頁功能
- 搜尋功能:創建搜尋框、按鈕
- 使用CSS調整樣式
- 商品清單對齊:CSS使用min-height,值略大於最大高度即可
4.所有商品列表:路徑、視圖、模板
- 設置url路徑
- 在<views.py>撰寫查詢全部商品的方法
- 撰寫前端頁面
- 使用block切分其他模板可能要修改的區塊:標題、排序、內容、JS
4.分類功能
- 為所有類別建立分類頁面
- 在搜尋應用<urls.py>添加分類路徑,在路徑上加入int計數來傳遞編號給分類方法
- 在搜尋應用<views.py>中撰寫分類方法,導入編號並使用get_object_or_404查找分類編號
- 在分類方法對商品資料模型進行filter查找出對應分類編號的所有商品資料
- 在搜尋應用中建立templates/goods目錄,並創建分類模板,繼承所有商品頁面內容(傳遞的變數需一致)
- 在主頁的商品資料中的分類項目添加分類路徑即可實現分類功能
- 為資訊類、生活用品類,創建多項分類的方法
- 在搜尋應用<urls.py>添加多項分類路徑
- 在搜尋應用<views.py>中撰寫多項分類方法
- 對商品分類模型使用get_object_or_404方法get想要查詢的分類值,需要幾項就get幾列,將結果存入一個自訂變數當中
- 對商品資料模型使用filter(分類__[自訂變數,自訂變數,自訂變數,....])找出多項分類的資料
- 創建多重分類模板繼承所有商品頁面內容,若有多個多重分類模板,則依照是否需要採用不同內容決定是否需要分為多個模板
- 在導航列的資訊類、生活用品類添加路徑
- 使用全局模板標籤為分類建立下拉式選單
- 在搜尋應用創建templatetags目錄,並創建<__init__.py>檔案
- 創建<goodtypetags.py>,導入套件並註冊與撰寫get_good_types方法
- 在要使用全局分類下拉選單的地方(ex.使用在導航列):{% load goodtypetags %}
- {% get_good_types GoodsType as good_types %}取得模板標籤內容
- 使用for迴圈取出分類編號與名稱
5.排序功能
- 添加排序參數
- 在<urls.py>的分類路徑最後,加入字串參數
- 在<views.py>的分類方法中,傳入該字串參數,預設為None
- 撰寫排序方法
- 在<views.py>中,創建一個排序方法,該方法傳入三個參數:request、查詢表(filter結果)、字串參數
- 進行if判斷,根據傳入的字串不同,採用不同的order_by排序,賦值回給傳入的查詢表
- 若傳入的值為None則代表不排序,查詢表不更動
- 使用排序方法
- 對資料表使用排序方法,並將排序後的結果存入變數傳至前端頁面
- 編寫前端頁面
- 在前端頁面使用block修改所有商品頁面的排序選項參數
- 根據不同模板頁面,排序使用的url也須隨之改變
6.搜尋功能:可以在導航列搜索框進行全局商品搜尋
- pip安裝 django-haystack whoosh jieba settings
- setting配置:app註冊haystack、搜索引擎配置
- 設置url路徑
- 在搜尋應用目錄創建<search_indexes.py>
- 設置取出的資料欄位
- 設置whoosh搜尋引擎、導入jieba中文分詞
- 前端頁面配置
- 建立索引:python manage.py rebuild_index
- 排序搜尋:在<urls.py>添加查詢方式,使用searchqueryset進行排序搜尋
- search模板使用{{ query }}可引用關鍵字
7.分頁功能
- 導入paginator套件
- 分頁後端方法:
- 將資料進行分頁
- 獲取url頁面參數、自動識別當前頁碼
- 獲取當前頁碼、該頁碼資料
- 劃定頁碼範圍加入首尾頁、省略符號
- 分頁前端模版:
- 插入前一頁,判斷若無前一頁則不顯示
- 迴圈插入頁碼,判斷當前頁添加active,判斷省略符號不加超連結
- 插入下一頁,判斷若無下一頁則不顯示
- 計算商品總數、顯示當前頁碼與總頁數
8.用戶系統
- 登錄功能
- 創建用戶應用、註冊app
- 應用目錄創建<forms.py>
- 撰寫登錄表單
- 設置url路徑
- 初步撰寫登入方法、登入模板
- 基礎模板導覽列添加登入判斷
- <forms.py>表單進行登錄驗證
- 完善後端方法
- 使用reverse將登錄後轉回前一頁面
- 登出功能
- 在用戶應用<views.py>添加登出方法
- 設置url路徑
- 在導覽列添加登出選項
- 註冊功能
- 在用戶表單初步撰寫註冊表單
- 初步撰寫註冊方法
- 設置url路徑
- 註冊表單驗證
- 密碼驗證,須將"clean_變數"與cleandata最後的變數對應
- 完善註冊方法
- 儲存密碼時使用密文儲存
- 撰寫註冊模板
- 追蹤商品功能
- 在用戶應用創建自訂用戶模型拓展關聯User
- 導入ListField,添加追蹤商品欄位
- 註冊至admin、進行資料遷移與應用
- 在自訂用戶模型將獲取list的方法賦值給User模組
- 設置url,傳入商品編號
- 在用戶應用<views.py>添加追蹤方品方法(傳入商品編號)
- 取得用戶資料、使用"方法"取出List、外鍵模組需額外獲取
- 判斷是否為新資料,已有資料不儲存,反之為新資料則儲存
- 創建商品追蹤頁面,使用用戶模組的List顯示資料
- 移除商品追蹤:設置url路徑,使用forloop記數移除商品追蹤
8.商品功能
- 熱門點擊
- 點讚系統