咳咳咳咳。。。。。。这两天支气管炎快把我咳废了。躺在宿舍简直废人一个。
丧够了,继续开始修行之路。
今天打算爬淘宝评论,有了之前的爬取拉勾网的经历,淘宝的评论抓包还是挺快的(再不济也有了这么多革命先辈做过)
思路:
抓包得到评论内容,获取内容,解析,存储。
1.抓包
首先打开淘宝,随便选择一个商品,
打开谷歌浏览器开发者工具,network
看到没有,都是戏精,买个东西也不忘各种晒自拍的。。。
我们选中最后一项,然后点击下一页,监听器中可以看到,在我们刚刚选中的那一项后面有新的数据加载
我们点击此项数据,在右边控制台切换到preview选项看看这项数据具体是什么:
可以看到,这确实是我们需要的评论数据包。再次检验一下,复制URL到浏览器中,看到确实显示出评论内容,只不过看着比较混乱。
在这里可以与之前做拉勾网的职位爬取做比较,之前做拉勾网的职位爬取我直接复制URL到浏览器中打开,发现返回的是:
{"success":false,"msg":"您操作太频繁,请稍后再访问","clientIp":"........."}
但是做淘宝评论抓取缺可以直接在浏览器中看到内容,估计是拉勾网在重定向这一方面做的反爬手段吧~
抓取到评论的数据包的过程很顺利,那是因为我知道淘宝将评论数据放在js格式类型的数据包里(看了很多先辈们做的项目都是在这个类型 的数据包里的),直接用谷歌浏览器监听过滤功能,配合“评论”下一页,可以很方便抓出来。
有了URL我们就开始爬取了吗?我们看一下这个URL有什么特征:
https://rate.taobao.com/feedRateList.htm?auctionNumId=543187943309&userNumId=39600061¤tPageNum=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选项,
那么可以基本肯定这应该是评论页数。我们来验证一下,把“currentPageNum=2”后面的内容删除,然后把剩下的链接用浏览器打开
嘿嘿,小婊砸,果然是你。有了这个特点,我们后面做URL遍历的时候就很方便啦。
- 获取内容:
接下来,关门!放postman!
经过postman处理的代码稍作修改,完成获取内容这一步。
import requests
import simplejson,json
url = "https://rate.taobao.com/feedRateList.htm?auctionNumId=543187943309&userNumId=39600061¤tPageNum=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)
- 解析内容:
哦豁,淘宝的评论,在谷歌浏览器preview里明明很标准的,层级结构也明显的呀,然而对获取的response对象转化成的text,直接调用json()方法,然后抽取其中的['content']:
js = res.json()
print(js['comments'][0]['content'])
天真的我以为和拉勾网一样,这样就能愉快而优雅又不会尴尬地拿到数据,结果执行起来给我来个JSONdecoError:
将response对象转换为str类型再调用json():
js = res.text.json()
print(js['comments'][0]['content'])
字符串类型数据不能调用json(),错的更离谱啦。
找了半天也没有看到解决方法。开始怀疑是不是返回的response不是标准的json格式的数据。印象中json格式的数据类似于字典,由大括号{}给包起来的键值对,我看看评论页内容:
这个小括号是什么鬼????
试试看去掉小括号再提取内容,不过在提取前还是要先将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'])
可以正确返回文本(哇,大兄弟脾气有点大哦)
顺利将页面数据转化成标准的json格式,那我们提取数据就肥肠方便了。这里我先提取以下几个内容:
info_list = ['用户名', '评论日期', '评论内容', '追加评论', '商品信息']
我们打开刚刚淘宝评论页面:
我们用开发者工具-network-评论的json数据包-preview:
点开comments:
20条评论,我们打开其中一条看看我们要的 '用户名', '评论日期', '评论内容', '追加评论', '商品信息' :
总之,能找到对应的键值对就行,很方便。提取内容代码如下:
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
- 最后下一个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()
代码运行后发现,只能存到第一页和第二页的数据,
之后的页数,只能保存到后两项:
试着把所有信息在控制台打印出来,发现其实是可以返回全部评论的,但是不知道为什么不能存到表格里,而且很奇怪的是,为什么只能存一页多点???
全部代码如下:
# -*- coding: utf-8 -*-
import requests, json, re, xlwt
def get_data(page):
url = "https://rate.taobao.com/feedRateList.htm?auctionNumId=543187943309&userNumId=39600061¤tPageNum=" + 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不要安装精简版!
去系统之家下载,有破解版!
完。