爬取京东iphone8的异步加载评论看看为啥这么多人买

浏览: 5792

前言

最近在备考

好久没更新

从零开始系列已经写到:

Python从零开始系列连载(28)——Python特色数据类型(函数)(下)


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


本想搞个大新闻

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

就放弃了

不过!

还是可以搞个小新闻的

看过我文章的人都知道

我写文章很浅显易懂

喜欢从零开始一步步玩

虽然技术不如各种大V

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

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


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

那个时候

我还是个小白

抱歉

现在还是


不过

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

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


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

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


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

运行环境

Python 3.X


寻找评论信息地址

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


图片.png


图片.png


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


我们点击进去查看详情


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


图片.png

图片.png


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


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


图片.png


然后我们点击第二页


图片.png


再点击第三页


图片.png


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

我们再次点击第一页


图片.png


发现确实如此


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

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


我们先查看源代码

复制一段评论信息

在源代码中查找


图片.png


图片.png


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


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


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


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


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


图片.png


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


图片.png


有图片,js,html


根据我今天的经验


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


图片.png


此时,下面便是一片空白


我们点击评论第二页


图片.png

发现JS中出现了一个内容


我们点击第三页


发现又多出现一个内容


图片.png

我们点开第一个出现的


在Preview中发现了评论的内容


图片.png


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


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


图片.png


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


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


图片.png


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


图片.png


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

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

找到了异步加载评论的url

并且找到了网址变化规律


先爬取一页试试水


做事情不要急功近利

慢慢来

男人不能快


我们复制第一页的url打开


图片.png


图片.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)

我们看到以下信息:


图片.png


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

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

图片.png


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


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


type(res)

显示结果是个list

res

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


图片.png


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


我们将 \\n 去除


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

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


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


图片.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


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


图片.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()

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

图片.png


整个爬取过程大概几分钟

因为有双重循环

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


打开本地的txt文档


图片.png


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


制作评论词云图


导入必要模块

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

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

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


图片.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()

下载方正喵呜体字体

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

将以上参数调好


运行,生成了词云图


图片.png


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


图片.png


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


结语


你看懂了么~


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


图片.png


这是真情实感不是表情包

阿喂,谁扔的鸡蛋!!!


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

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

32 个评论

以后可以试试加上停用词的处理
嗯 我也觉得 不然很多无实际意义的词
写得好详细!已经把京东评论爬下来了!!谢谢~~
大神,为什么我的每个页都出现问题!
具体问题是?
很棒棒!
楼主,有源程序吗??能发下吗
直接复制就行了
太感谢您的教程了,请问有没有爬取京东某一类所有商品的评论的教程~~
你好 你可以在这个基础上探索试试
老师好 请问我在运行这个代码时 这个错误是什么原因
OSError Traceback (most recent call last)
<ipython-input-337-ddc2fe21a74f> in <module>()
----> 1 word_cloud = cloud.generate(cut_text)

E:\anaconda3\lib\site-packages\wordcloud\wordcloud.py in generate(self, text)
568 self
569 """
--> 570 return self.generate_from_text(text)
571
572 def _check_generated(self):
老师,可以再介绍一下怎么安装 wordcloud 模块吗?下载安装老是报错。。谢谢
要看具体的报错信息了 不行就不要在线装 下载之后再装
安装 wordcloud提示如下错误:请老师帮忙给看看 怎么解决。
error: command 'cl.exe' failed: No such file or directory
文件目录写错了
如何去除html标签的内容?还有就是图片和字体放到哪一个默认运行的目录呢?谢谢
for i in res: #这段for代码能实现将html的标签删除掉吗?谢谢
h = re.compile(r'<[^>]+>',re.S)
i = h.sub('',i)
f.write(i)
for i in res:
i = i.replace('\\n','')
#print(i)
f.write(i)
f.write('\n')
对于在list格式的文件中进行替换,上面这些写有什么问题?
你可以运行看看 如果抛出异常 你看看异常的具体信息
大伟老师您好,
不知道为什么我从官网上下的词云import的时候还是会报错
我的代码是:
from wordcloud import WordCloud
报错是:
箭头指向from .query_integral_image import query_integral_image这行
ModuleNotFoundError: No module named 'wordcloud.query_integral_image'
然后我看了一眼源文件,发现后缀是个.c,会不会和这个有关呢。
然后我安装的时候是手动的,把解压的文件放在了site-packages文件夹里面。
后来尝试下自动安装(pip install wordcloud),结果还是报错invalid syntax。
请问应该如何解决呢?
把安装好的包卸载了 然后下载安装包本地安装
跟着老师做了这个例子,也成功的获取到所有信息,中间也没有异常出现,那么我有一个问题:是不是所有的爬虫都是从他的url地址开始的呢,就是说url是爬虫的基础。
我是一个python小白,刚开始学习,见笑了哈!
是的 url 很重要
我生成的词云都是客服的回复。。。
这个一般都是根据爬到的数据生成的
老师,您好,为什么我爬的评论无法写入文件呢?报错信息如下:
UnsupportedOperation Traceback (most recent call last)
<ipython-input-10-c5369ec6f3dc> in <module>()
7 for i in res:
8 i=i.replace('\\n','')
----> 9 f.write(i)
10 f.write('\n')
11 f.close()

UnsupportedOperation: not writable
j6s6

j6s6 回复 j6s6

UnicodeEncodeError Traceback (most recent call last)
<ipython-input-14-05196aa944fa> in <module>()
7 for i in res:
8 i=i.replace('\\n','')
----> 9 f.write(i)
10 f.write('\n')
11 f.close()

C:\ProgramData\Anaconda3\lib\encodings\cp1252.py in encode(self, input, final)
17 class IncrementalEncoder(codecs.IncrementalEncoder):
18 def encode(self, input, final=False):
---> 19 return codecs.charmap_encode(input,self.errors,encoding_table)[0]
20
21 class IncrementalDecoder(codecs.IncrementalDecoder):

UnicodeEncodeError: 'charmap' codec can't encode characters in position 0-2: character maps to <undefined>
f=open('H:/comment_iphone8.txt','a',encoding='utf-8')
你换个文件试试 然后写的时候 文件保持关闭 路径这样写吧:
f=open(r'H:\comment_iphone8.txt','a',encoding='utf-8')
现在只能爬100页了吗?网址页数99打开有内容,到100就没东西了
我在 word_cloud = cloud.generate(cut_text) 出错 OSError: cannot open resource
不知道怎么解决 希望老师帮忙
def getComment(url):
Comment_1Page = []
res = requests.get(url)
jd = json.loads(res.text.lstrip('fetchJSON_comment98vv49037(').rstrip(');'))
for comment in jd['comments']:
Comment_1Page.append(comment['content'])
return Comment_1Page
url = 'https://sclub.jd.com/comment/productPageComments.action?callback=fetchJSON_comment98vv49037&productId=5089269&score=0&sortType=5&page={}&pageSize=10&isShadowSku=0&rid=0&fold=1'
Comment_morePages = []
for i in range(1,10):
urls = url.format(i)
Comment_morePages.extend(getComment(urls))
print(Comment_morePages)
改良的代码 用json包直接提取 大家可以试一下
两个疑问:
1、为什么生成词韵前不把所有重复的评论删掉?请问怎么操作
2、异步评论我记得是可以直接在XHR中找,先清除浏览痕迹,再刷新页面,一般出来的第一个新的就是。

要回复文章请先登录注册