1. 程式人生 > >推薦系統的學習歷程(三)

推薦系統的學習歷程(三)

專案申報之後,要做的就是發表一篇學術論文。其實我對這個毫無壓力,因為我已經做過了實驗,我只需要將實驗結果寫到論文裡面即可。

但是,我的老師突然告訴我,我申報了服裝推薦系統,那我的實驗也得是服裝的。換句話說,我的資料必須是服裝資料。

大資料時代,最值錢的東西就是資料。最難弄到手的也是資料。服裝評分資料,淘寶、天貓、京東一大把。但是資料的可信度不高,無論裡面的評論有多少水軍,電商網站總是不會把關鍵資料放出來。

只能硬著頭皮做了。

這個時候又有個問題,資料怎麼得到手?只能用python爬蟲啊。我又花了不少時間學習爬蟲,終於學會了用正則表示式去解析網頁。老師叫我用市面上的爬蟲軟體去爬取。但是這些軟體都很不好用,特別是動態頁面。我想爬取服裝的評論,評論是分頁的,雖然大部分爬蟲軟體都克服這個問題。但是最大的問題是,爬蟲軟體需要商品的地址,注意,是每一個商品的地址。也就是說我要爬取2000件衣服的資料,那我就要輸入2000個網址。

我覺得過於繁瑣,於是自己編寫了一個爬蟲,只需要輸入某一個服裝瀏覽頁面,就可以把這一頁所有的服裝評論爬下來。

import json
import re
import requests
import html
import time
import json

def crawl_page(page):

    url="https://list.jd.com/list.html?cat=1315,1343,1355&ev=exbrand_165551&page="+str(page)+"&sort=sort_rank_asc&trans=1&JL=6_0_0#J_main"
    res=requests.get(url)
    body=res.text

    pattern=re.compile("var attrList = (.*?)var other_exts",re.S)
    ID_pattern=re.compile("[, ](\d.*?):\{")
    m=pattern.findall(body)
    ID=ID_pattern.findall(m[0])


    for item in ID:
        crawl_mark(item)


def crawl_mark(item):
    page=0
    str1="https://sclub.jd.com/comment/productPageComments.action?callback=fetchJSON_comment98vv7&productId="
    str1=str1+item
    str1=str1+"&score=0&sortType=5&page="
    str1=str1+str(page)+"&pageSize=10&isShadowSku=0&rid=0&fold=1"
    url=str1
    res=requests.get(url)
    body=res.text

    pattern=re.compile("{\"id.*?\"topped\"(.*?)afterDays",re.S)
    m=pattern.findall(body)
    maxpage_pattern=re.compile("maxPage\":(.*?),",re.S)
    content_pattern=re.compile("guid.*?content\":\"(.*?)\"",re.S)
    nick_pattern=re.compile("isReplyGrade.*?nickname\":\"(.*?)\"",re.S)
    score_pattern=re.compile("replyCount2.*?score\":(.*?),",re.S)
    level_pattern=re.compile("userLevelName\":\"(.*?)\"")

    maxpage=maxpage_pattern.findall(body)

    fo=open("data.txt","a")
    ft=open("test.txt","a",encoding="utf-8")
    output2={}
    for page in range(0,int(maxpage[0])):
        str1="https://sclub.jd.com/comment/productPageComments.action?callback=fetchJSON_comment98vv3&productId="
        str1=str1+item
        str1=str1+"&score=0&sortType=5&page="
        str1=str1+str(page)+"&pageSize=10&isShadowSku=0&rid=0&fold=1"
        url=str1
        res=requests.get(url)
        body=res.text
        
        output1=[]
        for div in m:
            content=content_pattern.search(div).group(1)
            nick=nick_pattern.search(div).group(1)
            score=score_pattern.search(div).group(1)
            level=level_pattern.search(div).group(1)
            user=[score,level]
            output2.setdefault(nick,user)


        count=1

    for key in output2:
        if count<4:
            count=count+1       
            fo.write(item+" "+key+" "+output2[key][0]+" "+output2[key][1]+"\n")  
        else:
            count=1
            ft.write(item+" "+key+" "+output2[key][0]+" "+output2[key][1]+"\n")
         
  
if __name__=='__main__':
    for i in range(1,6):
        crawl_page(i)

又是繁瑣的環境配置。但是當這個爬蟲跑起來的時候,我有一種自己做的東西比市面上500塊一個月的爬蟲軟體還要好用的優越感。這種感覺又讓我充滿了自信。

獲取了這些資料之後我做了實驗,發現這些資料應該是處理過的,而且使用者水軍很多(不知道這一點能不能發論文呢)。

但是還是用這個資料的實驗結果寫了篇協同過濾演算法改進的論文。

也正是這篇論文的完成,意味著我在機器學習上面的研究可以暫時告一段落了,也正是這個時候我才有時間好好的總結一下過去的學習。接下來我準備ACM9月份的省賽。大三的時候我又會回過頭來繼續研究。希望那個時候我身上有個獎牌吧。