乱写
本来就想直接沿用老师的思路,只需要一个比较相似文档就好。半路读到推荐系统,感觉很有意思,而且抓取到用户评论以及用户的其他购买商品数据之后,完全可以做一个“你可能还喜欢”的简单推荐系统。
系统需要的输入信息:某个商品的url(item OR review?)
系统需要输出的信息:XX商品的url(购买该商品的用户还买了XX商品)
系统需要抓取的信息:
1根据A商品的url,建立A商品的Product数据库
{product_id:来自于A商品的url中的数字http://club.jd.com/review/560573-0-1-0.html
product_name:判断依据,url=http://item.jd.com/560573.html的锚文本
product_url:根据product_id自行构建
}
2获取对A商品的评论数据,即建立完成User、Discussion数据库
query=”product_id AND repay“可以得到一个用户对A商品的评价页,http://club.jd.com/repay/560573_b4cb0a89-4f0a-4b66-9b5f-b1b26d8ae338_1.html。在该页面中获取discuss_content
其他数据库数据项的获取参考该文章:http://blog.youkuaiyun.com/lookie0412/article/details/8901875
我们需要仔细考虑的是系统工作顺序问题
1系统接收用户提交的商品url
2分析该url,得到product数据库的三个属性值:id、name、url
建立一个CreateProduct类
需要的方法有
getProductName = outlink.url为http://item.jd.com/560573.html的锚文本
getProductID = A商品的url中的数字http://club.jd.com/review/560573-0-1-0.html,利用substring的方法切出数字
getProductURL = 对于A商品,则输入的url即是;对于其它商品,需要在商品id的基础上,自行拼凑出
所以首先要根据用户提交的url得到id,然后利用锚文本得到name,最后根据id拼凑出商品的url
但是如果想复用这三个方法,需要另外建立一个方法,来从用户输入的url中获取ID,比如getRawProductID,利用这个raw-id拼凑出item-id,item-id=product-id
3拼凑评价页面的url
建立一个GenerateURL类,来获取review中不同页码的url
需要的方法有generateDIscussionURL,getTotalPageNum
getTotalPageNum 首先要确定该商品的评价一共有多少页,利用”最新商品评价“和”下一页“之间的数字页码为页码数量。
generateDiscussionURL 以pagenum为循环建立评价url,并将这些url每200个合并为一个文件url.txt
4此时开始进行nutch crawl操作
如果要在同一个系统内进行操作,则需要用户输入若干参数:-topN,-threads,-depth(似乎需要固定)
其实也可以跳出系统进行人工操作
5在Product基础上继续完善User和Discussion两个数据库
建立GetDiscuss类
需要的方法有
getDiscuss,在url域中进行查询query = ”repay” AND product_id,discuss_url可以获取到。循环hits.lenght次,获取每个讨论的url,并且在 discuss_url页面中获取parse_text为discuss_content。url为repay页本身的锚文本为purchase_date。至此discuss各个数据项填充完毕。
建立GetUser类
需要的方法有
getUser 在url域中进行查询query = “userreview”,该url(user_url)中包含user_id可以利用substring方法得到。而url为userreview的锚文本即为 user_name。user_role获取略微麻烦些,url为“help”页的锚文本即为用户等级。
6*抓取每个用户的其他商品评价
例如在http://club.jd.com/userreview/51095435-1-1.html中,该用户还购买了其它商品product
product_name 为url=“item”的锚文本
prodcut_url 为商品名锚文本对应的url
product_id仍然切去item字样url中的数字(应该注意,利用getProductID似乎存在问题)
这样只能抓取用户评价的第一页评价数据,似乎有数据不充分的问题。
7*这样我们在product数据库中为所有得到相关商品建立了一条记录(注意去重问题)
考虑在product数据库中增加一条times次数属性
我们利用一种方法,calculatePurchaseTimes来计算每种商品被购买了多少次,购买次数最多的前n个商品即为推荐商品。返回该商品的url即可。
暂未想到好7*是否能实现,也可以为除了RAW商品之外其他商品建立discuss数据库,最终在discuss数据库中查询同一id的购买次数。(遍历算法怎么办?)