推荐系统的学习历程(三)

项目申报之后,要做的就是发表一篇学术论文。其实我对这个毫无压力,因为我已经做过了实验,我只需要将实验结果写到论文里面即可。

但是,我的老师突然告诉我,我申报了服装推荐系统,那我的实验也得是服装的。换句话说,我的数据必须是服装数据。

大数据时代,最值钱的东西就是数据。最难弄到手的也是数据。服装评分数据,淘宝、天猫、京东一大把。但是数据的可信度不高,无论里面的评论有多少水军,电商网站总是不会把关键数据放出来。

只能硬着头皮做了。

这个时候又有个问题,数据怎么得到手?只能用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月份的省赛。大三的时候我又会回过头来继续研究。希望那个时候我身上有个奖牌吧。

猜你喜欢

转载自blog.csdn.net/ACM5100/article/details/80671412