爬取近万条京东iphone8的异步加载评论

浏览: 1813

本文作者:数据取经团 - 王大伟

前言

好久没写爬虫类的文章了,时间长了,生疏了

本想搞个大新闻

然后忙了一天没怎么有空坐在电脑前

就放弃了

不过!

还是可以搞个小新闻的

看过我文章的人都知道

我写文章很浅显易懂

喜欢从零开始一步步玩

虽然技术不如各种大V

虽然我名字透露着我可能是个隐藏的大V

不过尽量让不懂的人看懂文章并且能实现

以前尝试爬取京东商品信息

那个时候

我还是个小白

抱歉

现在还是

不过

今天我尝试着发现了京东商品评论信息的爬取方式

并且一步步实践出来了...

每次Iphone出新的机型,总能在网上引起轩然巨浪

所以,我就拿前段时间火热的Iphone8下手了

划重点:今天我不加表情包,一鼓作气写完!!!

运行环境

Python 3.X

寻找评论信息地址

我们打开京东商城,搜索iphone8

image.png

iphone8虽然买不起,但是看看也欢迎

我们点击进去查看详情

往下翻,找到商品评价,点击

image.png

image.png

不仅有评论,而且还有追评,一般追评比较可信(毕竟好不好,用过了才知道!)

我们翻到最后,注意一下网址(url)

image.png

再点击第三页

image.png

发现第二页和第三页的网址是一样的,我们可以推测,访问第一页评论的网址也可以和2,3一样

我们再次点击第一页

image.png

发现确实如此

对于这种网站要爬取信息是比较难的(评论翻页,但是网址不变)

可能评论信息是异步加载,需要抓包找到位置

我们先查看源代码

复制一段评论信息

在源代码中查找

image.png

我们可以查找到本页的评论

我们翻到第二页,查看源代码,发现评论信息还是第一页的信息

想想,网址没变,所以内容不变很正常,但是评论信息明明改变了啊

我们按下F12,进入浏览器的开发者模式(我用的是谷歌浏览器)

我们点击刷新网页,然后如下图红框所示将保存日志信息勾选上

image.png

可以看到左下角加载了很多内容

image.png

有图片,js,html

根据我今天的经验

我们将All切换到JS,之后点击禁止符号,意思是clear清除原有信息

image.png

此时,下面便是一片空白

我们点击评论第二页

image.png

发现JS中出现了一个内容

我们点击第三页

发现又多出现一个内容

image.png

我们点开第一个出现的

在Preview中发现了评论的内容

image.png

那怎么找到这个JS文件的网址呢?

很简单,我们从Preview切换到Headers

image.png

将这里的请求网址复制,在浏览器打开

此时,我们可以看到评论信息

image.png

我们将之前出现的两个JS文件的Headers里的url都复制到word中

image.png

通过对比发现,他们几乎一样,除了page的参数

此时我们一大难题已经解决

找到了异步加载评论的url

并且找到了网址变化规律

先爬取一页试试水

做事情不要急功近利

慢慢来

男人不能快

我们复制第一页的url打开

image.png

image.png

这应该是个json文件,可以用其特殊方法提取信息

不过,作为爬虫小白

我还是喜欢正则表达式

简单粗暴

我们查找发现,每条评论前面都是  "content":" 

而评论信息以  ","creationTime" 结尾   或者更简单    以  ","  结尾也是ok

我们开始写爬虫

导入必要的模块

import re
import pandas as pd
import requests

使用requests请求访问网址

response = requests.get("https://club.jd.com/comment/productPageComments.action?callback=fetchJSON_comment98vv4962&productId=5089225&score=0&sortType=5&page=0&pageSize=10&isShadowSku=0&rid=0&fold=1")
response = response.text
print(response)

我们看到以下信息:

image.png

我们使用正则将所有信息提取出来,并且打印

pat = '"content":"(.*?)","'
res = re.findall(pat,response)

for i in res:
   print(i)

image.png

其实,以上评论每条都是重复一次的,追评只有一个,至于原因,时间太短没法考究

我们继续,查看一下res的类型

type(res)

显示结果是个list

res

在查看res内容时候,发现有  \\n

image.png

作为一个爬虫小白&数据分析小白,也是懂得要简单的数据清洗

我们将 \\n 去除

for i in res:
   i = i.replace('\\n','')
   print(i)

注意:对列表不能直接使用replace()方法,而是通过循环对其每个元素(字符串)使用

此时每条评论信息就好看多了

image.png

爬取多页评论

会爬取一页评论 + 找到了多页规律 = 会爬取多页评论

f = open('f:/comment_iphone8.txt','a')
for i in range(0,720):#720
   response = requests.get('https://club.jd.com/comment/productPageComments.action?callback=fetchJSON_comment98vv4962&productId=5089225&score=0&sortType=5&page='+str(i)+'&pageSize=10&isShadowSku=0&rid=0&fold=1')
   response = response.text
   #print(response)
   pat = '"content":"(.*?)","'
   res = re.findall(pat,response)
   for i in res:
       i = i.replace('\\n','')
       #print(i)
       f.write(i)
       f.write('\n')
f.close()

以上代码解释:以追加方式打开(新创建)一个txt文件用于存放评论信息

爬取720页评论信息(这么多页是我试出来的总评论大概页码)

通过page = 的不同,构造url

之后的爬取过程和之前一样

注意在写入一条评论之后,写入一个回车换行

最后关闭txt

在爬取过程中,出现了问题

image.png

这种主要是网站发现了爬虫,屏蔽了

可以采用代理ip,模拟浏览器解决

这里都不涉及,我们加一个异常处理

当出现问题,打印出现问题的页码,并且开始下一次循环

f = open('f:/comment_iphone8_.txt','a')
for i in range(0,720):#720
   try:
       response = requests.get('https://club.jd.com/comment/productPageComments.action?callback=fetchJSON_comment98vv4962&productId=5089225&score=0&sortType=5&page='+str(i)+'&pageSize=10&isShadowSku=0&rid=0&fold=1')
       response = response.text
       #print(response)
       pat = '"content":"(.*?)","'
       res = re.findall(pat,response)
       for i in res:
           i = i.replace('\\n','')
           #print(i)
           f.write(i)
           f.write('\n')
   except:
       print('爬取第'+str(i)+'页出现问题')
       continue
f.close()

结果显示,只有其中两页出了问题

image.png

整个爬取过程大概几分钟

因为有双重循环

所以代码的时间复杂度是n^2

打开本地的txt文档

image.png

已经可以看到评论保存在本地了

制作评论词云图

导入必要模块

from os import path
from scipy.misc import imread
import matplotlib.pyplot as plt
import jieba
from wordcloud import WordCloud

注意,如果没安装 jieba 和 wordcloud 模块请自行安装

我们以苹果的logo作为背景轮廓(保证白色部分不会出现词云)

image.png

图名为iphone8_.jpg,图片要放在默认运行文件夹

f = open('f:/comment_iphone8_.txt','r')
text = f.read()

cut_text = ' '.join(jieba.lcut(text))
print(cut_text)
color_mask = imread("iphone8_.jpg")
cloud = WordCloud(
   font_path='FZMWFont.ttf',  # 字体最好放在与脚本相同的目录下,而且必须设置
   background_color='white',
   mask=color_mask,
   max_words=200,
   max_font_size=5000
)
word_cloud = cloud.generate(cut_text)
plt.imshow(word_cloud)
plt.axis('off')
plt.show()

下载方正喵呜体字体

字体可以网上下载,也要放在默认运行文件夹

将以上参数调好

运行,生成了词云图

image.png

从词云图可以看出,从 手机不错、好看、喜欢、手感等有实际意义的词 可以看出iphone8还是很受欢迎的(不受欢迎怎么会有这么多评论,汗)

image.png

这篇写的很啰嗦,特别是寻找url地址和规律部分


结语

你看懂了么~

写完本文,我只想说一句发自内心的话

image.png

这是真情实感不是表情包

阿喂,谁扔的鸡蛋!!!

文章如有不妥指出,望各位大佬留言评论指出。


推荐 0
本文由 数据取经团 创作,采用 知识共享署名-相同方式共享 3.0 中国大陆许可协议 进行许可。
转载、引用前需联系作者,并署名作者且注明文章出处。
本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责。本站是一个个人学习交流的平台,并不用于任何商业目的,如果有任何问题,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

1 个评论

京东评论有个maxpage=100的限制,好像超过就了就无法抓取了喔

要回复文章请先登录注册