python爬取京东一款手机的评论!零基础入门第一节!

前言

最近做了一个京东手机数据分析,从JD爬了一些手机的数据,这里简单介绍一下爬取手机评论的部分。


一、准备信息

PS:如有需要Python学习资料的小伙伴可以加点击下方链接自行获取

python免费学习资料以及群交流解答点击即可加入

 

首先我们准备的数据有:

  1. 已知手机的id,可以根据京东上一款手机的网址查询得到。
  2. 评论所在的url:

           利用google chrome打开网站,右键“检查”,找到Network选项,然后刷新页面,点击商品评价,等待服务器向页面传递参数。
          找到productPageComments点击,就会在右边Header中找到评论网址。

          同时在header中也有cookie参数,将cookie参数复制到下面的代码相应位置。

将上述参数准备好后,可以运行下面代码

  • 手机id
  • 评论url网址
  • cookie

二、详细代码

#胖虎Johnny
#2020.11.10
import urllib.request
import json
import random
import time as time0
import re,os
import pandas as pd

#设置代理
agents = [
    "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/22.0.1207.1 Safari/537.1",
    "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/19.77.34.5 Safari/537.1",
    "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/535.24 (KHTML, like Gecko) Chrome/19.0.1055.1 Safari/535.24"
]

def product_reviews(product_id = None,p = 0,maxPage = 99):
    root_dir='京东手机评论_详细字典'
    #判断之前是否爬取过这个型号手机的评论(一种型号的手机,颜色和内存不同,但评论共享)
    os.makedirs(root_dir,exist_ok=True)
    phone_list=os.listdir(root_dir)
    phone_txt=str(product_id)+'.txt'
    if phone_txt in phone_list:
        print(product_id)
        return []

    #对每一页循环爬取
    #"maxPage": 45
    k_head=0
    while p<maxPage:
        #所有品牌评论
        #url = 'https://club.jd.com/comment/productPageComments.action?callback=fetchJSON_comment98&productId={}&score=0&sortType=5&page={}&pageSize={}&isShadowSku=0&rid=0&fold=1'
        #只看当前商品的评论
        url=  'https://club.jd.com/comment/skuProductPageComments.action?callback=fetchJSON_comment98&productId={}&score=0&sortType=5&page={}&pageSize={}&isShadowSku=0&fold=1'
        url = url.format(product_id, p,maxPage)
        #print(url)
        # 仿造请求头,骗过浏览器
        #cookie可以查找自己浏览器中的cookie,直接复制过来
        cookie=''
        headers = {
            'User-Agent': ''.join(random.sample(agents, 1)),
            'Referer': 'https://item.jd.com/1981570.html',
            'Cookie':cookie
        }
        # 发起请求
        request = urllib.request.Request(url=url, headers=headers)
        time0.sleep(2.5)
        # 得到响应ti'm
        try:
            content = urllib.request.urlopen(request).read().decode('gbk')
        except:
            print('第%d页评论代码出错' % p)
            p=p+1
            continue
        # 去掉多余得到json格式
        content = content.strip('fetchJSON_comment98vv995();')

        #评论的最大页数
        try:
            maxPage=int( re.findall('"maxPage":(.*?),"',content,re.S)[0] )
        except:
            pass

        try:
            obj = json.loads(content)
        except:
            print('信号不好,再次尝试!')
            print([content])
            print(url)
            continue

        comments = obj['comments']
        # 产品评论总结
        productCommentSummary = obj['productCommentSummary']
        dict_pars_info={}
        # 平均分
        dict_pars_info['平均分'] = str(productCommentSummary['averageScore'])
        # 好评率
        dict_pars_info['好评率'] = str(productCommentSummary['goodRate'])
        # 当前总评论数
        dict_pars_info['当前评论数'] = str(productCommentSummary['commentCount'])
        # 默认评论数
        dict_pars_info['默认评论数'] = str(productCommentSummary['defaultGoodCount'])
        # 追评、好评、中评、差评
        dict_pars_info['追评数'] = str(productCommentSummary['afterCount'])
        dict_pars_info['好评数'] = str(productCommentSummary['goodCount'])
        dict_pars_info['中评数'] = str(productCommentSummary['generalCount'])
        dict_pars_info['差评数'] = str(productCommentSummary['poorCount'])

        if len(comments)>0:
            # print(comments)
            for comment in comments:
                # print(comment)
                name = comment['referenceName']

                id = comment['id']

                con = comment['content']

                time = comment['creationTime']

                img_url = comment['userImageUrl']

                score=comment['score']

                likes=comment['usefulVoteCount']

                replyCount=comment['replyCount']

                try:
                    productColor = comment['productColor']
                except:
                    productColor = ''

                try:
                    productSize = comment['productSize']
                except:
                    productSize = ''

                item = {
                    'name': name,
                    'id': id,
                    'score': score,
                    'con': con,
                    'time': time,
                    'productColor':productColor,
                    'productSize':productSize,
                    'likes': likes,
                    'replyCount': replyCount,
                    'img_url': img_url,
                }
                item.update(dict_pars_info)
                #print(item)
                string = str(item)

                # 1.保存为csv格式
                item_dataframe = pd.DataFrame([item])
                #print(item_dataframe)
                if k_head==0:
                    item_dataframe.to_csv(root_dir+'/%d.csv' % product_id,mode='w',header=True,index=False,encoding='gbk')
                    k_head+=1
                else:
                    item_dataframe.to_csv(root_dir+'/%d.csv' % product_id,mode='a',header=False,index=False,encoding='gbk')

                #2.保存成txt
                fp = open(root_dir+'/%d.txt' % product_id, 'a', encoding='gbk')
                fp.write(string + '\n')
                fp.close()
            print('%s-page---finish(%s/%s)' % (p,p,maxPage))
        else:
            return []
        p=p+1

if __name__ == '__main__':
    phone_id = 100008348542
    product_reviews(product_id=phone_id)

三、结果

       我们将结果保存到csv文件中,同时也保存了一个字典类型的txt文件。数据都储存在当前新建的文件夹下——京东手机评论_详细字典。


可以看到csv中爬取的数据如上图展示,具体参数包括:

  • 评论
  • 评论id
  • 点赞数
  • 手机名称
  • 颜色
  • 版本
  • 用户评分
  • 评价时间
  • 回复数量

       注意,最后八个参数,从中评数开始,一直到最后的默认评论数,都是这一款手机的数据,因此每个csv文件中,最后八个数据是相同的。

四、更多

       上述代码只是针对一款手机,若是想要python更多手机的评论,则需要先爬取每一款手机的id,之后循环对id进行遍历即可。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值