Python爬取京东商品评论数据

Python爬取京东商品评论数据,第1张

Python爬取京东商品评论数据 一、前言

本文将承接笔者的上篇文章Python爬取京东商品数据,使用京东商品唯一id字段“sku”拼接url,得到真实的京东商品评论网址,进而解释数据并保存到文件中,所爬取到的数据将可以用于后续的统计分析或更深层次的挖掘分析。

二、爬取步骤详解

1、找到真实的url
所有的爬虫都是要靠真实的url去获取并解析数据,京东商品评论数据网址是做了一定的反爬措施的。以“华为手机”为搜索关键字为例,点击任意一个华为手机,进入该手机的详情页面,继续点击“商品评价”,随便复制一句评论数据,右键查看网页源代码,Ctrl+F打开搜索框,粘贴刚才复制的评论数据,发现并没有找的该数据。

这时候就需要立刻打开浏览器调试工具了,右键点击“检查“”即可,打开调试工具之后,依次按下图点击。

然后继续找到“商品评论”并点击,好评、中评、差评。

点击完之后,经自己一个个网址查看,我们找到了https://club.jd.com/comment/productPageComments.action?callback=fetchJSON_comment98&productId=100011762575&score=0&sortType=5&page=0&pageSize=10&isShadowSku=0&fold=1这个网址有我们需要的数据。

2、分析网址参数
找到真实的url后,我们还不能直接下结论其就是真实的url,复制该url,打开新链接,发现数据还是我们刚才调试时看到的额数据,证明了我们找到了真实的url。

开始分析url参数,很明显,“callback=fetchJSON_comment98”为回调函数,我们发现上图中也有该数据,对于这类参数,可以直接删除。

删除该参数之后,重新刷新网址,发现该数据在源数据已经消失了,说明该参数并不影响我们爬取数据。
继续分析,我们发现“score=0”,如果掌握基本英文知识,很容易猜到“score=”后的数字表示评论数据分类,经笔者分析,0表示全部评论,1、2、3分别表示差评、中评、好评的评论,由于全部评论中包含部分差中好评论,本文只爬取这差中好三类数据。
接着分析该url参数,显而易见,“productId=”后的一串数据即为商品的唯一id,对应商品列表页sku字段。至此,我们已经找到了构造真实url的参数,下面开始写代码爬取。

三、完整代码 1、导入所需包
import requests
import json
import time
import re
import random
import pandas as pd
from faker import Faker
from multiprocessing import Pool
import os
from openpyxl import Workbook, load_workbook

from python爬虫.爬虫项目 import random_ip
ip = random_ip.dailiips()

其中,json用于解析Json格式数据,faker用于生成随机浏览器请求头,multiprocessing为多进程相关模块,最终两行为笔者的的代理IP生成模块。免费的代理IP对京东来说作用不大,大家可以直接忽视该参数。
2、创建保存数据的文件

try:
    wb = load_workbook(filename='京东双十一华为手机评论信息.xlsx')
    sheet = wb.active
except:
    wb = Workbook()
    sheet = wb.active  # 激活工作簿
    sheet.title = '京东双十一华为手机评论信息'  # 设置工作簿名称
    # 设置表头
    sheet['A1'] = 'title'
    sheet['B1'] = 'user_id'
    sheet['C1'] = 'creationTime'
    sheet['D1'] = 'score'
    sheet['E1'] = 'content'

以上代码的意思是若没有“京东双十一华为手机评论信息.xlsx”文件,就直接创建该文件,有则直接打开文件。

3、基本配置
headers = {
    'User-Agent': Faker().chrome(),
    'Referer': 'https://item.jd.com/100011386554.html'
}

base_url = 'https://club.jd.com/comment/productPageComments.action?&productId=100011177233&score=1&sortType=5&page=1&pageSize=10&isShadowSku=0&fold=1'

主要是构造请求头和base网址,方便后续使用。

4、主体爬虫代码
def get_comment_id(start, end):
    '''
    读取京东商品的商品标题和sku(sku暂不知晓,记为商品评论唯一id)
    :param start: 开始的索引
    :param end: 结束的索引
    :return: 标题、skus列表
    '''
    df = pd.read_excel(r'C:UsersHTHDSDesktoppythonpython爬虫爬虫项目京东双十一华为手机信息.xlsx')
    names = df['name'][start:end]
    skus = df['sku'][start:end]
    return names, skus

def get_maxpage(sku):
    '''
    获取每类评论(好评、中评和差评)的最大页数
    :param sku: 商品评论唯一id
    :return:
    '''
    global base_url
    maxpagelist = []
    for score in [1, 2, 3]:
        url = base_url.replace('score=1', f'score={score}').replace('productId=100011177233', f'productId={sku}')
        print(url)
        response = requests.get(url, proxies=random_ip.dailiips(), headers=headers).text
        html = response
        json_data = json.loads(html)
        maxpagelist.append(int(json_data['maxPage']))
    return maxpagelist

def get_url(score, page, sku, title):
    '''
    获取每页评论的评论数据
    :param score: 评论类别
    :param page: 页码
    :param sku: 商品唯一id
    :param title: 标题
    :return: 获取到的评论数据
    '''
    global base_url
    print('正在爬取第{}页,id={}'.format(page, os.getpid()))
    url = base_url.replace('page=1', f'page={page}').replace('score=1', f'score={score}').replace('productId=100011177233', f'productId={sku}')
    data_list_list = get_comment(url, headers=headers, title=title)  # 调用采集方法
    return data_list_list

def get_comment(url=None, headers=None, title=''):
    '''
    采集评论数据
    :param url: 评论链接
    :param headers: 请求头
    :param title: 标题
    :return: 获取到的评论数据
    '''
    data_list_list = []
    response = requests.get(url, proxies=random_ip.dailiips(), headers=headers).text
    html = response
    json_data = json.loads(html)
    comment = json_data['comments']
    for data in comment:
        user_id = data['id']   # 评论用户id
        creationTime = data['creationTime']   # 评论时间
        content = data['content'].strip()   # 评论文本
        content = re.sub('n','',content)
        score = data['score']  # 评分
        data_item = [title, user_id, creationTime, score, content]
        data_list_list.append(data_item)
        print(data_item)
    return data_list_list

def write_comment(data_list_list=None):
   for data in data_list_list:
       sheet.append(data)

以上即为主体的京东商品评论爬取代码,爬取逻辑是先获取商品标题和sku,然后获取每类评论的最大页数,接着拼接真实的url,解析数据后并添加到到Excel文件中,其中write_comment可以合并到解释数据中,笔者这样写只是让爬取过程更清晰,方便理解代码。

5、开启爬虫程序
def main():
    start = time.time()
    # 创建10个进程
    pool = Pool(10)
    names, skus = get_comment_id(13, 14)
    for name, sku in zip(names, skus):
        print(name)
        sp = get_maxpage(sku)
        for s, v in enumerate(sp):
            for p in range(int(v)):
                pool.apply_async(get_url, args=(s+1, p, sku, name), callback=write_comment)
                time.sleep(random.randint(5, 8))
        time.sleep(random.randint(60, 80))
    pool.close()  # 无任务就关闭所有子进程
    pool.join()  # 子进程未结束阻止主进程执行下面程序
    wb.save(filename='京东双十一华为手机评论信息.xlsx')
    end = time.time()
    print('此次爬完数据用时:', (end-start))


if __name__ == '__main__':
    main()

main函数里主要是构建起整个爬虫的过程,若读者还未了解过Python多进程相关的知识,建议先把该方面的知识补全再来看代码的运行逻辑。但尽管本文用到了多进程的爬取方式,但并没有发挥多大作用,京东在访问的时间限制上做的比较严格,不如直接用单线程爬取。

6、结果

爬取到的部分数据如下:

本文完成了京东商品评论数据的爬取全过程,其中有些细节笔者可能没有讲到,这需要大家自己动手实践,提升自己的爬虫能力与效率。申明:本文爬取京东商品仅为技术交流,建议不可过快过多爬取京东的网页数据,以免造成不必要的麻烦!

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5624871.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-15
下一篇 2022-12-15

发表评论

登录后才能评论

评论列表(0条)

保存