一、背景及目的

在淘宝、京东等网络平台上购物,逐渐成为大众化的购物方式。但假冒伪劣产品在这个摸不着实物的购物平台严重危害着消费者的购物体验,即使我们可以通过七天无理由退货退款来维护我们的合法权益,但是这样浪费大量的人力和财力。

我们希望能够一次性通过网络购买到心怡的商品,其实我们可以在购买商品之前在对应商品店铺下查看以往买家的购物体验和商品评价,通过商品评价判断该商品是否值得购买。

但是事实并非如此,网络购物平台的一些商家为了吸引顾客购买商品,往往会通过刷假评论诱骗买家,同时也有一大批被‘好评返现’吸引的消费者注入大量注水评论。

虽然往往买家都能够筛选出大部分这样的评论,但人工筛查繁琐、复杂。其实一个好的筛选评论、重构评论的程序能够为消费者提供更真实的商品信息。

二、设计分析

通过搜集资料分析得知淘宝平台相对于京东平台,其反爬性更强。因此,本次设计从京东平台爬取评论、评论晒图进行分析重构制作云图。

即用户输入京东商品链接,程序分析提取出链中的id号,通过链接拼接生成该商品评论的url,从评论中提取出lastpage(评论最后一页),将0到lastpage页分成两部分分给两个线程进行爬取,爬取获得商品评论和商品晒图。

对爬取得到的评论进行筛选,即:

1、对每条评论进行逐字统计,若该评论中某字符反复不正常出现(多于该评论总数的30%)即判定为注水评论;

  1. 如评论:“这个衣服特别好看。。。。。。。。”,用户通过多次输入符号‘。’完成商家下达的某种好评返现任务或平台的评价任务,导致字符‘。’反复出现率高达30%;(由于某字符数量过多,分母过大导致比例大于30%)
  2. 如评论:“好看”,用户仅输入两个字符(字符数少于4)作为评论,其参考价值不大,导致其字符‘好’和字符‘看’字反复出现率高达30%;(总字符数量过少,分子过小导致比例大于30%)

2、对于第一次筛选保留下的评论进行第二次筛选。给定出部分常见词作为好评关键字,统计每条评论的好评次数,若一条评论中好评次数高于5次判定为好评过多;

自定义的好评关键字:GoodComment={'推荐','好用','满意','舒服','喜欢','买它','优惠','很值','赞','精美','回购','漂亮','好看','不错','新款','实惠','速度快','效果好','很舒适','很柔软','很合身','真在用','好','继续买','非常好','很好','质量不错','挺好的','继续购买','特别好','蛮好','一直非常满意','特别好看'}

对绝对好评记两次好评数量,如好评关键字{'满意','非常满意'}在评论‘非常满意’中出现两次,而在评论‘比较满意’中只出现一次,即对绝对好评给予一定的筛选。

3、若单条评论总数少于30字,要求有效评论的好评数不得高于评论总字符数的20%;若单条评论总数大于30字,要求有效评论的好评数不得高于评论总字符数的10%且其单个字符重复出现率不得高于20%;

  1. 如评论:“衣服好看,非常满意,还很舒服,买它”,出现好评次数高达5次,而其字符总数为17,判定为刷假评。(由于好评次数过多,分母过大导致比例大于20%)
  2. 如评论:“好看”,评论总字符为2,好评次数为1,判定为假评论,用户为完成商家下达的某种好评返现任务或平台的评价任务,任务式的评论。(总字符数量过少,分子过小导致比例大于20%)
# -*- coding:utf-8 -*-
import requests
import urllib
import time
import threading
import json
import pandas
import os
import re
import jieba
import wordcloud
from PIL import Imageclass myThread (threading.Thread):def __init__(self, threadID, name, counter):threading.Thread.__init__(self)self.threadID = threadIDself.name = nameself.counter = counterdef run(self):print ("开始线程:" )get_information()print ("退出线程:" )#找出字符串str中最多的字
def max_letter_count(str):count_max=0for i in str:if str.count(i)>count_max:max_char=icount_max = str.count(i)list=[]list.append(max_char)list.append(count_max)return listdef get_information(id,headers,start_page,end_page,result,reason):#目前整理的一些好评关键词GoodComment={'推荐','好用','满意','舒服','喜欢','买它','优惠','很值','赞','精美','回购','漂亮','好看','不错','新款','实惠','速度快','效果好','很舒适','很柔软','很合身','真好','继续买','非常好','很好','质量不错','挺好的','继续购买','特别好','蛮好','一直在用','非常满意','特别好看'}#输出每一页的评论for page in range(start_page,end_page):print("正在爬第"+str(page)+"页",end='')url='https://club.jd.com/comment/productPageComments.action?callback=fetchJSON_comment98&productId='+id+'&score=0&sortType=5&page='+str(page)+'&pageSize=10&isShadowSku=0&fold=1'data=requests.get(url,headers=headers).content.decode('gbk')data=data[data.find('{'):data.rfind('}')+1]data=json.loads(data)#筛选出有用评论for num in data['comments']:#爬取商品评论图print('.',end='')m=0path='photo/'+str()+str(num['id'])+'/'try:for image_url in num['images']:if not os.path.exists(path):os.makedirs(path)if '.jpg' in image_url['imgUrl']:urllib.request.urlretrieve('http:'+image_url['imgUrl'],path+str(num['id'])+'-'+str(m)+'.jpg')else:urllib.request.urlretrieve('http:'+image_url['imgUrl'],path+str(num['id'])+'-'+str(m)+'.png')                        m=m+1except:pass#如果在某一个评论中某个字重复出现率高达30%,判断为买家的垃圾评论,不写入评论中if max_letter_count(num['content'])[1]/len(num['content'])>0.3:    #30%保证了评论字数不得低于4个reason.append({"ID":str(num['id']),"评论时间":num['creationTime'],"评论内容":num['content'],"理由":max_letter_count(num['content'])[0]+"重复出现率高达30%"})else:GoodCommentNum=0for Comment in GoodComment:               #如果评论中出现好评关键字,记录加1if Comment in num['content']:GoodCommentNum=GoodCommentNum+1if GoodCommentNum>5:              #如果好评数量大于5,判断为虚假评论reason.append({"ID":str(num['id']),"评论时间":num['creationTime'],"评论内容":num['content'],"理由":"好评过多"})                                if len(num['content'])<30:                    #评论字数少于30字if GoodCommentNum<=10 and GoodCommentNum/len(num['content'])<=2/10:    #如果每10字评论有好评关键字小于2,存入评论result.append({"ID":str(num['id']),"评论时间":num['creationTime'],"评论内容":num['content']})else:reason.append({"ID":str(num['id']),"评论时间":num['creationTime'],"评论内容":num['content'],"理由":"好评过多"})else:                                         #评论字数大于30字if max_letter_count(num['content'])[1]/len(num['content'])>0.2:reason.append({"ID":str(num['id']),"评论时间":num['creationTime'],"评论内容":num['content'],"理由":max_letter_count(num['content'])[0]+"重复出现率高达20%"})else:if GoodCommentNum<=10 and GoodCommentNum/len(num['content'])<1/10:    #如果每10字评论有好评关键字小于1,存入评论result.append({"ID":str(num['id']),"评论时间":num['creationTime'],"评论内容":num['content']})else:reason.append({"ID":str(num['id']),"评论时间":num['creationTime'],"评论内容":num['content'],"理由":"好评过多"})print("\n爬完第"+str(page)+"页")def cloud_word(comment_word,name):      #生成词云stopwords = [line.strip() for line in open('stop_words.txt', encoding='UTF-8').readlines()]    #加载停用词表comment_word=comment_word.encode('utf-8')comment_word=jieba.cut(comment_word)     #未去掉停用词的分词结果comment_word_spite = []for word in comment_word:                #去掉停分词if word not in stopwords:comment_word_spite.append(word)comment_word_spite=' '.join(comment_word_spite)wc=wordcloud.WordCloud(           #创建wordcloud对象r'msyh.ttc',width=500,height=500,background_color='white',font_step=2,random_state=False,prefer_horizontal=0.9)t=wc.generate(comment_word_spite)t.to_image().save(name+'.png')def main():#浏览器访问伪装headers={'cookie':'__jdu=1384393634; user-key=64cfaaaa-e9f5-44b6-aac1-dec3f039c579; shshshfpa=40046db0-abc7-9249-e586-be928ab56582-1622550747; shshshfpb=dZkSO4sODsTa9GxzwSxHzdg%3D%3D; pinId=jHv0wxmPkPhb-YWw04wmnw; pin=jd_YJrEMvrufaok; unick=YWH%E6%B5%A9%E4%BB%94; _tp=DEtfmumI9fa5on%2Bb%2Fy6SRQ%3D%3D; _pst=jd_YJrEMvrufaok; areaId=17; unpl=V2_ZzNtbUMHSxRyARJRfEkJDGIAEV9KBEEXcVoVBnlOCwFjURRfclRCFnUUR1NnGl0UZwsZWEtcQh1FCEdkeBBVAWMDE1VGZxBFLV0CFSNGF1wjU00zQwBBQHcJFF0uSgwDYgcaDhFTQEJ2XBVQL0oMDDdRFAhyZ0AVRQhHZHsbVQBlCxBaQFJzJXI4dmR%2bEFQDYwYiXHJWc1chVEFTexlVBSoDEFRHVUsXcgpDZHopXw%3d%3d; __jdv=76161171|baidu-pinzhuan|t_288551095_baidupinzhuan|cpc|0f3d30c8dba7459bb52f2eb5eba8ac7d_0_0a9068e46ad842239b335cbc3ff55c73|1624189690392; __jda=122270672.1384393634.1622550742.1624005988.1624189690.6; __jdc=122270672; mt_xid=V2_52007VwMQW1haWlgYSxxsUmJTRVtcUVdGFh4bCxliARpUQVFQUxtVH1wCZAIaW1tZAg8deRpdBmcfE1VBW1NLH0ESWARsAhpiX2hRahxIH1QAYjMQWl9Y; shshshfp=d971a9ca9226648ae35be91e17883476; ipLoc-djd=17-1381-50712-50817; wlfstk_smdl=fwobglgnpuy0fctfigmtt2kc0z93efpu; TrackID=1jROvkCTpXm2DN_wcuc8AjFyluDo53jyt5RYqAYS6OTFnr5qXgMhE4-Fvpf7HpcnAswDh7QRz8COJ2FoB3mNhsnTrzqOznZf5TrXM8U-K-_SbcAcnrG1kOspC80SZyE2o; thor=9D33544FC7BC50DC3BFF5A02A674C4D4C72329F4972D9460CD5979A28472933D0E495273852F4E5850AF64D3A4CE7EF313064D74BF8EC4C16BBB49AC07427937FA31D2A5511EE6E0E81386B5F1D42081D4C9BB485DC25641F703E87379C636BF1E3B451B7945BAF969425A8F73BA45D177E7A3B810E864C7402324424CB5D74F840162F4982469A91A77C4DA2DC57B32884CF530A32F32471FDE457D63157D93; ceshi3.com=201; __jdb=122270672.8.1384393634|6.1624189690; shshshsID=92eeac190750957144edad7fd8c96ffd_5_1624190862853; 3AB9D23F7A4B3C9B=NTPTDLYF3NV376QRU35AFKBB3TG5RKSHLDCAPU5ZLXHE53ZIYOIYMRSOZT3DZ2JPFYGUH44G6T2UQZCFXEQA6OAY4M','referer':'https://item.jd.com/','user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.77 Safari/537.36 Edg/91.0.864.37',}url_input=input("请输入京东商品网址:")try:result=[]    #筛选过后的评论reason=[]    #统计每个被筛选淘汰的评论的淘汰理由id=''.join(re.findall(r'com/(.*?)\.html',url_input))url='https://club.jd.com/comment/productPageComments.action?callback=fetchJSON_comment98&productId='+str(id)+'&score=0&sortType=5&page=0&pageSize=10&isShadowSku=0&fold=1'print(url)data=requests.get(url,headers=headers).content.decode('gbk')data=data[data.find('{'):data.rfind('}')+1]data=json.loads(data)lastpage=data['maxPage']print('共有'+str(lastpage)+'页评论')threads=[]threads.append(threading.Thread(target=get_information,args=(id,headers,0,lastpage//2,result,reason)))threads.append(threading.Thread(target=get_information,args=(id,headers,lastpage//2,lastpage,result,reason)))# 开启新线程for t in threads:t.start()# 等待所有线程完成for t in threads:t.join()print ("退出主线程")except:print("提取商品网址信息出错,请重新输入京东商品网址:")main()# 创建新线程,分2个线程(太少了速度慢,太快了容易被封)#将筛选后的评论装入文件print("有效评论已装入NEW评论.xlsx文件")print("淘汰评论已装入淘汰评论.xlsx文件")NEW=pandas.DataFrame(result)NEW.to_excel('NEW评论.xlsx')Eliminate=pandas.DataFrame(reason)Eliminate.to_excel('淘汰评论.xlsx')comment_word=''for _comment in result:comment_word+=_comment["评论内容"]all_word=comment_wordcloud_word(comment_word,'comment_word')print("comment云图制作完成")for _comment in reason:all_word+=_comment["评论内容"]cloud_word(all_word,'all_word')print("all_comment云图制作完成")if __name__=='__main__':main()

1、第一阶段——从淘宝爬取到京东爬取

对于实验前半阶段,一直投入于淘宝评论爬取,发现往往对淘宝评论进行一次大量数据爬取后的第二次近时间爬取都会出现报错现象。在发现因淘宝反爬造成的错误和研究如何绕过淘宝反爬措施上花费了大量的时间,尝试过多种不同的方法。

通过查找资料偶然发现京东爬取相对于淘宝较简单,最终放弃淘宝评论爬取,转向京东评论爬取。

2、第二阶段——从低速爬取到高速爬取

对于京东平台大量评论的爬取,其速度较慢,爬取时间较长。为了提高爬取速度,采用多线程进行爬取。但是通过测试发现,多线程爬取容易触发京东反爬机制。

京东评论页仅显示最近100页,对此进行反复测试后发现开启双线程可以在提升爬取速度且可在爬取大量数据时不触发平台反爬措施。

3、第三阶段——筛选有效评论并使其可视化

对京东平台爬取到商品评论进行筛选,将有效评论存入result列表中,将淘汰评论存入reason列表中,并将其可视化输出到excel文档中,同时对商品晒图按照用户ID分类进行存储,将有效评论和淘汰评论制作成词云图输出,进行对比。

4、第四阶段——完善设计

对设计进行完善,撰写设计报告;

其中文件NEW评论.xlsx和淘汰评论.xlsx为excel文件存储有效评论和淘汰评论,stop_words.txt文件为GitHub中下载的断停词文件,all_word.png和comment_word.png分别为全部评论和有效评论制作成的词云图,photo文件夹为爬取的评论晒图,其中子文件夹的命名为晒图评论买家的id号。

三、测试结果

1、对京东某商品进行爬取测试,其链接为https://item.jd.com/10902370587.html,对其id提取后拼接的商品评论链接为:https://club.jd.com/comment/productPageComments.action?callback=fetchJSON_comment98&productId=10902370587&score=0&sortType=5&page=0&pageSize=10&isShadowSku=0&fold=1;

2、将有效评论存入(NEW评论.xlsx)中,对每条评论的ID号、评论时间、评论内容进行记录;淘汰评论存入(淘汰评论.xlsx)中,对每条评论的ID号、评论时间、评论内容以及淘汰理由进行记录;

部分有效评论(NEW评论.xlsx)

部分淘汰评论(淘汰评论.xlsx)

3、制作云图

对筛选的评论集合和筛选后的评论集合制成云图

所有评论生成云图(all_word.png)

有效评论生成云图(comment_word.png)

4、评论晒图放置在文件夹eliminate.py同文件夹/photos/文件夹中

四、自我评价

  1. 通过学习网络爬虫爬取购物平台的评论信息和图片,对爬取的评论进行筛选分类处理后存入两个excel文件中(NEW评论.xlsx和淘汰评论.xlsx);
  2. 对存入的淘汰评论.xlsx文件进行查看,发现其筛选出的评论确实属于注水评论或虚假评论;
  3. 对爬的取所有评论和筛选评论制作成词云进行对比,发现其通过筛选处理后的词云能更好的反映出商品情况;
  4. 对于好评关键词都是本人在测试实验时总结的一些词语,但其数量远远不够,通过增加好评关键词的数目能够精准的提升评论筛选效果,但由于时间有限没有做到大量好评关键词;
  5. 好评关键词大多为鞋服类商品的好评关键字,为彰显设计程序的功能,本人有特意的爬取鞋子类商品,而在其他商品类(如手机类)的筛选效果就显得不佳,其主要原因还是好评关键字词库不够完善;
  6. 对于筛选机制,本人对其整体的筛选机制还是比较满意,但是也有些许缺陷,本程序设置的好评数与评论字数的比例参数、好评数目参数、单个字符重复比例参数均有待调整,当其达到最优参数时能够更好的保证注水评论和虚假评论被筛选出,而有效评论能够保留;
  7. 本程序的参数是本人通过反复测试运行总结出的一些参数,但其未达到最优,本人绝对可以通过深度学习使参数达到最优,但其实现复杂,学习的数据集也较难获得。

仅供学习交流,原创作品,转载请联系作者,侵权必究

详情资源可见资源链接

python设计.zip_Python爬虫采集京东商品评论数据,并做可视化分析-Python文档类资源-CSDN下载

利用python爬取京东平台评论及图片并进行分析相关推荐

  1. Python爬取京东商品评论和图片下载

    Python爬取京东商品评论和图片下载 代码仅供学习使用,切勿扩散并且频繁爬取网站 贴上代码和注释,方便自己下次看 import requests import time import json im ...

  2. Python爬取京东商品评论

    京东商城的页面不是静态页面,其评论信息存放于json文件中,由ajax控制,所以我们在浏览器上看到的网页源代码和用Python爬下来的是不一样的,所以我们真正要爬取的是评论数据所存放的json文件. ...

  3. Python 爬取京东商品评论 + 词云展示

    利用python爬虫爬取京东商品评论数据,并绘制词云展示. 原文链接:https://yetingyun.blog.csdn.net/article/details/107943979 创作不易,未经 ...

  4. Python爬取京东商品评论数据

    一.前言 本文将承接笔者的上篇文章Python爬取京东商品数据,使用京东商品唯一id字段"sku"拼接url,得到真实的京东商品评论网址,进而解释数据并保存到文件中,所爬取到的数据 ...

  5. 利用python爬取京东华为旗舰店手机信息(价格、型号、颜色、链接等)

    目 录 第一章.前言 1.1.效果展示 1.2.需要用到的库 1.3.原理分析 第二章.代码分开讲解 2.1.对象的定义及初始化 2.1.1.第一至二行 2.1.2.第三至四行 2.1.3.第五至六行 ...

  6. 利用scrapy爬取京东移动端的图片素材和商品信息

    有一个练习项目需要一些带分类信息的商品测试图片,从现有的电商网站爬取是个不错的选择.刚好最近又在练习scrapy的使用,这一篇记录一下用scrapy爬取京东的图片素材并保存商品信息的思路. 文中代码共 ...

  7. python怎么爬虎牙_手把手教你利用Python爬取虎牙平台数据

    首先打开我们所需要爬取的网站,这里我们挑选的是虎牙直播. 很多人学习python,不知道从何学起. 很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手. 很多已经做案例的人,却不知道 ...

  8. 利用Python爬取京东商品的一种办法!

    前言 如今的京东.淘宝.天猫等等已经不同往日了, 在用户不登录的情况下, 很难通过技术手段来大规模获取到我们关注的商品信息. 关于京东等购物网站的自动登录也有很多人在做, 但是大厂的反爬能力确实很强, ...

  9. 利用python爬取知乎评论_一个简单的python爬虫,爬取知乎

    一个简单的python爬虫,爬取知乎 主要实现 爬取一个收藏夹 里 所有问题答案下的 图片 文字信息暂未收录,可自行实现,比图片更简单 具体代码里有详细注释,请自行阅读 项目源码: 1 # -*- c ...

最新文章

  1. cisco+路由器+固定外网IP与NAT+设置
  2. 转结构体_golang处理gb2312转utf8编码的问题
  3. 《机器学习与R语言(原书第2版)》一2.3 探索和理解数据
  4. 7-68 阶乘计算 (15 分)
  5. dp 与px互相转换
  6. 如何判断mysql死锁_MySQL 死锁问题分析
  7. QEMU+GDB调试方法
  8. python跳一跳编程构造_python实现微信跳一跳辅助工具步骤详解
  9. java ArrayList集合
  10. 无穷大常量0x7fffffff 0x3fffffff 0x3f3f3f3f
  11. linux里的tree 命令,Linux中tree命令起什么作用呢?
  12. Ontrack易恢复最新版EasyRecovery数据恢复软件功能
  13. 遭遇Trojan.PSW.OnlineGames、Trojan.HiJack.a、Trojan.PSW.ZhuXian.b等
  14. php 正则获取邮箱后缀名,php中邮箱地址正则表达式实现与详解
  15. 据说深圳电子烟工厂生产了全球产量的90%,为了了解一下这个行业,我做了以下分析
  16. 【附章4包装类】包装类的顶级理解
  17. linux命令行python_干货:4 个绝佳的命令行终端程序
  18. 《赢在中国》第三季观后感
  19. vue导入xlsx-style组件报错Can‘t resolve ‘./cptable‘ in ‘xxx\node_modules_xlsx
  20. 【Spring Cloud】 Gateway网关 之 那些好玩的网关过滤器

热门文章

  1. 爱可聆网络电话 v9.1 免费下载
  2. 生容易,活容易,生活不容易!
  3. Pytorch——pytorch的基本数据类型
  4. 猜数字小游戏(随机生成’三剑客‘)
  5. 有了AI智能绘画,我也可以成为绘画大师——全球最大规模中文跨模态生成模型ERNIE-ViLG
  6. 软件实施:别把我想简单了
  7. 干货分享 | 用Pyecharts绘制20钟不同风格的炫酷交互式图表,建议收藏
  8. 微软发布免费的文件恢复工具Windows File Recovery
  9. 这辈子你会遇见谁,早已命中注定
  10. 【Android】自定义View、画布Canvas与画笔Paint