Bootstrap

京东评论数据爬取

1.爬前须知

由于网站限制,每个商品只能爬取1000条数据。

2.获取URL

JD京东爬虫-商品评论爬虫-----附源码_京东评论url的json解析-CSDN博客

3.爬虫代码

来源:python爬虫 爬取京东商品评论(争取爬下尽量多的数据) - 知乎 (zhihu.com)

# coding='utf-8'
import requests
import json
import time
import random
import xlwt
import xlutils.copy
import xlrd

def start(page):
    # 获取URL
    #score 评价等级 page=0 第一页 producitid 商品类别
    url = 'https://club.jd.com/comment/productPageComments.action?&productId=100008054085&score=0&sortType=5&page=0&pageSize=10&isShadowSku=0&fold=1'

    # url = 'https://club.jd.com/comment/productPageComments.action?&productId=100016647456&score=0&sortType=5&page=0&pageSize=10&isShadowSku=0&fold=1'
    headers= {
        "User-Agent": "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Mobile Safari/537.36"
    }
    time.sleep(2)
    test = requests.get(url=url, headers= headers)
    data = json.loads(test.text)
    return data
    # 解析页面
def parse(data):

    items = data['comments']
    for i in items:
        yield (
            i['nickname'],#用户名自
            i['id'], #用户id
            i['content'],#内容
            i['creationTime']#时间
        )

def excel(items):
    #第一次写入
    newTable = "test.xls"#创建文件
    wb = xlwt.Workbook("encoding='utf-8")

    ws = wb.add_sheet('sheet1')#创建表
    headDate = ['id', '内容', '时间']#定义标题
    for i in range(0,3):#for循环遍历写入
        ws.write(0, i, headDate[i], xlwt.easyxf('font: bold on'))

    index = 1#行数

    for data in items:#items是十条数据 data是其中一条(一条下有三个内容)
        for i in range(0,3):#列数

            print(data[i])
            ws.write(index, i, data[i])#行 列 数据(一条一条自己写入)
        print('______________________')
        index += 1#等上一行写完了 在继续追加行数
        wb.save(newTable)

def another(items, j):#如果不是第一次写入 以后的就是追加数据了 需要另一个函数

    index = (j-1) * 10 + 1#这里是 每次写入都从11 21 31..等开始 所以我才传入数据 代表着从哪里开始写入

    data = xlrd.open_workbook('test.xls')
    ws = xlutils.copy.copy(data)
    # 进入表
    table = ws.get_sheet(0)

    for test in items:

        for i in range(0, 3):#跟excel同理
            print(test[i])

            table.write(index, i, test[i])  # 只要分配好 自己塞入
        print('_______________________')

        index += 1
        ws.save('test.xls')



def main():
    j = 1#页面数
    judge = True#判断写入是否为第一次写入

    for i in range(0, 100):
        time.sleep(1.5)
        #记得time反爬 其实我在爬取的时候没有使用代理ip也没给我封 不过就当这是个习惯吧
        first = start(j)
        test = parse(first)

        if judge:
            excel(test)
            judge = False
        else:
            another(test, j)
        print('第' + str(j) + '页抓取完毕\n')
        j = j + 1


if __name__ == '__main__':
    main()
    #这个代码仅为全部数据下的评论而已 中差评等需要修改score!

4.实例及结果

爬取商品:完美日记口红

网站:https://item.jd.com/100012348704.html

评论URL:api.m.jd.com/?appid=item-v3&functionId=pc_club_productPageComments&client=pc&clientVersion=1.0.0&t=1709959997004&loginType=3&uuid=181111935.17096300437011266491668.1709630043.1709956123.1709959154.5&productId=100012348704&score=0&sortType=5&page=0&pageSize=10&isShadowSku=0&fold=1&bbtf=&shield=

参考上述代码爬取效果:

共爬取100页。

5.单条评论JSON

{
    "jwotestProduct": null,
    "score": 0,
    "comments": [
        {
            "id": 20503895226,
            "guid": "1a563db923b03d0bcdcc3c42d0f35167",
            "content": "用着挺好的,香气也是挺好闻的。效果也是挺好。\n产品外观:挺不错。\n保湿效果:可以的。\n持久效果:嗯嗯,用着还是挺不错。\n轻薄程度:摸着也是很凉爽的。\n\n膏体气味:沁人心脾,舒服的很!",
            "vcontent": "用着挺好的,香气也是挺好闻的。效果也是挺好。\n{$%&产品外观:&%$}挺不错。\n{$%&保湿效果:&%$}可以的。\n{$%&持久效果:&%$}嗯嗯,用着还是挺不错。\n{$%&轻薄程度:&%$}摸着也是很凉爽的。\n\n{$%&膏体气味:&%$}沁人心脾,舒服的很!",
            "creationTime": "2024-02-23 21:23:38", #评论时间
            "isDelete": false,
            "isTop": false,
            "userImageUrl": "misc.360buyimg.com/user/myjd-2015/css/i/peisong.jpg",
            "topped": 0,
            "replyCount": 0, #回复数量
            "score": 5,  #打分
            "imageStatus": 1,
            "usefulVoteCount": 1, #有用性投票
            "userClient": 4,
            "discussionId": 1467879167,
            "imageCount": 2,
            "anonymousFlag": 1,
            "plusAvailable": 201,
            "mobileVersion": "12.4.0",
            "images": [
                {
                    "id": -1816569352,
                    "imgUrl": "//img30.360buyimg.com/n0/s128x96_jfs/t1/89031/13/43955/22615/65d89c58F5450a35b/2eda674422844065.jpg",
                    "imgTitle": "",
                    "status": 0
                },
                {
                    "id": -1816569351,
                    "imgUrl": "//img30.360buyimg.com/n0/s128x96_jfs/t1/9869/27/23553/37887/65d89c59Feea7278e/413afaccea7b3cfa.jpg",
                    "imgTitle": "",
                    "status": 0
                }
            ],
            "mergeOrderStatus": 2,
            "productColor": "丝绒迷你套组 V01+V02+V07+V08",
            "productSize": "",
            "textIntegral": 20,
            "imageIntegral": 20,
            "ownId": 1000118121,
            "ownType": 0,
            "extMap": {
                "buyCount": 2
            },
            "location": "河南",
            "status": 1,
            "referenceId": "100007191937",
            "referenceTime": "2024-02-18 09:25:56",
            "nickname": "j***a",
            "replyCount2": 0,
            "userImage": "misc.360buyimg.com/user/myjd-2015/css/i/peisong.jpg",
            "orderId": 0,
            "integral": 40,
            "productSales": "[]",
            "referenceImage": "jfs/t1/197438/34/41020/40117/65e97346F1567f5ff/eb72d41533fa2bf4.jpg",
            "referenceName": "完美日记至臻柔色丝绒唇釉V01复古红梨色2.5g口红显白38女神节礼物送女友",
            "firstCategory": 1316,
            "secondCategory": 1387,
            "thirdCategory": 16857,
            "aesPin": null,
            "days": 5,
            "afterDays": 0
        },

score是评论的数据的类型:

  • 0为全部评论
  • 1是差评
  • 2是中评
  • 3是好评
  • 5是追评

6.改进后代码

根据我的数据需求,增加【score】评论类型,增加【imagecount】图片的数量,增加【productColor】消费者购买的产品种类,增加【usefulVoteCount】有用性投票,增加【creationTime】评论时间

另外发现一个问题,源代码没有能够实现翻页的操作,结果是10条重复了100词得到1000条数据,因此我修改了url的格式。此代码爬取的是京东网页中兰蔻口红数据。

url = "https://api.m.jd.com/?appid=item-v3&functionId=pc_club_productPageComments&client=pc&clientVersion=1.0.0\    &t=1709984938800&loginType=3&uuid=181111935.17096300437011266491668.1709630043.1709967471.1709984783.7&productId=100046685764&score=0&sortType=5&page={0}&pageSize=10".format(page)

import requests
import json
import time
import random
import xlwt
from xlutils.copy import copy
import xlutils
import xlrd

def start(page):
    url = "https://api.m.jd.com/?appid=item-v3&functionId=pc_club_productPageComments&client=pc&clientVersion=1.0.0\
    &t=1709984938800&loginType=3&uuid=181111935.17096300437011266491668.1709630043.1709967471.1709984783.7\
    &productId=100046685764&score=0&sortType=5&page={0}&pageSize=10".format(page)

    headers= {
        "User-Agent": "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/53\
        7.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Mobile Safari/537.36"
    }
    
    time.sleep(2)
    test = requests.get(url=url, headers= headers)
    data = json.loads(test.text)
    return data
    
# 解析页面
def parse(data):

    items = data['comments']
    for i in items:
        yield (
            i['nickname'],#用户名自
            i['id'], #用户id
            i['content'],#内容
            i['creationTime'],#时间
            i['score'],#打分
            i['productColor'],
            i['usefulVoteCount']
        )

def excel(items):
    #第一次写入
    newTable = "test.xls"#创建文件
    wb = xlwt.Workbook("encoding='utf-8")

    ws = wb.add_sheet('sheet1')#创建表
    headDate = ['nickname', 'id', 'content','time','score','productcolor','usefulvotecount']#定义标题
    for i in range(0,7):#for循环遍历写入
        ws.write(0, i, headDate[i], xlwt.easyxf('font: bold on'))

    index = 1#行数

    for data in items:#items是十条数据 data是其中一条(一条下有三个内容)
        for i in range(0,7):#列数

            print(data[i])
            ws.write(index, i, data[i])#行 列 数据(一条一条自己写入)
        print('______________________')
        index += 1#等上一行写完了 在继续追加行数
        wb.save(newTable)

def another(items, j):#如果不是第一次写入 以后的就是追加数据了 需要另一个函数

    index = (j-1) * 10 + 1#这里是 每次写入都从11 21 31..等开始 所以我才传入数据 代表着从哪里开始写入

    data = xlrd.open_workbook('test.xls')
    ws = xlutils.copy.copy(data)
    # 进入表
    table = ws.get_sheet(0)

    for test in items:

        for i in range(0, 7):#跟excel同理
            print(test[i])

            table.write(index, i, test[i])  # 只要分配好 自己塞入
        print('_______________________')

        index += 1
        ws.save('test.xls')

def main():
    j = 0#页面数
    judge = True#判断写入是否为第一次写入

    for i in range(0, 100):
        j = j + 1
        time.sleep(1.5)
        first = start(j)
        test = parse(first)
        if judge:
            excel(test)
            judge = False
        else:
            another(test, j)
        print('第' + str(j) + '页抓取完毕\n')
        


if __name__ == '__main__':
    main()

得到的结果:

;