项目申报之后,要做的就是发表一篇学术论文。其实我对这个毫无压力,因为我已经做过了实验,我只需要将实验结果写到论文里面即可。
但是,我的老师突然告诉我,我申报了服装推荐系统,那我的实验也得是服装的。换句话说,我的数据必须是服装数据。
大数据时代,最值钱的东西就是数据。最难弄到手的也是数据。服装评分数据,淘宝、天猫、京东一大把。但是数据的可信度不高,无论里面的评论有多少水军,电商网站总是不会把关键数据放出来。
只能硬着头皮做了。
这个时候又有个问题,数据怎么得到手?只能用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月份的省赛。大三的时候我又会回过头来继续研究。希望那个时候我身上有个奖牌吧。