京东评论数据爬取

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()

得到的结果:

  • 9
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
Python是一种高级、通用、解释型的编程语言,由Guido van Rossum于1989年发起,1991年正式发布。Python以简洁而清晰的语法著称,强调代码的可读性和易于维护。以下是Python的一些主要特点和优势: 易学易用: Python的语法设计简单直观,更接近自然语言,使初学者更容易上手。这种易学易用的特性促使了Python在教育领域和初学者中的广泛应用。 高级语言: Python是一种高级编程语言,提供了自动内存管理(垃圾回收)等功能,减轻了程序员的负担,同时具有动态类型和面向对象的特性。 跨平台性: Python具有很好的跨平台性,可以在多个操作系统上运行,包括Windows、Linux、macOS等,使得开发的代码可以轻松迁移。 丰富的标准库: Python内置了大量的模块和库,涵盖了文件操作、网络编程、数据库访问等各个方面。这些标准库使得开发者能够快速构建功能丰富的应用程序。 开源: Python是开源的,任何人都可以免费使用并查看源代码。这种开放性促进了Python社区的发展,使得有大量的第三方库和框架可供使用。 强大的社区支持: Python拥有庞大而活跃的开发社区,这使得开发者可以轻松获取帮助、分享经验,并参与到Python的发展中。 适用于多个领域: Python在各种领域都有广泛的应用,包括Web开发、数据科学、人工智能、自动化测试、网络编程等。特别是在数据科学和人工智能领域,Python成为了主流的编程语言之一。 支持面向对象编程: Python支持面向对象编程,允许开发者使用类和对象的概念,提高了代码的重用性和可维护性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值