爬取淘宝商品评论

咳咳咳咳。。。。。。这两天支气管炎快把我咳废了。躺在宿舍简直废人一个。

丧够了,继续开始修行之路。

今天打算爬淘宝评论,有了之前的爬取拉勾网的经历,淘宝的评论抓包还是挺快的(再不济也有了这么多革命先辈做过)

思路:
抓包得到评论内容,获取内容,解析,存储。

1.抓包
首先打开淘宝,随便选择一个商品,


image.png

打开谷歌浏览器开发者工具,network


戏精.jpg

看到没有,都是戏精,买个东西也不忘各种晒自拍的。。。

我们选中最后一项,然后点击下一页,监听器中可以看到,在我们刚刚选中的那一项后面有新的数据加载


image.png

我们点击此项数据,在右边控制台切换到preview选项看看这项数据具体是什么:


image.png

可以看到,这确实是我们需要的评论数据包。再次检验一下,复制URL到浏览器中,看到确实显示出评论内容,只不过看着比较混乱。
image.png

image.png

在这里可以与之前做拉勾网的职位爬取做比较,之前做拉勾网的职位爬取我直接复制URL到浏览器中打开,发现返回的是:

{"success":false,"msg":"您操作太频繁,请稍后再访问","clientIp":"........."}

但是做淘宝评论抓取缺可以直接在浏览器中看到内容,估计是拉勾网在重定向这一方面做的反爬手段吧~

抓取到评论的数据包的过程很顺利,那是因为我知道淘宝将评论数据放在js格式类型的数据包里(看了很多先辈们做的项目都是在这个类型 的数据包里的),直接用谷歌浏览器监听过滤功能,配合“评论”下一页,可以很方便抓出来。

有了URL我们就开始爬取了吗?我们看一下这个URL有什么特征:

https://rate.taobao.com/feedRateList.htm?auctionNumId=543187943309&userNumId=39600061&currentPageNum=2&pageSize=20&rateType=&orderType=sort_weight&attribute=&sku=&hasSku=false&folded=0&ua=098%23E1hvGQvRvPpvUpCkvvvvvjiPPL5h0jDUP25OtjnEPmPv6jYERsdvsjYERLMv6jlWRLyCvvpvvvvvCQhvCli4zYGwiSJjvpvhvvpvvvGCvvpvvvvvuphvmvvv92mVnn%2FBkphvC99vvOC0BbyCvm9vvvvvphvvvvvvvZivpv9Jvvmm86Cv2vvvvUUdphvUkQvv9krvpvkbmphvLCm%2BSQvj8YeYiXhpVj%2BO3w0x9CyOJ9kx6acEn1vDN%2B1lYE7reB60kE0x6Bh78BLw1nsOHF%2BSBiVvQRA1%2B2n79WFhT2eAnhjEKOmxdX%2BCvpvVvvpvvhCvRphvCvvvvvm5vpvhvvmv9u6CvvyvmEOVO0Wvx2eCvpvW7D%2Bm9WMw7DiwdCfNRphvCvvvvvv%3D&_ksTS=1515162260611_2160&callback=jsonp_tbcrate_reviews_list

唯一的特征就是又臭又长。。。仔细看里面有个地方“currentPageNum=2”,这么明显的标志,再看一下谷歌浏览器network-headers选项,


image.png

那么可以基本肯定这应该是评论页数。我们来验证一下,把“currentPageNum=2”后面的内容删除,然后把剩下的链接用浏览器打开


image.png

image.png

嘿嘿,小婊砸,果然是你。有了这个特点,我们后面做URL遍历的时候就很方便啦。
  1. 获取内容:

接下来,关门!放postman!
经过postman处理的代码稍作修改,完成获取内容这一步。

import requests
import simplejson,json
url = "https://rate.taobao.com/feedRateList.htm?auctionNumId=543187943309&userNumId=39600061&currentPageNum=1"

headers = {
    'Accept-Language': "zh-CN,zh;q=0.9",
    'Connection': "keep-alive",
    'Cookie': "miid=5498010791881776165; cna=ykKTEh6RZi4CAbfr/zUHyzGp; hng=CN%7Czh-CN%7CCNY%7C156; thw=cn; uc3=sg2=BqOzr3VRqemQxT6rFOPO029vdWzpcVxe9goSnc8n1j4%3D&nk2=1CAgilEIiCaNwf6YM5FKRw%3D%3D&id2=UondHc0wkc5lYw%3D%3D&vt3=F8dBzLWl9Zps%2BjMcJpA%3D&lg2=U%2BGCWk%2F75gdr5Q%3D%3D; uss=W5jADjjt95OdzIVPo9doybvcVSm5NNDyPYRsBBn0hIglQncZyrTv5Giw; lgc=%5Cu98CE%5Cu4E00%5Cu6837%5Cu7684%5Cu7537%5Cu5B501011; tracknick=%5Cu98CE%5Cu4E00%5Cu6837%5Cu7684%5Cu7537%5Cu5B501011; t=bcd14e57056d006066b2794f896e391d; _cc_=UIHiLt3xSw%3D%3D; tg=0; mt=ci=-1_0; cookie2=2d868c2735e38701038fab91603b5723; v=0; _tb_token_=e748e65bbbba5; uc1=cookie14=UoTdfkrAKuAGWA%3D%3D; x=e%3D1%26p%3D*%26s%3D0%26c%3D0%26f%3D0%26g%3D0%26t%3D0%26__ll%3D-1%26_ato%3D0; isg=Atvb5EfQBS2P0HkEpt2pWWr0aj-FGO_cZgdBf80YJlosrPqOVYHkAu5qMjrZ",
    'Host': "rate.taobao.com",
    'Referer': "https://item.taobao.com/item.htm?spm=a219r.lm895.14.27.6bd930168mjmQW&id=543187943309&ns=1&abbucket=2",
    'User-Agent': "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36",
    'Cache-Control': "no-cache",
    }

res = requests.get(url, headers=headers)
  1. 解析内容:

哦豁,淘宝的评论,在谷歌浏览器preview里明明很标准的,层级结构也明显的呀,然而对获取的response对象转化成的text,直接调用json()方法,然后抽取其中的['content']:

js = res.json()
print(js['comments'][0]['content'])

天真的我以为和拉勾网一样,这样就能愉快而优雅又不会尴尬地拿到数据,结果执行起来给我来个JSONdecoError:


image.png

将response对象转换为str类型再调用json():

js = res.text.json()
print(js['comments'][0]['content'])
image.png

字符串类型数据不能调用json(),错的更离谱啦。

找了半天也没有看到解决方法。开始怀疑是不是返回的response不是标准的json格式的数据。印象中json格式的数据类似于字典,由大括号{}给包起来的键值对,我看看评论页内容:


image.png

这个小括号是什么鬼????
试试看去掉小括号再提取内容,不过在提取前还是要先将str类型转化为dict类型数据:

#正则表达式去掉小括号
re_json = re.findall(r'{\"qnaDisabled\":.*?\"maxPage\":5}', res.text, re.S)

#将str类型数据转化为dict类型
json_data = json.loads(re_json)

print(json_data['comments'][0]['append']['content'])
image.png

可以正确返回文本(哇,大兄弟脾气有点大哦)

顺利将页面数据转化成标准的json格式,那我们提取数据就肥肠方便了。这里我先提取以下几个内容:

info_list = ['用户名', '评论日期', '评论内容', '追加评论', '商品信息']

我们打开刚刚淘宝评论页面:


image.png

我们用开发者工具-network-评论的json数据包-preview:


image.png

点开comments:
image.png

20条评论,我们打开其中一条看看我们要的 '用户名', '评论日期', '评论内容', '追加评论', '商品信息' :


image.png

image.png

总之,能找到对应的键值对就行,很方便。提取内容代码如下:
def parse_data(i, json_data):
    content_list = []
    content_list.append(json_data['comments'][i]['user']['nick'])
    content_list.append(json_data['comments'][i]['date'])
    content_list.append(json_data['comments'][i]['content'])

    if json_data['comments'][i]['append']:
        content_list.append(json_data['comments'][i]['append']['content'])
    else:
        content_list.append('无追加评论')
        # continue
    content_list.append(json_data['comments'][i]['auction']['sku'])
    return content_list
  1. 最后下一个main函数,同时调用以上两个函数,并且实现存储数据在Excel中。
def main():

    #把所有的评论放到同一个列表内:
    info_list = ['用户名', '评论日期', '评论内容', '追加评论', '商品信息']
    page = 1
    #实现简单的判断,如果有数据则继续执行以下代码,知道所有评论能够被爬取完毕。
    while get_data(page):
        for i in range(0, 20):
            info_list = info_list + parse_data(i, get_data(page))
        print("拿到第%r页评论" % page)
        page += 1
        # time.sleep(3)
    #把大列表切割成小列表,方便存储
    save_list = [info_list[n: n + 5] for n in range(0, len(info_list), 5)]

    #将评论写入Excel表格中
    book = xlwt.Workbook()
    sheet1 = book.add_sheet('taobaocontent.xls', cell_overwrite_ok=True)
    j = 0
    for list in save_list:
        k = 0
        for param in list:
            sheet1.write(j, k, param)
            k += 1
        print("写完第%r条评论"%j)
        j += 1

    print("全部完成!")
    book.save("content_taobao.xls")

main()

代码运行后发现,只能存到第一页和第二页的数据,


image.png

之后的页数,只能保存到后两项:


image.png

试着把所有信息在控制台打印出来,发现其实是可以返回全部评论的,但是不知道为什么不能存到表格里,而且很奇怪的是,为什么只能存一页多点???
全部代码如下:
# -*- coding: utf-8 -*-
import requests, json, re, xlwt

def get_data(page):
    url = "https://rate.taobao.com/feedRateList.htm?auctionNumId=543187943309&userNumId=39600061&currentPageNum=" + str(page)
    headers = {
        'Accept-Language': "zh-CN,zh;q=0.9",
        'Connection': "keep-alive",
        'Cookie': "miid=5498010791881776165; cna=ykKTEh6RZi4CAbfr/zUHyzGp; hng=CN%7Czh-CN%7CCNY%7C156; thw=cn; uc3=sg2=BqOzr3VRqemQxT6rFOPO029vdWzpcVxe9goSnc8n1j4%3D&nk2=1CAgilEIiCaNwf6YM5FKRw%3D%3D&id2=UondHc0wkc5lYw%3D%3D&vt3=F8dBzLWl9Zps%2BjMcJpA%3D&lg2=U%2BGCWk%2F75gdr5Q%3D%3D; uss=W5jADjjt95OdzIVPo9doybvcVSm5NNDyPYRsBBn0hIglQncZyrTv5Giw; lgc=%5Cu98CE%5Cu4E00%5Cu6837%5Cu7684%5Cu7537%5Cu5B501011; tracknick=%5Cu98CE%5Cu4E00%5Cu6837%5Cu7684%5Cu7537%5Cu5B501011; t=bcd14e57056d006066b2794f896e391d; _cc_=UIHiLt3xSw%3D%3D; tg=0; mt=ci=-1_0; cookie2=2d868c2735e38701038fab91603b5723; v=0; _tb_token_=e748e65bbbba5; uc1=cookie14=UoTdfkrAKuAGWA%3D%3D; x=e%3D1%26p%3D*%26s%3D0%26c%3D0%26f%3D0%26g%3D0%26t%3D0%26__ll%3D-1%26_ato%3D0; isg=Atvb5EfQBS2P0HkEpt2pWWr0aj-FGO_cZgdBf80YJlosrPqOVYHkAu5qMjrZ",
        'Host': "rate.taobao.com",
        'Referer': "https://item.taobao.com/item.htm?spm=a219r.lm895.14.27.6bd930168mjmQW&id=543187943309&ns=1&abbucket=2",
        'User-Agent': "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36",
        'Cache-Control': "no-cache",
        }
    res = requests.get(url, headers=headers).text
    # print(res)
    #去掉小括号
    re_json = re.findall(r'{\"qnaDisabled\":.*?\"maxPage\":\w+}', res, re.S)[0]
    # print(re_json)
    #转化为dict格式
    json_data = json.loads(re_json)
    return json_data

def parse_data(i, json_data):
    content_list = []
    content_list.append(json_data['comments'][i]['user']['nick'])
    content_list.append(json_data['comments'][i]['date'])
    content_list.append(json_data['comments'][i]['content'])

    if json_data['comments'][i]['append']:
        content_list.append(json_data['comments'][i]['append']['content'])
    else:
        content_list.append('无追加评论')
        # continue
    content_list.append(json_data['comments'][i]['auction']['sku'])
    return content_list

def main():

    #把所有的评论放到同一个列表内:
    info_list = ['用户名', '评论日期', '评论内容', '追加评论', '商品信息']
    page = 1
    while get_data(page):
        for i in range(0, 20):
            info_list = info_list + parse_data(i, get_data(page))
        print("拿到第%r页评论" % page)
        page += 1
        # time.sleep(3)
    #把大列表切割成小列表,方便存储
    save_list = [info_list[n: n + 5] for n in range(0, len(info_list), 5)]

    #将评论写入Excel表格中
    book = xlwt.Workbook()
    sheet1 = book.add_sheet('taobaocontent.xls', cell_overwrite_ok=True)
    j = 0
    for list in save_list:
        k = 0
        for param in list:
            sheet1.write(j, k, param)
            k += 1
        print("写完第%r条评论"%j)
        j += 1

    print("全部完成!")
    book.save("content_taobao.xls")

main()

留坑。先吃饭。。。。。

有缘人看到,烦请指点一二,感激不尽。

2018/01/08 23:58 更新:
原来代码是没有问题的,是Excel的问题。请教了同学,他那边可以正常写入数据,我这边坑爹的用的是WPS。。。。。(哪个给老子装的啊喂!!好像是某角坝实习的时候李某某用老子的电脑一直吵着office用不惯然后给老子改了。。。。。)用office打开显示有数据缺失,但是无法修复。用的07版,明天下载新的看看。

应该,大概,可能,也许,希望,最好,可以解决问题,,,,,,的吧?

2018/01/09 22:00更新:
下了office2013,测试爬取前两页发现可以写入Excel,欣喜若狂,打算让程序一直跑把这件商品的评论信息爬完,后来计算了一下,一秒爬一条这效率,完成差不多要8个小时。

另:测试爬取前30页发现还是有大部分内容未写进Excel里面(微笑脸)
总结:office2016不要安装精简版!office2016不要安装精简版!office2016不要安装精简版!

去系统之家下载,有破解版!

完。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,826评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,968评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,234评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,562评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,611评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,482评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,271评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,166评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,608评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,814评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,926评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,644评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,249评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,866评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,991评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,063评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,871评论 2 354

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,656评论 18 139
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,103评论 4 62
  • 我脑海中的萧红,大概就是电影《黄金时代》中汤唯饰演的萧红的样子。虽然,相貌平凡的萧红远不如现实中大气优雅的文艺女神...
    一首肆夏阅读 968评论 3 10
  • 爱情是酒,容易醉,醉了却不容易睡,真正的酒,却是醉意阑珊易入眠。然而,谁能陪我喝一杯?发现只有影相随。形影相吊说的...
    艾小墨阅读 721评论 6 1
  • 恰当岁日纷纷落,天宝瑶花助物华。在漫天灰蒙蒙如仙气笼罩的城市边缘,我逃出雾霾,又幸运地遇到了如霰粒般飞泻而下...
    云紫烟阅读 335评论 2 3