基于python和selenium爬取JD商城商品信息并且分析用户对于产品的满意程度

我把整个代码都托管在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.
  • 2
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值