技术 | Python从零开始系列连载(二十八)

之前我水平有限,对于淘宝评论这种动态网页,由于数据在网页源码中是找不到的,所以无法抓取数据,只能使用selenium模仿人操控浏览器来抓数据,

优点是可见容易且不宜被淘宝公司封锁;缺点是速度太慢。

经过今天一天的钻研,终于学会分析数据包,而且淘宝评论的数据包都是以json格式传输的。除了学会抓包,还要会从json中提取出想要的评论数据才行。

本文实现难点:

一、分析数据包,找到淘宝评论传输用的网址,分析网址特点

二、如何从找到的数据包中,从json格式内容中得到想要的数据

案例

https://detail.tmall.com/item.htm?id=38975978198&ali_refid=a3_430582_1006:1106461044:N:%E7%94%B5%E5%8A%A8%E7%89%99%E5%88%B7:bfee1d767fa0a91e5e853b29d794c6f2&ali_trackid=1_bfee1d767fa0a91e5e853b29d794c6f2&spm=a230r.1.14.1.R0FzCm

打开该网址,点击评论

如图中红色圈中的评论,分析发现,在网页源码中查找不到。

找啊找,找啊找,圈中的评论就是不在网页源码中。那只有一种可能,在我们看不到的方式传送。

用火狐浏览器,打开开发者工具,点击网络

真的找到了啊

那么接下来我们要知道这个包传递信息的网址

点击消息头,红方框中的请求网址就是这个评论数据包传递的网址

网址如下

https://rate.tmall.com/list_detail_rate.htm?itemId=38975978198&spuId=279689783&sellerId=92889104&order=3&currentPage=1&append=0&content=1&tagId=&posi=&picture=&ua=250UW5TcyMNYQwiAiwTR3tCf0J/QnhEcUpkMmQ=|Um5Ockt+RH9FfEZ6QXpEcCY=|U2xMHDJ+H2QJZwBxX39RaVV7W3UyWzAeSB4=|VGhXd1llXGlTaFJrUW1WbVNnUG1PdkN7TnBNeUxzR3pFeEB/QG44|VWldfS0TMwc4BycbIwMtBn0AbSJNNl87ZBVaMRo6FEIU|VmhIGCIWNgsrFy4XKgo0ATkDIx8mHyICNgs2FioUIBo6DjMOWA4=|V25OHjBVPF07RT5XLgAgFCEUNAgxCDQULRAoHUsd|WGFBET8RMQ02Di4SKhIvDzQJNAoxZzE=|WWBAED5bMlM1SzBZIA4uGy4VNQkxCzISJhwjGCN1Iw==|WmNDEz1YMVA2SDNaIw0tES0QLw8zCzIIKBwmHCMWQBY=|W2JCEjxZMFE3STJbIgwsEicbOwc+AToaJhoiFi0RRxE=|XGVFFTteN1YwTjVcJQsrEisePgI8CDERLRkmEiseSB4=|XWREFDpbJksuYgZvFXUwWjhVPkNtTXZKclJuUWhUdEt2SXRAfCp8|XmdHFzkXNws3Az4eIh4rFDQLNg8xBThuOA==|X2ZGFjgWNgkxDy8TKh8hAT4DOAY9B1EH|QHlZCSdMK09uA3IPdB0zEy8TLRMzDzAFORkmGyAUKx5IHg==|QXlZCSdCK0osUilAORc3Z1ltVHRIdk96LAwxET8RMQ4wBTAOO207|QnpaCiQKKnpDeUFhXWFZYUF4RH1dYVt7R3hNbVFqPBwhAS8BIRgnEywRLHos|Q3pHelpnR3hYZF1hQX9HfV1kRHhFZVFxRGRefkVlXX1EZFp6RWVZeU1tWA4=&isg=Anl5FLTxBcTYINlX61XKverNieN0fW04cSauNZurS6AfIpO049emCPMw0pst&needFold=0&_ksTS=1487675147352_694&callback=jsonp695

看起来网址太长,太复杂(稍安勿躁),那么先复制网址,在浏览器上打开看看是什么东西

复杂的网址中,有些乱七八糟的可以删除,有意义的部分保留。切记删除一小部分后先尝试能不能打开网页,如果成功再删减,直到不能删减。最后保留下来的网址,如下

https://rate.tmall.com/list_detail_rate.htm?itemId=38975978198&spuId=279689783&sellerId=92889104&order=3&callback=jsonp698&currentPage=1

currentPage=1意思是当前页码是第一页。如果改动为currentPage=3表示是第三页。

好了,下面是代码

import requests
import json
import simplejson

headers = {
'Connection': 'keep-alive',
    'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.12; rv:51.0) Gecko/20100101 Firefox/51.0'
}

base_url = 'https://rate.tmall.com/list_detail_rate.htm?itemId=38975978198&' \
'spuId=279689783&sellerId=92889104&order=3&callback=jsonp698'
#在base_url后面添加&currentPage=1就可以访问不同页码的评论

#将响应内容的文本取出
tb_req = requests.get(base_url, headers=headers).text[12:-1]

#将str格式的文本格式化为字典
tb_dict = simplejson.loads(tb_req)

#编码: 将字典内容转化为json格式对象
tb_json = json.dumps(tb_dict, indent=2)   #indent参数为缩紧,这样打印出来是树形json结构,方便直观

#解码: 将json格式字符串转化为python对象
review_j = json.loads(tb_json)

#这里的0是当前页的第一个评论,每页面其实是有20个评论的
print(review_j["rateDetail"]["rateList"][0]['rateContent'])

上面只是抓了一个评论。下面是抓取近100页的网页所有评论,代码如下

import requests
import json
import time
import simplejson

headers = {
    'Connection': 'keep-alive',
    'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.12; rv:51.0) Gecko/20100101 Firefox/51.0'
}
base_url = 'https://rate.tmall.com/list_detail_rate.htm?itemId=38975978198&' \
           'spuId=279689783&sellerId=92889104&order=3&callback=jsonp698'
#在base_url后面添加&currentPage=1就可以访问不同页码的评论

for i in range(2, 98, 1):
    url = base_url + '&currentPage=%s' % str(i)
    #将响应内容的文本取出
    tb_req = requests.get(base_url, headers=headers).text[12:-1]
    print(tb_req)

    #将str格式的文本格式化为字典
    tb_dict = simplejson.loads(tb_req)

    #编码: 将字典内容转化为json格式对象
    tb_json = json.dumps(tb_dict, indent=2)   #indent参数为缩紧,这样打印出来是树形json结构,方便直观
    #print(type(tb_json))

    #print(tb_json)
    #解码: 将json格式字符串转化为python对象
    review_j = json.loads(tb_json)
    for p in range(1, 20, 1):
        print(review_j["rateDetail"]["rateList"][p]['rateContent'])
    time.sleep(1)

好啦,这期的分享先到这里,大家可以按照上面的详细步骤进行练习。加油,我们下周五不见不散~

文章来源:Python爱好者社区

文章编辑:思加

本文分享自微信公众号 - 灯塔大数据(DTbigdata)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-11-09

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏FreeBuf

PTFuzzer:一个基于硬件加速的二进制程序Fuzz工具

PTFuzzer是基于AFL框架实现的一款开源fuzz工具,它采用了Intel Processor Trace硬件部件来收集程序执行的路径信息,改进了原来AFL...

25630
来自专栏木东居士的专栏

从0写一个爬虫,爬取500w好友关系数据

74860
来自专栏葡萄城控件技术团队

Windows 7样式地址栏(Address Bar)控件实现

介绍 从Vista开始,地址栏就有了很大的改变,不知道大家有什么感觉,笔者觉得很方便,同时又兼容之前的功能,是个很不错的创新。不过,微软并不打算把这一很酷的功能...

23660
来自专栏FreeBuf

Retargetable Decompiler 免费的在线反编译引擎

写在前面 其实谁开发了一个反编译引擎跟我们并没有什么关系,但它开放了在线的免费服务就不一样了。 正文 Retargetable Decompiler的主要目的...

604100
来自专栏数据小魔方

左手用R右手Python系列——多进程/线程数据抓取与网页请求

这一篇涉及到如何在网页请求环节使用多进程任务处理功能,因为网页请求涉及到两个重要问题:一是多进程的并发操作会面临更大的反爬风险,所以面临更严峻的反爬风险,二是抓...

35390
来自专栏Spark学习技巧

Hive高级优化

1,FetchTask 不执行mapreduce,提高速度 设置的三种方式: 方法一: set hive.fetch.task.conversion=mo...

52470
来自专栏Golang语言社区

Go 语言编写的缓存及缓存过滤库:groupcache

groupcache 是使用 Go 语言编写的缓存及缓存过滤库,作为 memcached 许多场景下的替代版本。 对比原始 memcached ? 首先,gr...

27440
来自专栏维恩的派VNPIE

vnpy中的EventEngine和MainEngine用法介绍

我准备写一篇vnpy的入门文章,考虑到入门文章如果讲太多内部细节,就会显得特别累赘,所以将细节和用法单独分离出来,写在这里。本文主要介绍了vnpy中的Event...

71350
来自专栏数据科学学习手札

(数据科学学习手札47)基于Python的网络数据采集实战(2)

  马上大四了,最近在暑期实习,在数据挖掘的主业之外,也帮助同事做了很多网络数据采集的内容,接下来的数篇文章就将一一罗列出来,来续写几个月前开的这个网络数据采集...

15840
来自专栏Google Dart

AngularDart4.0 英雄之旅-教程-06服务 顶

不是一遍又一遍复制和粘贴相同的代码,而是创建一个可重用的数据服务,并将其注入到需要它的组件中。 使用单独的服务可使组件保持精简并专注于支持视图,并使用模拟服务对...

8010

扫码关注云+社区

领取腾讯云代金券