导读:
投一篇技术稿,希望管理员给哥机会。为了投稿专门记录整理了前几天为一个客户定制的一个抓取淘宝天猫评论的小助手。
做一个淘宝/天猫评论信息采集器并打包成exe程序
需要哪些步骤?
1.写一个python爬虫,抓取淘宝/天猫的评论信息
2.写一个简单的GUI界面
3.打包发布成exe
需要哪些储备知识?
1.简单的python知识
2.简单的爬虫知识,不会也没关系,只要按照步骤就能撸出来
3.简单的python gui知识,不会更没关系,只要几行代码就可以了。
4.简单的命令操作,不会还没关系,几行命令搞定。
如果你有简单的python知识(安装、运行有什么的),跟着我的步骤,so easy!
难点透析:
关键难点是页面分析,找出请求目标的url。
淘宝/天猫的评论区是独立加载的,新手很难找到是哪个文件,所以通常有新手请求宝贝地址解析之后发现并没有自己需要的内容。
这个工具有什么用?
懂得人自需要~不懂的人也没啥用
开始操作
1.分析目标页面,找出目标url(这里我写的是一种通用的分析方法,可以套用任何网站,请仔细阅读)
我们在淘宝上随便找一个宝贝,以华为这个手机为例:
https://detail.tmall.com/item.htm?spm=a230r.1.14.12.59b76305LvIKBw&id=560087790541&ns=1&abbucket=5&sku_properties=10004:827902415;5919063:6536025
这是一个天猫地址,可以看到有很多条的评论信息,这就是我们的目标。
随便复制一句半句的评价,然后刷新这个页面(先不要点评价信息),调出你浏览器的F12(360浏览器,QQ浏览器,Chrome,Firefox什么的都无所谓,国产的核心都是chrome),搜索刚才复制的评价会发现没有结果,由此推断出目标内容不是和主页面同时加载的。
这时候点击累计评价,再搜索刚才复制的评价内容,发现有结果,可以确认评论信息是在这个时候加载进来的。
下面就是要找出加载信息的url了
点击工具栏的Network,勾选Disable cache,再点前边的clear清空下边加载的内容。
F5刷新界面,这个时候会默认的加载商品详情页面,为了方便查看,再次点击清空clear,
然后点击界面上的累计评价,这个时候关于累计评价的所有资源就都会加载出来了。
一般加载内容有两种方式,直接html或者ajax加载。首先我们猜测评论信息可能是通过ajax加载进来的,点击XHR,发现内容是空的。。。
猜测错误,那就肯定是Html直接加载进来的了。我们在filter里输入htm来过滤显示所有的html页面
可以看到一共有4个页面,这个时候该怎么办呢,该使出大法宝了,像我这种资深coder一眼就才出来是第二个list_detail_rate开头的url加载的评论信息了,点击去去,然后点右边的Response,查看内容,哈哈,果然是评论信息,验证了我的想法!
我是怎么猜出来的?因为我的英文学的好呀!!
你不会猜怎么办,那也很简答,已经剩4个url了,一个个看看也费不了几秒钟。
既然已经确定了,那我们要单独看一下了,右键复制这个url或者直接open in new tab都可以,
干的漂亮,果真是我们需要的。把这个url默默的记下:
https://rate.tmall.com/list_detail_rate.htm?itemId=560087790541&spuId=889298324&sellerId=268451883&order=3¤tPage=1&append=0&content=1&tagId=&posi=&picture=&ua=098%23E1hvhQvZvxGvUpCkvvvvvjiPPLdhzj1bP2cyljnEPmPhAjYWPFqOtj3RPsSZAjlRRLyCvvpvvvvv9phvHnQwYDTVzYswMRKa7%2FG2zVqwoliIdphvmpvUW9bGMvLxnT6Cvvyv2hZm%2Bfhh6XVrvpvEvvFZ939OCmeNdphvmpvUb98J59ova46CvvyvCbmmf76hJEejvpvhvvpvv2yCvvpvvvvv2QhvCvvvMMGCvpvVvmvvvhCvmphvLvFTj9vjRreYiXhpVVQEfwsZaXgTf98xKXzBnCODN%2BshaNoAdcnVaNF6AC46NB3rsWBl51r6LWFI1W9wVcHa0f0DyBvOJ1kHsX7vVB0tvpvIvvvvWbYvTGhvvvnUphvvGQvvv63vpCCIvvv2ohCv2W%2BvvvnUphvWoIyCvvOUvvVvaZ4ivpvUvvmv%2Bhngf1T5vpvhvvmv9u6CvCvwVEumhBhhobRnrsw6Zf5BdphvhCQvqv8A%2B9BOgU0znsBBKaVrvpvEvv97vuoyCvypdphvmpvUx98xDppB39%3D%3D&isg=AjMz5uw7bYV4oiFR01WI7Ekz1zedwMdMBHn97OXRZNKC5FKGbTrLeg026gvv&needFold=0&_ksTS=1516177807125_1067&callback=jsonp1068
2.开始coding了
首先假设你已经会一些简单的python知识(就是不用我再从安装环境开始讲了),再假设你有一个IDE,pycharm或者pydev eclipse都行,如果你没有IDE,一个记事本也行,通常新手都觉得大神都是一个编辑器走天下的。。。其实大神都是能自动化绝对不多敲一个字母。。。
上一步我们已经知道目标url了,这一步我们只要抓取下来就可以了。
这里我们用的python 的requests库,一个比较好用的爬虫库,封装了一些http请求,你可以直接拿来用。
通用的简单安装方法,pip install requests
__author__ = 'devtao'
import requests
comment_url = 'https://rate.tmall.com/list_detail_rate.htm?itemId=560087790541&spuId=889298324&sellerId=268451883&order=3¤tPage=1&append=0&content=1&tagId=&posi=&picture=&ua=098%23E1hvhQvZvxGvUpCkvvvvvjiPPLdhzj1bP2cyljnEPmPhAjYWPFqOtj3RPsSZAjlRRLyCvvpvvvvv9phvHnQwYDTVzYswMRKa7%2FG2zVqwoliIdphvmpvUW9bGMvLxnT6Cvvyv2hZm%2Bfhh6XVrvpvEvvFZ939OCmeNdphvmpvUb98J59ova46CvvyvCbmmf76hJEejvpvhvvpvv2yCvvpvvvvv2QhvCvvvMMGCvpvVvmvvvhCvmphvLvFTj9vjRreYiXhpVVQEfwsZaXgTf98xKXzBnCODN%2BshaNoAdcnVaNF6AC46NB3rsWBl51r6LWFI1W9wVcHa0f0DyBvOJ1kHsX7vVB0tvpvIvvvvWbYvTGhvvvnUphvvGQvvv63vpCCIvvv2ohCv2W%2BvvvnUphvWoIyCvvOUvvVvaZ4ivpvUvvmv%2Bhngf1T5vpvhvvmv9u6CvCvwVEumhBhhobRnrsw6Zf5BdphvhCQvqv8A%2B9BOgU0znsBBKaVrvpvEvv97vuoyCvypdphvmpvUx98xDppB39%3D%3D&isg=AjMz5uw7bYV4oiFR01WI7Ekz1zedwMdMBHn97OXRZNKC5FKGbTrLeg026gvv&needFold=0&_ksTS=1516177807125_1067&callback=jsonp1068'
resp = requests.get(comment_url)
print(resp.text)
只有一行关键代码,soeasy,只要一个request.get方法,把目标url传进去就可了,看看控制台是不是有返回的评价信息了。
下面我们要做的就是过滤清洗了,只留下我们需要的内容,经过观察你会发现这个返回结果很像json格式,对,通常这种数据都是json格式会写给一个回调的js。
网上随便找个json格式工具看看
果真是json啊,哈哈!但是好像多出了前边的jsonp1068(这个字符串,还有最后的)
去掉就可以了,下面我们改进一下代码
resp = requests.get(comment_url)
tmp_resp = re.findall('\(.*\)',resp.text)[0][1:-1] #去掉开头的json1068(和最后的)
comments = json.loads(tmp_resp)
print(comments)
这个输出结果就是一个标准的json了
通过观察我们发现买家所有的评论信息都在节点rateDetail.rateList.rateContent和rateDetail.rateList.appendContent中,取出来就可以了。
rateDetail = comments.get('rateDetail')
rateList = rateDetail['rateList']
for rate in rateList:
rateContent = rate.get('rateContent')
print(rateContent+'\r\n')
try:
appendComment = rate.get('appendComment').get('content')
print(appendComment+'\r\n')
except:
pass
ok,看到了吧,控制台的输出已经是所有的评论了,就是这么简单。
下面我们要干什么呢?当然是进一步完善了,我们现在还没有图片而且只是抓取了第一页的评论。
观察上边的json字符串,
突破地址是不是很亮眼,取出来下载下来就可以了。
我们先写一个下载图片的函数
def downloadImageFile(imgUrl,default_path):
'''
:param imgUrl:
:return:
'''
local_filename = imgUrl.split('/')[-1]
#print ("Download Image File=", local_filename)
r = requests.get(imgUrl, stream=True) # here we need to set stream = True parameter
with open(default_path+local_filename, 'wb') as f:
for chunk in r.iter_content(chunk_size=1024):
if chunk: # filter out keep-alive new chunks
f.write(chunk)
f.flush()
f.close()
return local_filename
然后再修改我们的代码,解析评论里的图片url地址并且请求下载localimagepath存储图片路径。
pics = rate.get('pics')
for pic in pics:
downloadImageFile('http:'+pic,LocalImagePath)
再运行,图片也有了,还差一个抓取所有页面的改动了,还是观察那个json,有一个Lastpage节点,经过比较发现这个数据就是记录的一共有多少页评论,这就简单了,取出来就行了。取出来之后将url中currentpage字段替换掉,就是每个页面的评论信息了,这时候你会发现搞一个递归函数会更方便一些,对不对,下面我们就要进行较大规模的改动了,将我们的抓取改为递归的。
__author__ = 'devtao'
import requests
import json
from bs4 import BeautifulSoup
from spider_tools.user_agent import GET_USER_AGENT
from spider_tools.down_pics import downloadImageFile
import re
import DBHelper
import fetch_rate_from_taobao.config as Config
db = DBHelper.LightMysql(Config.dbconfig)
import time
import tkinter as tk
rate_ajax_url = 'https://rate.tmall.com/list_detail_rate.htm'
LocalImagePath = 'D:/taobao_images/'
fileLocation = 'D:/taobao_images/comments.txt'
to_db = False
def fectch_the_comments(currentpage,baobei_url):
item_id = re.findall('id=(\d+)',baobei_url)[0]
params = {
'itemId':item_id,
'spuId':607814301,
'sellerId':2340846053,
'order':3,
'currentPage':currentpage,
'append':0,
'content':1,
'tagId':'',
'posi':'',
'picture':'',
'ua':'098#E1hvhpvnvP6vUvCkvvvvvjiPPL596jlURLdv0jD2PmPysjrWPscUljtWPLsv1jDRRphvChCvvvmCvpvZzCQBcqLNznswAmxfqlPGOY1d7eurvpvEph88HHUvpmnzdphvhhaj+1BvvhvZgIVYKLuAbDujvpvhphhvvvGCvvpvvPMMmphvLhEL+vmFDVQEVAdwaXTAVAil8bkirqpKCeEvibmAdcOdNB3r1EKKfvxYLW2ZeXr+VkYVyOvO5onmWl4vtC6tExhlBqev+ulQbc6XSO0EvpvVpyUUCEu4uphvmhCvCUjzPtyVKphv8hCvvv2MMqd8phvw8pvvpNrvpC3mvvChcyCvVhUvvhR1phvOp9vvpqhCvpvVph9vvvvvRphvChCvvvm5vpvhphvhHv==',
'isg':'AikpBHWmVwEMImiF785tZKCdONWD9h0oZa1SQ8se0pBMkkikE0Sa-VPAIDl4',
'needFold':0,
'_ksTS':'1515846585699_1197',
'callback':'jsonp1198'
}
resp = requests.get(rate_ajax_url,params=params)
tmp_resp = re.findall('\(.*\)',resp.text)[0][1:-1]
print(tmp_resp)
comments = json.loads(tmp_resp)
rateDetail = comments.get('rateDetail')
lastPage = rateDetail.get('paginator').get('lastPage')
rateList = rateDetail['rateList']
for rate in rateList:
rateContent = rate.get('rateContent')
with open(fileLocation, 'a') as f:
f.write(rateContent+'\r\n')
try:
appendComment = rate.get('appendComment').get('content')
with open(fileLocation, 'a') as f:
f.write(rateContent+'\r\n')
except:
pass
pics = rate.get('pics')
for pic in pics:
# print(pic)
downloadImageFile('http:'+pic,LocalImagePath)
if currentpage <= int(lastPage):
print('currentPage:',currentpage)
time.sleep(60)
fectch_the_comments(currentpage+1,baobei_url,text)
if __name__ == '__main__':
currentpage = 1
baobei_url = 'https://rate.tmall.com/list_detail_rate.htm?itemId=560087790541&spuId=889298324&sellerId=268451883&order=3¤tPage=1&append=0&content=1&tagId=&posi=&picture=&ua=098%23E1hvhQvZvxGvUpCkvvvvvjiPPLdhzj1bP2cyljnEPmPhAjYWPFqOtj3RPsSZAjlRRLyCvvpvvvvv9phvHnQwYDTVzYswMRKa7%2FG2zVqwoliIdphvmpvUW9bGMvLxnT6Cvvyv2hZm%2Bfhh6XVrvpvEvvFZ939OCmeNdphvmpvUb98J59ova46CvvyvCbmmf76hJEejvpvhvvpvv2yCvvpvvvvv2QhvCvvvMMGCvpvVvmvvvhCvmphvLvFTj9vjRreYiXhpVVQEfwsZaXgTf98xKXzBnCODN%2BshaNoAdcnVaNF6AC46NB3rsWBl51r6LWFI1W9wVcHa0f0DyBvOJ1kHsX7vVB0tvpvIvvvvWbYvTGhvvvnUphvvGQvvv63vpCCIvvv2ohCv2W%2BvvvnUphvWoIyCvvOUvvVvaZ4ivpvUvvmv%2Bhngf1T5vpvhvvmv9u6CvCvwVEumhBhhobRnrsw6Zf5BdphvhCQvqv8A%2B9BOgU0znsBBKaVrvpvEvv97vuoyCvypdphvmpvUx98xDppB39%3D%3D&isg=AjMz5uw7bYV4oiFR01WI7Ekz1zedwMdMBHn97OXRZNKC5FKGbTrLeg026gvv&needFold=0&_ksTS=1516177807125_1067&callback=jsonp1068'
fectch_the_comments(currentpage,baobei_url)
好了,这就是到目前为止我们做的一个淘宝天猫爬虫小助手了,可以抓取指定宝贝的所有评论信息和图片了。但是没有界面,只有会conding的你用,别人不能用,所以我们要打包成exe文件给别人用,不知不觉写了两个多小时,发现再写下去画界面,然后打包什么的貌似帖子就太长了,先这样吧,等审核通过了有机会了再接着写,希望管理员给个机会。
最后发给客户的是这样滴,
最后需要成品的也发给大家 链接:https://pan.baidu.com/s/1mj9EEda 密码:xwru