php和python淘宝买家秀图片采集

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

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

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

1、采集数据来路

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

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 日 05 : 06 PM
如果觉得我的文章对你有用,请随意赞赏

11 条评论

  1. wanglei

    jsondata = re.search('^1?((.))2*$', html).group(1)
    AttributeError: 'NoneType' object has no attribute 'group'
    什么问题

    ( )
    1. 风之翼灵
      @wanglei

      返回的数据有问题了,淘宝做了验证机制,采集有问题

  2. sk

    已经不是采集一会跳rgv587_flag了
    我直接方问立刻就返回rgv587_flag
    应该是淘宝完全改掉策略了 必须要模拟登录了
    很复杂 不会 gg

    1. Steven
      @sk

      解决了没有

      1. 风之翼灵
        @Steven

        木有,需要大佬出手了

    2. 风之翼灵
      @sk

      嗯,是的,今天看了下应该是做了防采集的验证了。

  3. taoletu

      没用,多了一个就返回rgv587_flag了。

    1. 风之翼灵
      @taoletu

      呃,是哪里报错了?

      1. qsanli
        @风之翼灵

        有一些策略,采多了会让去登录,你没遇到嘛?

        1. 风之翼灵
          @qsanli

          我貌似没遇到这个问题,这段时间没弄了,是不是规则有变了,等我有空看看

          1. qsanli
            @风之翼灵

            带上cookie就好了~~

发表评论