编写爬虫分析商品评论内容

最近看上一款很时尚的水杯,我要买的初衷就是因为杯子好看,但是我也很注重杯子的质量,比如是否有异味等。这款商品在淘宝上的评论有十几万条,里面掺杂着各种各样的评价,这么多评论一条一条的看显然是个笨方法,我的需求很简单,就是想马上知道这么多评论里究竟有多少人评论有异味。如果质量不过关,我马上换其他商品,这样可以节省我的购物时间。
作为一只程序猿,这种体力劳动当然是要用编程来解决了,只需要写一个爬虫并且分析评论内容即可。

非常中意这款水杯,除了这几种款式还有其他的风格可以选择并且可以免费刻字,颜值已经达到了我的要求,就看质量如何了。我的目的就一个,编写程序来自动分析评论内容,得到我想要的结果,然后决定买不买。

编程的最终目的就是为了解决生活中的实际问题,让计算机代替人类去做一些重复性的工作。

在编写工具程序时,我用的最多的是Python,毋庸置疑他是目前用来编写工具程序效率最高的语言之一。
Python凭借着简洁的语法和强大的第三方库,在运维、机器学习、以及自动化领域有着非常广泛的应用。

使用Python编写自动化程序有很多种方式,比如我之前用WebDriver库来控制浏览器进行自动化操作,这种方式基本上可以说是很暴力,一般的反爬虫手段对这种方法都没有很好的解决方案,因为他的的确确是真的浏览器在操作,不过WebDriver一般用来做浏览器端的自动化测试。爬虫程序一般是自己构造一个客户端去做网络请求,使用专门的库去做数据的获取和解析操作,比如XPath等。有些网页是通过ajax等方式来异步加载数据的,这时候就要分析并找出网页数据的调用接口,然后再用自己的程序去自动化调用。

通过分析淘宝的宝贝链接和评论页面的数据获取可以发现淘宝是采用异步调用数据的,返回的数据是json格式,所以这里用不到XPath,只需要调用接口并且解析json即可。

要做的步骤

  1. 编写爬虫根据宝贝链接爬取评论数据并保存到本地文件
  2. 分析评论数据里面的关键字得到感兴趣的内容

不说废话,上代码
新建一个分析淘宝商品评论的工具类 taobao.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
import requests
import json


# 获取商品评论
def get_commodity_comments(order_url, file_name):
# 获取商品评论信息,解析json数据
response_content = requests.get(order_url)
response_json = json.loads(response_content.text.strip().strip('()'))
# 商品评论条数
total = response_json['total']
# 当前评论所在页数
page = 1
# 当前评论所在行数
count = 0
# 打开指定文件,准备将请求到的数据写入到文件中
file = open(file_name, 'w')
while count < total:
res = requests.get(order_url[:-1] + str(page))
page = page + 1
response_json = json.loads(res.text.strip().strip('()'))
comments = response_json['comments']
if comments is None:
return total
for common_item in comments:
file.writelines(common_item['user']['nick'] + '评论:' + common_item['content'])
count = count + 1
# 关闭文件流
file.close()
return total


# 分析评论,统计关键字在评论里出现的次数
def analysis_commodity(file_name, key):
file = open(file_name, 'r')
content = file.read()
return content.count(key)


def select_keyword_count(commodity_link, key_word):
# 获取链接中的商品id
order_id = commodity_link[commodity_link.find('&id=') + 4:]
# 根据商品id,查询评论接口
order_url = 'https://rate.taobao.com/feedRateList.htm?auctionNumId=' + order_id + '&currentPageNum=1'
# 获取商品评论,保存到指定文件,并且返回商品条数
total = get_commodity_comments(order_url, order_id + '.txt')
# 根据关键字分析评论,得出分析结果
keyword_count = analysis_commodity(order_id + '.txt', key_word)
return total, keyword_count

新建一个demo.py 用来测试刚刚写的工具类

1
2
3
4
5
6
7
8
9
10
11
12
13
import taobao

if __name__ == '__main__':

# 商品链接
commodity_link = 'https://detail.tmall.com/item.htm?spm=a220o.1000855.1000983.1.301635bfuvpObC&id=557148927006'

# 要查询的评论关键字
key_word = '有异味'

# 执行查询返回结果
total, keyword_count = taobao.select_keyword_count(commodity_link, key_word)
print('您选择的宝贝共有', str(total), '条评论', '其中有' + str(keyword_count), '人评论', key_word)

运行程序,程序根据商品链接中的商品id作为文件名,将评论数据写入了文件中。
程序再次读入文件中的评论数据,对关键字进行统计。

通过控制台可以看到当前商品评论中有异味的有85条。
然而简单的字符统计无法应对中华文化的博大精深, 有异味前面如果加个,那就变成了没有异味这完全是相反的意思。这是一个包含关系,当前的结果里面可能包含了没有异味的评论。

这里本应该用到机器学习,但是在自然语言处理方面微软早已做了很多年了,对个人来说自己去训练数据集去理解用户的语义的成本是相当大的,TensorFlow我接触的不多,机器学习方面我可以说是一个小白,目前没有能力去写出这样一个卷积算法。不过如果就针对目前这当个词法而言却变得不那么复杂,完全可以通过程序多重判断来得出大致的结论。这里目前占时就low一点,修改关键词为没有异味再运行一次程序,然后把有异味减去没有异味,最后的结果就是有异味的评论。

可以看到没有异味的有80条评论,所以真正评论有异味的评论条数为 85-80=5

看一个商品的用户评价的时候,过多的关注正面评价一般没有多大意义,有可能很多是刷的虚假信息,但是负面评价一般是真实的用户评论,排除竞争对手的恶意评论,基本上只有用户在使用过程中遇到问题,很生气的情况下才会特意来对商品进行负面的评论,所以当喜欢一个商品要购买时,就尽可能多的在负面评论中参考,看看自己对这个东西的喜欢是否打过他的缺点。

经过统计,在122650条评论中只有5个人说杯子有异味,所以三个字 买买买!

0%