我把整个代码都托管在github上了,那里面有详细的api说明文档
https://github.com/hao297531173/JDCommentSpider/tree/master
PS:获取的数据仅供学习交流使用
那么我们就开始吧
没图说个球,先来看一下最后的分析得到的图表
评论关键词词云
PS:由于网络不好和穷,所以这个用户满意度的数据量很小,不代表真实的用户满意度
有关代码API和目录结构的信息我都写在github上了,这里主要说一下具体的爬虫思路
使用的依赖库
python 3.6
selenium python自动化测试框架
bs4 BeautifulSoup html元素提取器
jieba jieba分词器
wordcloud 词云
matlibplot 2D绘图库
pyecharts 图表库
以及nlp在线分析网站 boson
boson的开发者文档 戳 https://bosonnlp.com/dev/center
使用代码前请安装谷歌浏览器和webdriver.py, webdriver.py需要放在python根目录下的Lib文件夹下
先来看一下boot.py(相当于mian函数)
"""
这个文件相当于main函数
"""
import getCommnetInfo
import JDCommentSpider
import analysis
def main(goodsName=[]):
#先爬取评论数据,并且提取数据,再获取情感分析数据
for i in range(5, len(goodsName)):
spider = JDCommentSpider.CommentSpider(goodsName[i])
spider.getSku(60)
spider.getCommentRun(10, 500)
comm = getCommnetInfo.getCommentInfo(goodsName[i])
comm.run()
ana = analysis.Analysis(goodsName[i])
ana.run(2)
ana.getCloudWrod()
#然后把平均价格和平均差评画出来
ana = analysis.Analysis("")
ana.getBarImage()
ana.getSaticfaction()
ana.getSatic()
if __name__ == "__main__":
goodsName=["小米手机", "华为", "oppo", "锤子", "苹果手机", "魅族"]
main(goodsName=goodsName)
goodsName为传参的列表,填入你想要搜索的关键词,也就在京东搜索页面上搜索到的关键词,戳https://search.jd.com/Search?keyword=%E5%B0%8F%E7%B1%B3%E6%89%8B%E6%9C%BA&enc=utf-8&wq=%E5%B0%8F%E7%B1%B3sho&pvid=00e6c420b1a34e65825880d7b9e381a7
这个是小米手机的示例url,经过尝试之后可以发现,重要的参数只有keyword enc 和 page
这里url被加密了,你用浏览器访问后会看的比较清楚,我们想要搜索什么关键字只要在keyword后面填入这个字符串就行了,enc=utf8 是必要的,不然会出现乱码,page从1开始,每翻一页都会加2
加下来看爬虫的主程序
这个程序的主要逻辑就是先在搜索页面上找到商品sku数据,使用浏览器的F12开发人员工具可以很容易的找到
对了忘记说了,selenium使用教程在这 https://www.cnblogs.com/hanxiaobei/p/6108677.html
使用pip安装selenium 在cmd 中输入 pip install selenium
这是我百度来的,你也可以百度其他的教程
那么怎么获取指定标签的属性信息呢,我们就用到bs4 库了
BeautifulSoup的教程在这 https://www.jianshu.com/p/9c266216957b
为什么要获取sku数据呢,来看一下商品详情页的url https://item.jd.com/8514651.html
有没有发现什么神奇的地方, 没错,https://item.jd.com/ 后面拼接上商品的sku信息就得到商品详情页的url了
所以我们需要先获取商品的sku信息,然后再依据这些sku信息逐个访问商品详情页,然后再进行爬取处理
评论数据还是通过BeautifulSoup库来爬取的,所以一定要先把BeautifulSoup学会了
接下来我们进入到商品详情页面,我们先来寻找评论的标签,还是用同样的方法
哈哈,这就找到了,用同样的方法把他爬取出来
哦,对了,这里还有一个问题,就是JD商城有ajax加载的内容,所以我们在每次爬取之前需要等待一下,这里就用到了selenium的等待的方法,详细教程戳 https://blog.csdn.net/g123ggf/article/details/77776113
到这里你差不多就把爬虫的方法学会了,学累了?放松一下
好,我们来看一下爬虫主程序的代码(有点长,请耐心一点看)
"""
这个文件用于在京东商品详情页面上爬取商品信息和用户评论
"""
#coding:utf-8
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from bs4 import BeautifulSoup
import time
import os
import json
"""
CommentSpider 提供的接口
getSku 根据关键字获取在京东上搜索的商品sku信息,并且写入txt
getCommentRun 根据输入数据获取number个商品信息,每个商品commentNum个评论
getCommentAssign 根据给定的goodSku信息获取商品评论,获取commentNum个评论
"""
class CommentSpider:
"""
这个类包含了从搜索商品的sku到爬取信息的全部方法
"""
"""
构造函数
初始化浏览器对象
@:param goodsName 想要搜索的商品名称 如 小米
"""
def __init__(self, goodsName):
self.goodsName = goodsName
self.browser = webdriver.Chrome()
self.filePath = "%sdata_sku"%(self.goodsName)
exist = os.path.exists((self.filePath))
if not exist:
os.makedirs(self.filePath)
#用于储存商品信息的字典
self.dict = {}
#商品页的基础url
self.itemUrl = "https://item.jd.com/"
"""
析构函数
关闭浏览器对象
"""
def __del__(self):
try:
self.browser.quit()
except:
print("已经成功退出浏览器...")
"""
等待模块加载函数,供 getSku和getNextPage方法调用
"""
def getWait(self):
#所有class是gl-item的元素
locator = (By.CLASS_NAME, "gl-item")
#执行滑动到底部的js代码
try:
js = "var q=document.documentElement.scrollTop=100000"
self.browser.execute_script(js)
time.sleep(5)
except:
print("执行滑动js语句失败...")
#执行等待元素加载的js语句
try:
#timeout时间是20, 每隔0.5秒就检查一次
ele = WebDriverWait(self.browser, 20, 0.5).until(EC.presence_of_all_elements_located(locator))
except:
print("等待加载模块运行失败...")
"""
getNextPage 获取下一页面的data-sku信息,供getSku方法调用
@:param nextUrl 下一个页面的url
@:param number 还需要爬取的商品数量
@:return 1 爬取结束
@:return 2 还需要再爬取下一个页面信息
"""
def getNextPage(self, nextUrl, number):
#geturl
self.