好久没更新了,主要是最近非常忙,忙着操办各种婚礼的事情,也办成了穷光蛋,言归正传。
前面想练手,做做采集的东西,发现淘宝买家秀是个好地方,因为没水印等等(关于采集什么商品评论我先嘿嘿了...)。
由于对PHP比较熟悉,所以先拿PHP的做了一个,发现采集图片会有丢失图片的问题存在。所以再拿python做了个发现PHP的问题完美解决。所以看来采集爬虫什么的python是没的说的。
1、采集数据来路
找到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¤tPage=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¤tPage=' + \
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行左右,把采集的连接或者参数改成你自己的即可,然后运行程序,输入要采集的页码,然后...等待采集完成吧。
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¤tPage=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非常棒。
另外,小程序一个,其中问题还是有很多,主要是拿来练手的。
虽然我这里只是采集图片,但也可以采集其他的评论信息,需要的小伙伴拿去折腾折腾吧。
11 条评论
jsondata = re.search('^1?((.))2*$', html).group(1)
( ↩) ↩AttributeError: 'NoneType' object has no attribute 'group'
什么问题
返回的数据有问题了,淘宝做了验证机制,采集有问题
已经不是采集一会跳rgv587_flag了
我直接方问立刻就返回rgv587_flag
应该是淘宝完全改掉策略了 必须要模拟登录了
很复杂 不会 gg
解决了没有
木有,需要大佬出手了
嗯,是的,今天看了下应该是做了防采集的验证了。
没用,多了一个就返回rgv587_flag了。
呃,是哪里报错了?
有一些策略,采多了会让去登录,你没遇到嘛?
我貌似没遇到这个问题,这段时间没弄了,是不是规则有变了,等我有空看看
带上cookie就好了~~