推薦系統的學習歷程(三)
阿新 • • 發佈:2018-12-02
專案申報之後,要做的就是發表一篇學術論文。其實我對這個毫無壓力,因為我已經做過了實驗,我只需要將實驗結果寫到論文裡面即可。
但是,我的老師突然告訴我,我申報了服裝推薦系統,那我的實驗也得是服裝的。換句話說,我的資料必須是服裝資料。
大資料時代,最值錢的東西就是資料。最難弄到手的也是資料。服裝評分資料,淘寶、天貓、京東一大把。但是資料的可信度不高,無論裡面的評論有多少水軍,電商網站總是不會把關鍵資料放出來。
只能硬著頭皮做了。
這個時候又有個問題,資料怎麼得到手?只能用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月份的省賽。大三的時候我又會回過頭來繼續研究。希望那個時候我身上有個獎牌吧。