京东手机评论爬虫

cover

所用工具

  • Chrome 版本 72.0.3626.109(正式版本) (64 位)
  • Python 3.5.2 :: Anaconda 4.2.0 (64-bit)

数据采集

确定待采集数据

对评论所含内容进行简单的分析,初步确定所需要抓取的内容。首先,在京东商城手机信息界面的用户评价中含有昵称、会员等级、评价星级,评价内容、手机型号、购买时间等等。

其中通过分析会员等级与购买的关系,可以给为不同会员提供不同的产品做参考。分析评价内容可以大概可以推断出消费者对该产品的态度、以及哪些回复关注度比较高等等。分析购买时间可以了解到消费者集中的购买时间段。这些分析对商品广告的精准投放以及为消费者提供更个性化的服务提供了重要参考

确定采集对象

选择按评论数降序排列的手机型号,选择Apple iPhone 8 Plus(A1864) 64GB的评论数据进行采集

采集准备

(robots协议说明:robots是网站对爬虫的限定规则,它规定了那些爬虫可以爬,那些数据可以爬)

因此在采集之前,查看京东商城的robots协议,如下图

1551319945219

参考robots协议规则

User-agent: 指定对哪些爬虫生效
Disallow: 指定不允许访问的网址
Allow: 指定允许访问的网址

通过分析robots协议的内容,而下面即将采集的目录在根目录的comment的子目录下,不涉及到用户的个人隐私,因此可以继续进行采集。

但是在采集过程中,添加sleep函数,既为了防止频繁访问ip被封,也防止高频度访问对网站带来的负荷。

开始采集数据

分析网页

首先选择一款评论数目多的手机,按照评论数降序排列

1551163850458

点击进入手机信息页面,在默认手机参数选择下

按F12打开调试界面,打开network面板并在过滤器中填入“comment”,如下图1551164094744

此时,点击商品评价,筛选到如下结果

1551164279099

含有pageComment字段的即为服务器返回的页面评论数据,右键该文件->copy->Copy link address复制url并在url地址栏进行访问。访问结果如下图

1551164441005

可以很容易的看到,服务器返回给页面的数据是JSON格式的数据。

可以先使用JSON在线编辑器进行json解析,在解析时发生错误,这是由于页面的数据的头部和尾部有一些其他的字符使得页面内容不完全是json数据,去掉第一个’(‘以及其之前的字符,同时去掉最后一个’)'以及其之后的字符即可。整理之后的结果如下图1551164892027

从图中可以清楚的看到,评论共有100页,每页的comment有10条。单独点开其中一条评论数据如下图

1551164975991

可以清楚的看到我们所需要的数据。

那么新的问题来了,京东界面所写评论有163万+条,那其他的数据都去哪了?查看一下第100页后面,看有没有发现

1551165225666

看了之后才发现,还有114万+用户给了默认评价,为了分析更准确,加上这部分数据(其实点开也就100页,其他的可能服务器就没留着)。按照同样得方式,获取这部分评论的通用url1551165875856

尽管如此,也才仅有1500条左右的数据,不过在评论的菜单中还有追评、好评、中评、差评等,把这些也算进来,对比比较差异

1551167389012

发现不同评价的score不同,综合大约有4000~5000条数据

继续统计手机不同参数所含的评论。在这里我将手机颜色从“金色”改为了“深空灰色”,按照同样的方式查看url。并与之前获取的进行对比。如下图

1551166489422

对比之后发现,不同颜色的产品ID(productid)发生了变化。但其实评论区域还是各种颜色都有,所以这也是手机评论数据,只不过为了美观,在每次更改手机参数选择时进行了刷新(动态生成)。

根据这些url参数,就可以尽可能多的爬取该款手机的评论数据,具体代码请移步JDComment_Spider,里面的SpiderScript是一个完整的京东评论爬虫脚本,并且采用了随机浏览器和延时访问来防止爬虫被封,为了获取完整的数据,加入了try…except防止程序中断崩溃。

思考

​ 经过上面的分析,可以看到数据量非常有限,远远没有达到163万条。经分析,有以下两种可能:

  1. 出现了数据造假,这个数字可能是刷出来的(机器或者水军)
  2. 真的有这么多的评论,但这时候系统可能只显示其中比较新的评论,而对比较旧的评论进行了存档。

拓展采集

通过采集之后发现京东的评论数据没有达到要求,于是到淘宝上看同款产品的评价进行搜集。

1551336637383

能找到包含json格式的评论数据,但是使用python进行访问时,却没有跳转到应该有的数据界面,而且跳到了其他界面,如下图

1551336746478

这意味着,没有登陆授权,无法查看评论信息(上面能看到评论信息,也是因为事先登陆过了)。因此只能采取selenium模拟浏览器行为来先登录,然后再获取这部分评论信息。

python+selenium+webdriver的探索及问题:

通过一系列的碰壁探索,发现selenium无法绕过淘宝登陆界面的验证,淘宝网应该是有识别自动化脚本登陆的反爬机制,根本无法获取登陆状态,无法登陆。

通过伪造请求头来获取淘宝数据:

登陆淘宝后,在淘宝主界面刷新,来获取登陆的cookies信息,如下图

1552033319705

随后用这部分cookies来构造请求头,如下图所示

1552033572299

这样,就能访问淘宝上需要登陆才能获取的页面信息,不过当你尝试就会发现,即使这样,在短时间连续访问多次,也很容易被检测到,从而限制页面的获取数量。我使用该爬虫在不同的时间段爬了六七次,每次requests到第17次就会出错了,有待完善。详细代码见淘宝数据爬取 (预览不了的可以下载看)。

参考:

搞定python多线程和多进程

JSON在线编辑器

Python爬虫,抓取淘宝商品评论内容

Python入门网络爬虫之精华版

Selenium Python文档:四、元素定位

为何大量网站不能抓取?爬虫突破封禁的6种常见方法

处理Jupyter Notebook报错:IOPub data rate exceeded

  • Copyright: Copyright is owned by the author. For commercial reprints, please contact the author for authorization. For non-commercial reprints, please indicate the source.
  • Copyrights © 2015-2024 YuleZhang's Blog
  • Visitors: | Views:

请我喝杯咖啡吧~

支付宝
微信