close

※已完成架構與部份功能,還有許多細節沒有處理

-------------------------------------------------------------------------------------------------------------

待修正:

爬蟲系統:分類出現亂碼、用update更新

未登入不可追蹤,判斷是否登入,未登入則改為連接至登入頁面(可以跳出js提醒或是登入框)

無追蹤商品時,追蹤頁面要顯示無商品

 

已解決:

追蹤商品:model創建list屬性、存入List在迴圈取出(取出時使用方法ex.get_method()),無法存入外鍵(分類),需從外鍵模組取出

搜尋引擎:使用whoosh+haystack+jieba進行中文模糊搜索 

下拉式選單:全域模板標籤

商品清單對齊:CSS使用min-height,值略大於最大高度即可

根據參數對主頁進行價格排序

爬蟲系統:分類出現亂碼。html.parser自動判斷編碼偶爾會判斷錯誤,所以改用lxml(需要pip安裝)

 

未開發 :

下拉式選單:停在當前標籤、異步更新資料

嘗試利用js更新商品

js追蹤商品與移除追蹤

追蹤商品改為創建一個關聯用戶的模組紀錄,而不是用列表

 

-------------------------------------------------------------------------------------------------------------


 

Python Django 專案:購物網站比價網

一、網站分析

1.功能分析

(1)網站方向

四個購物網站查詢(pc24、momo、yahoo、蝦皮)
取得所有相似百分之80的商品
列表顯示:商品名稱、連結、縮略圖、商場名稱

(2)網站功能

搜尋引擎(例如拆字搜尋,空格搜尋...等)
排序:價格區間排序、相關度、官方賣場
單件商品價格區間(相關度達9成)
商品熱度排行(各賣場人氣)

(3)爬蟲系統

直接賣場商品編號爬蟲
分類(商品類別、賣場、賣家資訊、時間、人氣)
存入資料庫
定期更新資料

(4)網站頁面

首頁
資訊電器
生活用品
類別頁面 
登入註冊
追蹤的商品

(5)網站應用

登入登出系統
追蹤商品系統
搜尋引擎系統
2.流程圖概覽
購物網站流程圖.jpg
3.使用者介面圖
 
home.png
 

二、爬蟲系統

1.momo購物網

(1)依照商品編號爬蟲

Momo購物網的商品採用數字編號的方式新增,直接按照編號遍歷商品十分順利
#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.環境建置

  1. 建置虛擬環境
  2. 安裝Django
  3. 資料遷移應用、創建超級使用者
  4. 配置、註冊資料庫
  5. 配置基礎模板、路徑
  6. 導入bootstrap、jquery

2.爬蟲系統

  1. 將爬取的資料存入資料庫(暫時放入一個url使用)
    1. 在搜尋應用中創建<crawler.py>將爬蟲程式放入其中
    2. 導入modes的模型、爬蟲套件,最後將資料存入資料庫
    3. 在應用的<urls.py>import crawler,並寫好爬蟲程式路徑
    4. 在主頁導覽列添加爬蟲程式的路徑,以供測試使用

3.主頁功能

  1. 搜尋功能:創建搜尋框、按鈕
  2. 使用CSS調整樣式
  3. 商品清單對齊:CSS使用min-height,值略大於最大高度即可

4.所有商品列表:路徑、視圖、模板

  1. 設置url路徑
  2. 在<views.py>撰寫查詢全部商品的方法
  3. 撰寫前端頁面
    1. 使用block切分其他模板可能要修改的區塊:標題、排序、內容、JS

4.分類功能

  1. 為所有類別建立分類頁面
    1. 在搜尋應用<urls.py>添加分類路徑,在路徑上加入int計數來傳遞編號給分類方法
    2. 在搜尋應用<views.py>中撰寫分類方法,導入編號並使用get_object_or_404查找分類編號
    3. 在分類方法對商品資料模型進行filter查找出對應分類編號的所有商品資料
    4. 在搜尋應用中建立templates/goods目錄,並創建分類模板,繼承所有商品頁面內容(傳遞的變數需一致)
    5. 在主頁的商品資料中的分類項目添加分類路徑即可實現分類功能
  2. 為資訊類、生活用品類,創建多項分類的方法
    1. 在搜尋應用<urls.py>添加多項分類路徑
    2. 在搜尋應用<views.py>中撰寫多項分類方法
    3. 對商品分類模型使用get_object_or_404方法get想要查詢的分類值需要幾項就get幾列,將結果存入一個自訂變數當中
    4. 對商品資料模型使用filter(分類__[自訂變數,自訂變數,自訂變數,....])找出多項分類的資料
    5. 創建多重分類模板繼承所有商品頁面內容,若有多個多重分類模板,則依照是否需要採用不同內容決定是否需要分為多個模板
    6. 在導航列的資訊類、生活用品類添加路徑  
  3. 使用全局模板標籤為分類建立下拉式選單
    1. 在搜尋應用創建templatetags目錄,並創建<__init__.py>檔案
    2. 創建<goodtypetags.py>,導入套件並註冊與撰寫get_good_types方法
    3. 在要使用全局分類下拉選單的地方(ex.使用在導航列):{% load goodtypetags %}
    4. {% get_good_types GoodsType as good_types %}取得模板標籤內容
    5. 使用for迴圈取出分類編號與名稱

5.排序功能

  1. 添加排序參數
    1. 在<urls.py>的分類路徑最後,加入字串參數
    2. 在<views.py>的分類方法中,傳入該字串參數,預設為None
  2. 撰寫排序方法
    1. 在<views.py>中,創建一個排序方法,該方法傳入三個參數:request、查詢表(filter結果)、字串參數
    2. 進行if判斷,根據傳入的字串不同,採用不同的order_by排序,賦值回給傳入的查詢表
    3. 若傳入的值為None則代表不排序,查詢表不更動
  3. 使用排序方法
    1. 對資料表使用排序方法,並將排序後的結果存入變數傳至前端頁面
  4. 編寫前端頁面
    1. 在前端頁面使用block修改所有商品頁面的排序選項參數
    2. 根據不同模板頁面,排序使用的url也須隨之改變

6.搜尋功能:可以在導航列搜索框進行全局商品搜尋

  1. pip安裝 django-haystack whoosh jieba settings
  2. setting配置:app註冊haystack、搜索引擎配置
  3. 設置url路徑
  4. 在搜尋應用目錄創建<search_indexes.py>
  5. 設置取出的資料欄位
  6. 設置whoosh搜尋引擎、導入jieba中文分詞
  7. 前端頁面配置
  8. 建立索引:python manage.py rebuild_index
  9. 排序搜尋:在<urls.py>添加查詢方式,使用searchqueryset進行排序搜尋
  10. search模板使用{{ query }}可引用關鍵字

7.分頁功能

  1. 導入paginator套件
  2. 分頁後端方法:
    1. 將資料進行分頁
    2. 獲取url頁面參數、自動識別當前頁碼
    3. 獲取當前頁碼、該頁碼資料
    4. 劃定頁碼範圍加入首尾頁、省略符號
  3. 分頁前端模版:
    1. 插入前一頁,判斷若無前一頁則不顯示
    2. 迴圈插入頁碼,判斷當前頁添加active,判斷省略符號不加超連結
    3. 插入下一頁,判斷若無下一頁則不顯示
  4. 計算商品總數、顯示當前頁碼與總頁數

8.用戶系統

  1. 登錄功能
    1. 創建用戶應用、註冊app
    2. 應用目錄創建<forms.py>
    3. 撰寫登錄表單
    4. 設置url路徑
    5. 初步撰寫登入方法、登入模板
    6. 基礎模板導覽列添加登入判斷
    7. <forms.py>表單進行登錄驗證
    8. 完善後端方法
    9. 使用reverse將登錄後轉回前一頁面
  2. 登出功能
    1. 在用戶應用<views.py>添加登出方法
    2. 設置url路徑
    3. 在導覽列添加登出選項
  3. 註冊功能
    1. 在用戶表單初步撰寫註冊表單
    2. 初步撰寫註冊方法
    3. 設置url路徑
    4. 註冊表單驗證
      1. 密碼驗證,須將"clean_變數"與cleandata最後的變數對應
    5. 完善註冊方法
      1. 儲存密碼時使用密文儲存
    6. 撰寫註冊模板
  4. 追蹤商品功能
    1. 在用戶應用創建自訂用戶模型拓展關聯User
    2. 導入ListField,添加追蹤商品欄位
    3. 註冊至admin、進行資料遷移與應用
    4. 在自訂用戶模型將獲取list的方法賦值給User模組
    5. 設置url,傳入商品編號
    6. 在用戶應用<views.py>添加追蹤方品方法(傳入商品編號)
    7. 取得用戶資料、使用"方法"取出List、外鍵模組需額外獲取
    8. 判斷是否為新資料,已有資料不儲存,反之為新資料則儲存
    9. 創建商品追蹤頁面,使用用戶模組的List顯示資料
    10. 移除商品追蹤:設置url路徑,使用forloop記數移除商品追蹤

 

8.商品功能

  1. 熱門點擊
  2. 點讚系統 
arrow
arrow
    全站熱搜

    ivankao 發表在 痞客邦 留言(0) 人氣()