好久没更新了,主要是最近非常忙,忙着操办各种婚礼的事情,也办成了穷光蛋,言归正传。

前面想练手,做做采集的东西,发现淘宝买家秀是个好地方,因为没水印等等(关于采集什么商品评论我先嘿嘿了...)。

由于对PHP比较熟悉,所以先拿PHP的做了一个,发现采集图片会有丢失图片的问题存在。所以再拿python做了个发现PHP的问题完美解决。所以看来采集爬虫什么的python是没的说的。

1、采集数据来路

1.png

1.png

找到https://rate.tmall.com/list_detail_rate.htm 点看就可以看到很多数据了,但注意淘宝的这些数据不是json而是jsonp格式的。

找到这个链接我们只需要拿出来前面一部分即可

https://rate.tmall.com/list_detail_rate.htm?itemId=553717234554&spuId=857500933&sellerId=2079938436&order=3&currentPage=1

itemID:商品ID,sellerId:卖家ID,spuId:不知道,随便来个

按照你需要采集的商品把上面这三个参数改一下就OK了。

2、程序

python:

# -*- coding: utf-8 -*- # By 风之翼灵 # www.fungj.com import urllib.request import json import time import re import os def getdata(data): # 遍历数据 for i in range(0, len(data['rateDetail']['rateList'])): # 数据UID uid = data['rateDetail']['rateList'][i]['id'] time.sleep(3) print('开始执行采集ID为:' + str(uid) + '的评论信息...') # 图片数据 picnum = len(data['rateDetail']['rateList'][i]['pics']) # 追加的评论 append = data['rateDetail']['rateList'][i]['appendComment'] if append: print('当前有追加评论....') # 有追加评论,追加的图片 zpic = data['rateDetail']['rateList'][i]['appendComment']['pics'] if (picnum > 0): allpic = data['rateDetail']['rateList'][i]['pics'] + zpic else: allpic = zpic else: # 没有追评,直接保存图片 if (picnum >= 3): allpic = data['rateDetail']['rateList'][i]['pics'] else: # 评论没有图片 print('评论没有图片,pass...') continue # 把图片保存到本地 if len(allpic) > 0: savefile(allpic, uid) else: continue def savefile(allpic, uid): # 开始保存图片 print('准备将ID为:' + str(uid) + '的评论图片保存到本地...') patch = os.getcwd() + '/' + str(uid) if not os.path.exists(patch): os.makedirs(patch) for i in allpic: # 图片url,拼接 imgurl = 'https:' + i # 保存图片 filename = str(patch) + '/' + str(time.time()) + '.jpg' urllib.request.urlretrieve(imgurl, filename=filename) print('本次采集共--' + str(len(allpic)) + '--张图片') # 执行方法 while True: pagenum = int(input('请输入要采集的页数,退出输入x:')) if pagenum is not 'x': gonum = 0 while True: # 执行的当前页面 gonum += 1 gopage = pagenum + gonum # 采集的连接,页码是变量 url = 'https://rate.tmall.com/list_detail_rate.htm?itemId=558049662596&spuId=874993368&sellerId=3232415546&order=3&currentPage=' + \ str(gopage) print("程序开始执行....") headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36'} requesta = urllib.request.Request(url, headers=headers) response = urllib.request.urlopen(requesta) html = response.read().decode('utf-8') # html = urllib.request().urlopen(url).read().decode('utf-8') jsondata = re.search('^[^(]*?\((.*)\)[^)]*$', html).group(1) # 用json加载数据 data = json.loads(jsondata) # 采集总页数 lastPage = data['rateDetail']['paginator']['lastPage'] # 当前页面 page = data['rateDetail']['paginator']['page'] if gopage <= lastPage: # 执行方法 go = getdata(data) print('第:' + str(gopage) + '采集完成') print('当前采集页面共有' + str(lastPage) + '页,当前正在采集第' + str(page) + '页....') else: break print('本次采集已经完成') else: exit()

在73行左右,把采集的连接或者参数改成你自己的即可,然后运行程序,输入要采集的页码,然后...等待采集完成吧。
21.png

21.png

PHP

<?php //解析网页 function jsonp_decode($jsonp, $assoc = false) { $jsonp = trim($jsonp); if (isset($jsonp[0]) && $jsonp[0] !== '[' && $jsonp[0] !== '{') { $begin = strpos($jsonp, '('); if (false !== $begin) { $end = strrpos($jsonp, ')'); if (false !== $end) { $jsonp = substr($jsonp, $begin + 1, $end - $begin - 1); } } } return json_decode($jsonp, $assoc); } //获取图片信息,写入文件当前采集的页码 function getdata() { $url = 'https://rate.tmall.com/list_detail_rate.htm?itemId=40771336334&spuId=293134690&sellerId=2098049097&order=3&currentPage=4&append=0&content=1&tagId=&posi=&picture=&ua=098%23E1hv%2FpvUvbpvUpCkvvvvvjiPPsShgjnjRszZtjthPmPUtj1bRFMp6jrERs5UQjDvRuwCvvpvvhHhRphvCvvvphvPvpvhMMGvvvhCvvOvChCvvvmtvpvIvvCvpvvvvvvvvhNjvvmvfvvvBGwvvvUwvvCj1Qvvv99vvhNjvvvmm8yCvv9vvhhy56dBHIyCvvOCvhE20RvEvpCWv2O1WB0xdBkKHkx%2F1j7JhXk7OyTxfBkK5dUf857gKL90r2pwkUkZHd8raAd6D46Od3wAxYexRfeAHVDHD70OdiTAVA1lK27zr2aIo9%3D%3D&needFold=0&_ksTS=1537188472682_863&callback=jsonp864'; //获取网页 $html = file_get_contents($url); //运行网页,获取数据 $data = jsonp_decode($html); //获取总页数 $allpage = $data->rateDetail->paginator->lastPage; //当前页面 $page = $data->rateDetail->paginator->page; //写入文件信息 //创建目录 $myfile = fopen("log.txt", "a"); $len = fwrite($myfile, '当前采集第:' . $page . '页,一共有:' . $allpage . '页' . '\\n'); //获取数据图片 $webdata = $data->rateDetail->rateList; //遍历数据 foreach ($webdata as $key => $value) { //var_dump($value); //文件夹ID $uid = $value->id; //图片 $pics = $value->pics; //追加的图片 $zpics = $value->appendComment; if (!empty($zpics)) { $zzpics = $value->appendComment->pics; //有追加评论的图片 if (!empty($zzpics) and count($zzpics >= 3)) { $allarr = array_merge($pics, $zzpics); savefile($allarr, $uid); sleep(1); } else { continue; } } else { if (count($pics >= 3) and !empty($pics)) { savefile($pics, $uid); sleep(1); } else { continue; } } } } //保存图片 function savefile($file, $finleid) { //判断目录 foreach ($file as $key => $value) { $path = $finleid . '/'; if (!is_dir($path)) { mkdir($path); } $img = file_get_contents('http:' . $value); # 网络显示图片扩展名不是必须的,只不过在windows中无法识别 ; file_put_contents($path . time() . '.jpg', $img); } } getdata(); ?>
3、总结

可能是平时对PHP了解更多一些,所以觉得代码上PHP好写,但采集的文档和速度上,python非常棒。

另外,小程序一个,其中问题还是有很多,主要是拿来练手的。

虽然我这里只是采集图片,但也可以采集其他的评论信息,需要的小伙伴拿去折腾折腾吧。

最后修改:2018 年 09 月 19 日
如果觉得我的文章对你有用,请随意赞赏