python京东评论
㈠ python使用json爬取京东评论,在浏览器页面的request url 打开是空白的,所以导致No JSON object
json不是一种格式吗,能当爬虫用?你访问的url既然是空白的,那就说明不是这个url,注意找找究竟是哪个url,能访问并且显示想要的内容才是对的。最后就是如果能访问,爬虫却抓取不下来,就得考虑是不是被检测到爬虫了,需要修改请求头部等信息隐藏自身。
㈡ Python爬虫可以爬取什么
Python爬虫可以爬取的东西有很多,Python爬虫怎么学?简单的分析下:
如果你仔细观察,就不难发现,懂爬虫、学习爬虫的人越来越多,一方面,互联网可以获取的数据越来越多,另一方面,像 Python这样的编程语言提供越来越多的优秀工具,让爬虫变得简单、容易上手。
利用爬虫我们可以获取大量的价值数据,从而获得感性认识中不能得到的信息,比如:
知乎:爬取优质答案,为你筛选出各话题下最优质的内容。
淘宝、京东:抓取商品、评论及销量数据,对各种商品及用户的消费场景进行分析。
安居客、链家:抓取房产买卖及租售信息,分析房价变化趋势、做不同区域的房价分析。
拉勾网、智联:爬取各类职位信息,分析各行业人才需求情况及薪资水平。
雪球网:抓取雪球高回报用户的行为,对股票市场进行分析和预测。
爬虫是入门Python最好的方式,没有之一。Python有很多应用的方向,比如后台开发、web开发、科学计算等等,但爬虫对于初学者而言更友好,原理简单,几行代码就能实现基本的爬虫,学习的过程更加平滑,你能体会更大的成就感。
掌握基本的爬虫后,你再去学习Python数据分析、web开发甚至机器学习,都会更得心应手。因为这个过程中,Python基本语法、库的使用,以及如何查找文档你都非常熟悉了。
对于小白来说,爬虫可能是一件非常复杂、技术门槛很高的事情。比如有人认为学爬虫必须精通 Python,然后哼哧哼哧系统学习 Python 的每个知识点,很久之后发现仍然爬不了数据;有的人则认为先要掌握网页的知识,遂开始 HTMLCSS,结果入了前端的坑,瘁……
但掌握正确的方法,在短时间内做到能够爬取主流网站的数据,其实非常容易实现,但建议你从一开始就要有一个具体的目标。
在目标的驱动下,你的学习才会更加精准和高效。那些所有你认为必须的前置知识,都是可以在完成目标的过程中学到的。这里给你一条平滑的、零基础快速入门的学习路径。
1.学习 Python 包并实现基本的爬虫过程
2.了解非结构化数据的存储
3.学习scrapy,搭建工程化爬虫
4.学习数据库知识,应对大规模数据存储与提取
5.掌握各种技巧,应对特殊网站的反爬措施
6.分布式爬虫,实现大规模并发采集,提升效率
一
学习 Python 包并实现基本的爬虫过程
大部分爬虫都是按“发送请求——获得页面——解析页面——抽取并储存内容”这样的流程来进行,这其实也是模拟了我们使用浏览器获取网页信息的过程。
Python中爬虫相关的包很多:urllib、requests、bs4、scrapy、pyspider 等,建议从requests+Xpath 开始,requests 负责连接网站,返回网页,Xpath 用于解析网页,便于抽取数据。
如果你用过 BeautifulSoup,会发现 Xpath 要省事不少,一层一层检查元素代码的工作,全都省略了。这样下来基本套路都差不多,一般的静态网站根本不在话下,豆瓣、糗事网络、腾讯新闻等基本上都可以上手了。
当然如果你需要爬取异步加载的网站,可以学习浏览器抓包分析真实请求或者学习Selenium来实现自动化,这样,知乎、时光网、猫途鹰这些动态的网站也可以迎刃而解。
二
了解非结构化数据的存储
爬回来的数据可以直接用文档形式存在本地,也可以存入数据库中。
开始数据量不大的时候,你可以直接通过 Python 的语法或 pandas 的方法将数据存为csv这样的文件。
当然你可能发现爬回来的数据并不是干净的,可能会有缺失、错误等等,你还需要对数据进行清洗,可以学习 pandas 包的基本用法来做数据的预处理,得到更干净的数据。
三
学习 scrapy,搭建工程化的爬虫
掌握前面的技术一般量级的数据和代码基本没有问题了,但是在遇到非常复杂的情况,可能仍然会力不从心,这个时候,强大的 scrapy 框架就非常有用了。
scrapy 是一个功能非常强大的爬虫框架,它不仅能便捷地构建request,还有强大的 selector 能够方便地解析 response,然而它最让人惊喜的还是它超高的性能,让你可以将爬虫工程化、模块化。
学会 scrapy,你可以自己去搭建一些爬虫框架,你就基本具备爬虫工程师的思维了。
四
学习数据库基础,应对大规模数据存储
爬回来的数据量小的时候,你可以用文档的形式来存储,一旦数据量大了,这就有点行不通了。所以掌握一种数据库是必须的,学习目前比较主流的 MongoDB 就OK。
MongoDB 可以方便你去存储一些非结构化的数据,比如各种评论的文本,图片的链接等等。你也可以利用PyMongo,更方便地在Python中操作MongoDB。
因为这里要用到的数据库知识其实非常简单,主要是数据如何入库、如何进行提取,在需要的时候再学习就行。
五
掌握各种技巧,应对特殊网站的反爬措施
当然,爬虫过程中也会经历一些绝望啊,比如被网站封IP、比如各种奇怪的验证码、userAgent访问限制、各种动态加载等等。
遇到这些反爬虫的手段,当然还需要一些高级的技巧来应对,常规的比如访问频率控制、使用代理IP池、抓包、验证码的OCR处理等等。
往往网站在高效开发和反爬虫之间会偏向前者,这也为爬虫提供了空间,掌握这些应对反爬虫的技巧,绝大部分的网站已经难不到你了.
六
分布式爬虫,实现大规模并发采集
爬取基本数据已经不是问题了,你的瓶颈会集中到爬取海量数据的效率。这个时候,相信你会很自然地接触到一个很厉害的名字:分布式爬虫。
分布式这个东西,听起来很恐怖,但其实就是利用多线程的原理让多个爬虫同时工作,需要你掌握 Scrapy + MongoDB + Redis 这三种工具。
Scrapy 前面我们说过了,用于做基本的页面爬取,MongoDB 用于存储爬取的数据,Redis 则用来存储要爬取的网页队列,也就是任务队列。
所以有些东西看起来很吓人,但其实分解开来,也不过如此。当你能够写分布式的爬虫的时候,那么你可以去尝试打造一些基本的爬虫架构了,实现一些更加自动化的数据获取。
你看,这一条学习路径下来,你已然可以成为老司机了,非常的顺畅。所以在一开始的时候,尽量不要系统地去啃一些东西,找一个实际的项目(开始可以从豆瓣、小猪这种简单的入手),直接开始就好。
因为爬虫这种技术,既不需要你系统地精通一门语言,也不需要多么高深的数据库技术,高效的姿势就是从实际的项目中去学习这些零散的知识点,你能保证每次学到的都是最需要的那部分。
当然唯一麻烦的是,在具体的问题中,如何找到具体需要的那部分学习资源、如何筛选和甄别,是很多初学者面临的一个大问题。
以上就是我的回答,希望对你有所帮助,望采纳。
㈢ 如何用python爬取一个网站的评论数据
假如一个商品全部评论数据为20w+ 默认好评15w+ 这15w+的默认好评就会不显示出来。那么我们可以爬取的数据就只剩下5w+ 接下来 我们就分别爬取全部好评 好评 中评 差评 追加评价 但是就算这些数据加起来 也仍然不足5w+ 上文的博主猜测可能有两点原因:
1.出现了数据造假,这个数字可能是刷出来的
2.真的有这么多的评论,但这时候系统可能只显示其中比较新的评论,而对比较旧的评论进行了存档。
在博主理论的基础上我也进行了很多相应的测试,就是说无论如何 我们最终都爬不到剩下的5w条数据 只能爬取一部分但这一部分数据也将近上千多条 如果有小伙伴能爬取下更多欢迎补充。
整体思路
全部评价 好评 中评 差评 追加评价的网址都是涉及到一定的参数的 只要修改网页的数据 在遍历页码 即可完成全部的爬取。
㈣ python中如何循环给对象的属性赋值
正在做一个京东评论爬虫,几十个字段,按照字段顺序建好表,存储的时候也想到了这个问题,属性一一对应太花时间,类的属性顺序跟返回的json数据key顺序一致,能否循环赋值。经过研究,方法如下。每个人情况不一样,请根据基础随机应变。编辑器不太好用,没缩进。关键是eval()和setattr().广告下自己创建的python技术交流群775648064
从网上获取到的数据resp_str="{'username':'xiaoming', 'password'='123456'}"
resp_dict = eval(resp_str),eval函数转str到dict
classUser():username=Char()password=Integer()
user=User()
foriinresp_dict.key():
setattr(user,i,resp_dict[i])
㈤ 如何用爬虫抓取京东商品评价
如果是爬虫,需要你有专业的能力哦,编程语言的基础,如果用博为小帮就不需要了。
目前很多网页或者 软件的数据采集都在用 小帮软件机器人哦
你是想采集一个类别或者一个产品吧,可以用博 为的小帮 软件机器人来采集哦,需要设置条件,采集什么字段,然后让小帮软件机器人自动运行就好了
㈥ python爬取用户评价的目的与意义
是为了从互联网上抓取对于我们有价值的信息。
比如说:访问天猫的网站,搜索对应的商品,然后爬取它的评论数据,可以作为设计前期的市场调研的数据,帮助很大。
在爬虫领域,Python几乎是霸主地位,虽然C++、Java、GO等编程语言也可以写爬虫,但Python更具优势,不仅拥有优秀的第三方库,还可以为我们做很多的事情,比如:收集数据、数据储存、网页预处理等。
㈦ 茅台最大的消费群体是哪些人
很多人质疑会有多少人购买或消费茅台酒, 想到说不定可以从电商的评论数据来部分解决这一问题,于是就用Python爬取京东商城53度飞天的评论数据,然后大致进行分析一下。
先看一个最后形成的文字云,基本上跟预想中一致,到后面再具体分析。
京东商城的数据显示,53度飞天共有5.2万+评论,好评度98%。由于京东官方限制,抓取到的数据大概从去年11月到现在,将近一千条,不过作为大致的分析应该没问题。所取得的数据大致如下图所示。
看一眼大家的评论先。“礼物“,“藏家里舍不得喝”“过年有酒喝”“喝起来爽”“还没喝”“有酒喝了”,感觉买来自己喝的还是不少的。
1.购买者京东用户等级分布
首先看一下购买茅台者的京东用户等级情况。
去年11月至今,购买者大致呈倒S型分布,1-2月作为传统的春节,出现一个小高潮并不奇怪。年后在4/5月探底之后,购买者数量逐渐攀升,单看八月的数据更是恐怖。8月才过去了2/3多,就达到整个数据的34%。虽然由于京东的限制数据可能有所偏差,但基本的趋势不会差太多。
对于24小时的分布,下午15点出现了一个高潮。推测可能该时间段开始抢购或者有其他的活动。其他的数据基本跟作息时间相一致。
5.评论文本分析
提到茅台,一般会想到什么呢,送礼、请客,预约、抢购,囤货、收藏还是其他什么?从评论数据里也许可以看到一些端倪。
5.1有多少茅台酒用来送礼?
将近4%,不算太多,看看都是怎么说的。
5.2有多少人买来自己喝?
(⊙﹏⊙)b光靠程序筛选果然成了智障,9条数据里有6条是给自己或家里人喝的,剩下三个也是送人。修正后比例大致0.64%。
不过再换换其他关键词呢?试试“好喝”这个词。
这次大部分都符合要求。跟前面加一起大致算2%的比例好了,跟送人的3.85%相比是少了不少。
5.3茅台酒跟节日的关系
大致占到1.5%。过节过年期间买可能是送人也可能是自饮。从这里的数据来看,应该还是自家喝的多一点。
5.4一直缺货要抢购?
占到11%的比例,由于搜索关键词的原因,实际比例可能要更多。
5.5买来都要屯着?
看起来确实有些买来收藏、存着的(还有个要放10年的。。),不过看这比例得打个对折,按4%好了。这其中有收藏的,也有些只是为了多放两年好喝点,二者大致对半。
6.评论云文字图
用jieba进行分词计算权重,然后制成云文字图。
可以看出,评论大致可以分为几类。
第一类是对购物体验的评价。如“正品”“真品”“快递”“信赖”“自营”“放心”等等,这其中很多表达的大概都是对于茅台旗舰店的相对信任,从评论也可以看到,很多评论说真假、检验之类,网上的直营方式应该能在很大程度上解决这一问题。另一方面也说明了茅台的宣传或者透明度还不够。
第二类是是比较多的评论是价格、涨价、抢到、好不容易、预约,也说明茅台之前一段时间的供不应求。
第三类是对于茅台酒本身的评价,如好喝、好酒、味道、口感一类。这一部分人是忠实的茅粉,也是茅台酒消费的中坚力量。
7.总结
总体而言,购买茅台酒的大都是高收入/消费人群,很大一部分属于京东最优质的钻石会员和plus会员。
购买茅台的时间上,节假日相对较多。另一方面跟股市一样,部分人似乎都有追风的嫌疑。
从评论数据来看,买来送人的还是比较多,但相比之下买来自己喝的也不算少了,跟买来送礼的大致比例2:3或1:1(前面的比例本来是2%:3.8%,但是参考后面几个方面自饮的比2%要多)。买来收藏或暂时存着之后喝的也不少,二者比例大致1:1。
㈧ 如何用python爬取一本书的评论用户
京东图书评论有非常丰富的信息,这里面就包含了购买日期、书名、作者、好评、中评、差评等等。以购买日期为例,使用Python + Mysql的搭配进行实现,程序不大,才100行。相关的解释我都在程序里加注了:
fromseleniumimportwebdriver
frombs4importBeautifulSoup
importre
importwin32com.client
importthreading,time
importMySQLdb
defmydebug():
driver.quit()
exit(0)
defcatchDate(s):
"""页面数据提取"""
soup=BeautifulSoup(s)
z=[]
globalnowtimes
m=soup.findAll("div",class_="date-buy")
forobjinm:
try:
tmp=obj.find('br').contents
exceptException,e:
continue
if(tmp!=""):
z.append(tmp)
nowtimes+=1
returnz
defgetTimes(n,t):
"""获取当前进度"""
return"当前进度为:"+str(int(100*n/t))+"%"
#———————————————————————————————————|程序开始|—————————————————————————————————
#确定图书大类
cate={"3273":"历史","3279":"心理学","3276":"政治军事","3275":"国学古籍","3274":"哲学宗教","3277":"法律","3280":"文化","3281":"社会科学"}
#断点续抓
num1=input("bookid:")
num2=input("pagenumber:")
#生成图书大类链接,共需17355*20=347100次
totaltimes=347100.0
nowtimes=0
#开启webdirver的PhantomJS对象
#driver=webdriver.PhantomJS()
driver=webdriver.Ie('C:Python27ScriptsIEDriverServer')
#driver=webdriver.Chrome('C:Python27Scriptschromedriver')
#读出Mysql中的评论页面,进行抓取
# 连接数据库
try:
conn=MySQLdb.connect(host='localhost',user='root',passwd='',db='jd')
exceptException,e:
printe
sys.exit()
# 获取cursor对象
cursor=conn.cursor()
sql="SELECT * FROM booknew ORDER BY pagenumber DESC"
cursor.execute(sql)
alldata=cursor.fetchall()
flag=0
flag2=0
# 如果有数据返回就循环输出,htt/review/10178500-1-154.html
ifalldata:
forrecinalldata:
#rec[0]--bookid,rec[1]--cateid,rec[2]--pagenumber
if(rec[0]!=str(num1)andflag==0):
continue
else:
flag=1
forpinrange(num2,rec[2]):
if(flag2==0):
num2=0
flag2=1
p+=1
link="htteview/"+rec[0]+"-1-"+str(p)+".html"
#抓网页
driver.get(link)
html=driver.page_source
#抓评论
buydate=catchDate(html)
#写入数据库
forzinbuydate:
sql="INSERT INTO ljj (id, cateid, bookid, date) VALUES (NULL, '"+rec[0]+"','"+rec[1]+"','"+z[0]+"');"
try:
cursor.execute(sql)
exceptException,e:
printe
conn.commit()
printgetTimes(nowtimes,totaltimes)
driver.quit()
cursor.close()
conn.close()
京东图书评论有非常丰富的信息,这里面就包含了购买日期、书名、作者、好评、中评、差评等等。以购买日期为例,使用Python + Mysql的搭配进行实现,程序不大,才100行。相关的解释我都在程序里加注了:
fromseleniumimportwebdriver
frombs4importBeautifulSoup
importre
importwin32com.client
importthreading,time
importMySQLdb
defmydebug():
driver.quit()
exit(0)
defcatchDate(s):
"""页面数据提取"""
soup=BeautifulSoup(s)
z=[]
globalnowtimes
m=soup.findAll("div",class_="date-buy")
forobjinm:
try:
tmp=obj.find('br').contents
exceptException,e:
continue
if(tmp!=""):
z.append(tmp)
nowtimes+=1
returnz
defgetTimes(n,t):
"""获取当前进度"""
return"当前进度为:"+str(int(100*n/t))+"%"
#———————————————————————————————————|程序开始|—————————————————————————————————
#确定图书大类
cate={"3273":"历史","3279":"心理学","3276":"政治军事","3275":"国学古籍","3274":"哲学宗教","3277":"法律","3280":"文化","3281":"社会科学"}
#断点续抓
num1=input("bookid:")
num2=input("pagenumber:")
#生成图书大类链接,共需17355*20=347100次
totaltimes=347100.0
nowtimes=0
#开启webdirver的PhantomJS对象
#driver=webdriver.PhantomJS()
driver=webdriver.Ie('C:Python27ScriptsIEDriverServer')
#driver=webdriver.Chrome('C:Python27Scriptschromedriver')
#读出Mysql中的评论页面,进行抓取
# 连接数据库
try:
conn=MySQLdb.connect(host='localhost',user='root',passwd='',db='jd')
exceptException,e:
printe
sys.exit()
# 获取cursor对象
cursor=conn.cursor()
sql="SELECT * FROM booknew ORDER BY pagenumber DESC"
cursor.execute(sql)
alldata=cursor.fetchall()
flag=0
flag2=0
# 如果有数据返回就循环输出,httreview/10178500-1-154.html
ifalldata:
forrecinalldata:
#rec[0]--bookid,rec[1]--cateid,rec[2]--pagenumber
if(rec[0]!=str(num1)andflag==0):
continue
else:
flag=1
forpinrange(num2,rec[2]):
if(flag2==0):
num2=0
flag2=1
p+=1
link="ht.com/review/"+rec[0]+"-1-"+str(p)+".html"
#抓网页
driver.get(link)
html=driver.page_source
#抓评论
buydate=catchDate(html)
#写入数据库
forzinbuydate:
sql="INSERT INTO ljj (id, cateid, bookid, date) VALUES (NULL, '"+rec[0]+"','"+rec[1]+"','"+z[0]+"');"
try:
cursor.execute(sql)
exceptException,e:
printe
conn.commit()
printgetTimes(nowtimes,totaltimes)
driver.quit()
cursor.close()
conn.close()
㈨ Learning Python 第五版 原版 有这么贵么(在京东上300多,600多) 现在最新
中文最新的现在是第四版,没有必要追最新版,服从业务需求来。
㈩ 如何用python获取京东的评论数据
京东商品评论信息是由JS动态加载的,所以直接抓取商品详情页的URL并不能获得商品评论的信息。因此我们需要先找到存放商品评论信息的文件。这里我们使用Chrome浏览器里的开发者工具进行查找。
具体方法是在商品详情页点击鼠标右键,选择检查,在弹出的开发者工具界面中选择Network,设置为禁用缓存(Disable cache)和只查看JS文件。然后刷新页面。页面加载完成后向下滚动鼠标找到商品评价部分,等商品评价信息显示出来后,在下面Network界面的左侧筛选框中输入proctPageComments,这时下面的加载记录中只有一条信息,这里包含的就是商品详情页的商品评论信息。点击这条信息,在右侧的Preview界面中可以看到其中包含了当前页面中的评论信息。(抓取价格信息输入prices)。
复制这条信息,并把URL地址放在浏览器中打开,里面包含了当前页的商品评论信息。这就是我们要抓取的URL地址。
仔细观察这条URL地址可以发现,其中proctId=10001234327是当前商品的商品ID。与商品详情页URL中的ID一致。而page=0是页码。如果我们要获取这个商品的所有评论,只需要更改page后面的数字即可。
在获得了商品评论的真实地址以及URL地址的规律后,我们开始使用python抓取这件商品的700+条评论信息。并对这些信息进行处理和分析。
开始前的准备工作
在开始抓取之前先要导入各种库文件,这里我们分别介绍下需要导入的每个库文件的名称以及在数据抓取和分析中的作用。requests用于进行页面抓取,time用于设置抓取过程中的Sleep时间,random用于生产随机数,这里的作用是将抓取页面的顺序打乱,re用于在抓取后的页面代码中提取需要的信息,numpy用于常规的指标计算,pandas用于进行数据汇总和透视分析,matplotlib用于绘制各站图表,jieba用于对评论内容进行分词和关键词提取。
#导入requests库(请求和页面抓取)
import requests
#导入time库(设置抓取Sleep时间)
import time
#导入random库(生成乱序随机数)
import random
#导入正则库(从页面代码中提取信息)
import re
#导入数值计算库(常规计算)
import numpy as np
#导入科学计算库(拼表及各种分析汇总)
import pandas as pd
#导入绘制图表库(数据可视化)
import matplotlib.pyplot as plt
#导入结巴分词库(分词)
import jieba as jb
#导入结巴分词(关键词提取)
import jieba.analyse
将爬虫伪装成浏览器
导入完库文件后,还不能直接进行抓取,因为这样很容易被封。我们还需要对爬虫进行伪装,是爬虫看起来更像是来自浏览器的访问。这里主要的两个工作是设置请求中的头文件信息以及设置Cookie的内容。
头文件信息很容易找到,在Chrome的开发者工具中选择Network,刷新页面后选择Headers就可以看到本次访问的头文件信息,里面包含了一些浏览器的技术参数和引荐来源信息。将这些信息直接添加到代码中就可以,这里我们将头部信息保存在headers中。
#设置请求中头文件的信息
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11',
'Accept':'text/html;q=0.9,*/*;q=0.8',
'Accept-Charset':'ISO-8859-1,utf-8;q=0.7,*;q=0.3',
'Connection':'close',
'Referer':''
}
在查看头文件信息的旁边还有一个Cookies标签,点击进去就是本次访问的Cookies信息。这里的Cookies信息与前面头文件中的Cookie信息一致,不过这里更加清晰。把Request Cookies信息复制到代码中即可,这里我们将Request Cookies信息保存在Cookie中。
#设置Cookie的内容
cookie={'TrackID':'1_VWwvLYiy1FUr7wSr6HHmHhadG8d1-Qv-TVaw8JwcFG4EksqyLyx1SO7O06_Y_XUCyQMksp3RVb2ezA',
'__jda':'122270672.1507607632.1423495705.1479785414.1479794553.92',
'__jdb':'122270672.1.1507607632|92.1479794553',
'__jdc':'122270672',
'__j':'1507607632',
'__jdv':'122270672|direct|-|none|-|1478747025001',
'areaId':'1',
'cn':'0',
'ipLoc-djd':'1-72-2799-0',
'ipLocation':'%u5317%u4EAC',
'mx':'0_X',
'rkv':'V0800',
'user-key':'216123d5-4ed3-47b0-9289-12345',
'xtest':'4657.553..'}
抓取商品评论信息
设置完请求的头文件和Cookie信息后,我们开始抓取京东商品评论的信息。前面分析URL的时候说过,URL中包含两个重要的信息,一个是商品ID,另一个是页码。这里我们只抓取一个商品的评论信息,因此商品ID不需要更改。但这个商品的评论有700+条,也就是有近80页需要抓取,因此页码不是一个固定值,需要在0-80之间变化。这里我们将URL分成两部分,通过随机生成页码然后拼接URL的方式进行抓取。
#设置URL的第一部分
url1=''
#设置URL的第二部分
url2='&pageSize=10&callback=fetchJSON_comment98vv41127'
#乱序输出0-80的唯一随机数
ran_num=random.sample(range(80), 80)
为了使抓取过程看起来更加随机,我们没有从第1页一直抓取到第80页。而是使用random生成0-80的唯一随机数,也就是要抓取的页码编号。然后再将页码编号与两部分URL进行拼接。这里我们只知道商品有700+的评论,但并不知道具体数字,所以抓取范围定位从0-80页。
下面是具体的抓取过程,使用for循环每次从0-80的随机数中找一个生成页码编号,与两部分的URL进行拼接。生成要抓取的URL地址并与前面设置好的头文件信息和Cookie信息一起发送请求获取页面信息。将获取到的页面信息进行汇总。每次请求间休息5秒针,避免过于频繁的请求导致返回空值。
#拼接URL并乱序循环抓取页面
for i in ran_num:
a = ran_num[0]
if i == a:
i=str(i)
url=(url1+i+url2)
r=requests.get(url=url,headers=headers,cookies=cookie)
html=r.content
else:
i=str(i)
url=(url1+i+url2)
r=requests.get(url=url,headers=headers,cookies=cookie)
html2=r.content
html = html + html2
time.sleep(5)
print("当前抓取页面:",url,"状态:",r)
在抓取的过程中输入每一步抓取的页面URL以及状态。通过下面的截图可以看到,在page参数后面的页码是随机生成的并不连续。
抓取完80个页面后,我们还需要对页面进行编码。完成编码后就可以看到其中所包含的中文评论信息了。后面大部分苦逼的工作就是要对这些评论信息进行不断提取和反复的清洗。
#对抓取的页面进行编码
html=str(html, encoding = "GBK")
这里建议将抓取完的数据存储在本地,后续工作可以直接从本地打开文件进行清洗和分析工作。避免每次都要重新抓取数据。这里我们将数据保存在桌面的page.txt文件中。
#将编码后的页面输出为txt文本存储
file = open("c:\\Users \\Desktop\\page.txt", "w")
file.write(html)
file.close()
读取文件也比较简单,直接open加read函数就可以完成了。
#读取存储的txt文本文件
html = open('c:\\Users\\ Desktop\\page.txt', 'r').read()
提取信息并进行数据清洗
京东的商品评论中包含了很多有用的信息,我们需要将这些信息从页面代码中提取出来,整理成数据表以便进行后续的分析工作。这里应该就是整个过程中最苦逼的数据提取和清洗工作了。我们使用正则对每个字段进行提取。对于特殊的字段在通过替换等方式进行提取和清洗。
下面是提取的第一个字段userClient,也就是用户发布评论时所使用的设备类型,这类的字段提取还比较简单,一行代码搞定。查看一下提取出来的字段还比较干净。使用同样的方法我们分别提取了以下这些字段的内容。
#使用正则提取userClient字段信息
userClient=re.findall(r',"usefulVoteCount".*?,"userClientShow":(.*?),',html)
#使用正则提取userLevel字段信息
userLevel=re.findall(r'"referenceImage".*?,"userLevelName":(.*?),',html)
#使用正则提取proctColor字段信息
proctColor=re.findall(r'"creationTime".*?,"proctColor":(.*?),',html)
#使用正则提取recommend字段信息
recommend=re.findall(r'"creationTime".*?,"recommend":(.*?),',html)
#使用正则提取nickname字段信息
nickname=re.findall(r'"creationTime".*?,"nickname":(.*?),',html)
#使用正则提取userProvince字段信息
userProvince=re.findall(r'"referenceImage".*?,"userProvince":(.*?),',html)
#使用正则提取usefulVoteCount字段信息
usefulVoteCount=re.findall(r'"referenceImage".*?,"usefulVoteCount":(.*?),',html)
#使用正则提取days字段信息
days=re.findall(r'"usefulVoteCount".*?,"days":(.*?)}',html)
#使用正则提取score字段信息
score=re.findall(r'"referenceImage".*?,"score":(.*?),',html)</pre>
还有一些字段比较负责,无法通过正则一次提取出来,比如isMobile字段,有些值的后面还有大括号。这就需要进一步的提取和清洗工作。
#使用正则提取isMobile字段信息
isMobile=re.findall(r'"usefulVoteCount".*?,"isMobile":(.*?),',html)
使用for循环配合替换功能将字段中所有的}替换为空。替换完成后字段看起来干净多了。
#替换掉最后的}
mobile=[]
for m in isMobile:
n=m.replace('}','')
mobile.append(n)
proctSize字段中包含了胸围和杯罩两类信息,为了获得独立的杯罩信息需要进行二次提取,将杯罩信息单独保存出来。
#使用正则提取proctSize字段信息
proctSize=re.findall(r'"creationTime".*?,"proctSize":(.*?),',html)
使用for循环将proctSize中的第三个字符杯罩信息提取出来,并保持在cup字段中。
#提取杯罩信息
cup=[]
for s in proctSize:
s1=s[3]
cup.append(s1)
创建评论的日期信息仅依靠正则提取出来的信息还是比较乱,无法直接使用。因此也需要进行二次提取。下面是使用正则提取出的结果。
#使用正则提取时间字段信息
creationTime1=re.findall(r'"creationTime":(.*?),"referenceName',html)
日期和时间信息处于前20个字符,在二次提取中根据这个规律直接提起每个条目的前20个字符即可。将日期和时间单独保存为creationTime。
#提取日期和时间
creationTime=[]
for d in creationTime1:
date=d[1:20]
creationTime.append(date)
在上一步日期和时间的基础上,我们再进一步提取出单独的小时信息,方法与前面类似,提取日期时间中的第11和12个字符,就是小时的信息。提取完保存在hour字段以便后续的分析和汇总工作。
#提取小时信息
hour=[]
for h in creationTime:
date=h[10:13]
hour.append(date)
最后要提取的是评论内容信息,页面代码中包含图片的评论信息是重复的,因此在使用正则提取完后还需要对评论信息进行去重。
#使用正则提取评论信息
content=re.findall(r'"guid".*?,"content":(.*?),',html)
使用if进行判断,排除掉所有包含图片的评论信息,已达到评论去重的目的。
#对提取的评论信息进行去重
content_1=[]
for i in content:
if not "img" in i:
content_1.append(i)
完成所有字段信息的提取和清洗后,将这些字段组合在一起生成京东商品评论数据汇总表。下面是创建数据表的代码。数据表生成后还不能马上使用,需要对字段进行格式设置,例如时间和日期字段和一些包含数值的字段。具体的字段和格式设置依据后续的分析过程和目的。这里我们将creationTime设置为时间格式,并设置为数据表的索引列。将days字段设置为数值格式。
#将前面提取的各字段信息汇总为table数据表,以便后面分析
table=pd.DataFrame({'creationTime':creationTime,'hour':hour,'nickname':nickname,'proctColor':proctColor,'proctSize':proctSize,'cup':cup,'recommend':recommend,'mobile':mobile,'userClient':userClient,'userLevel':userLevel,'userProvince':userProvince,'usefulVoteCount':usefulVoteCount,'content_1':content_1,'days':days,'score':score})
#将creationTime字段更改为时间格式
table['creationTime']=pd.to_datetime(table['creationTime'])
#设置creationTime字段为索引列
table = table.set_index('creationTime')
#设置days字段为数值格式
table['days']=table['days'].astype(np.int64)
#查看整理完的数据表
table.head()
这里建议再次保存清洗和预处理完的数据表。我们这里将数据表保存为csv格式。到了这一步可以选择在Excel中完成后续的数据分析和可视化过程,也可以继续在python中完成。我们这里选择继续在python中完成后续的数据分析和可视化工作。
#保存table数据表
table.to_csv('jd_table.csv')
数据分析及可视化
分月评论数据变化趋势
首先查看京东商品评论的时间变化趋势情况,大部分用户在购买商品后会在10天以内进行评论,因此我们可以近似的认为在一个月的时间维度中评论时间的变化趋势代表了用户购买商品的变化趋势。