Fiddler 采集阿里店铺数据
采集思路:
通过Fiddler工具的,自动回复器功能替换修改js文件,通过js获取页面html代码,发送至服务器,服务器提取数据,在发布自已的网站。
工具:
Fiddler,thinkphp5
1配置Fiddler
2编辑js文件,(示例代码)
//采集分类链接 var getlist = function(){ var list = new Array(); $('.offer-list-row-offer').each(function(){ var url = $(this).find('.title-link').attr('href'); list.push(url); }); var cateName = $('.sub-cat a span').text(); $.ajax({ url:'https://cj.51zuso.com/index/index/getList', type: 'POST', data:{ 'list':list, 'cateName':cateName, }, success : function(data){ $('body').prepend(data); }, error:function(){ alert('error'); } }); } getlist();
3服务器接收代码(示例代码)
//采集分类链接 public function getList(){ $data = input('post.'); $list = $data['list']; $cateName = $data['cateName']; $status = 0; $inserData = array(); $count = 0; $re = 0; foreach($list as $k=>$v){ $inserData['url'] = $v; $inserData['cateName'] = $cateName; $inserData['status'] = $status; $check = Db::name('links')->where(['url'=>$v,'cateName'=>$cateName])->count(); if($check == 0){ Db::name('links')->insert($inserData); }else{ $re++; } $count++; } return '成功采集链接'.$count.'条,重复'.$re.'条'; }
//获取祥情内容 var getContent = function(){ $(function(){ //标题 var html = $('html').prop("outerHTML"); var url = window.location.href; $.ajax({ url:'https://cj.51zuso.com/index/index/getContent', type: 'POST', data:{ 'html':html, 'url':url }, success : function(data){ if(data.sta == 0){ $('body').prepend('采集成功,等待'+data.sle+'毫秒跳转到下个产品'); setTimeout(function(){ window.location.href = data.url; },data.sle); }else if(data.sta == 1){ alert('内容采集完成!'); } }, error:function(){ alert('error'); } }); }) } getContent();
4服务器提取需要的数据(示例代码)
//获取祥情 public function getContent(){ $html = input('html'); $url = input('url'); $id = Db::name('links')->where('url',$url)->value('id'); file_put_contents('./cjhtml/'.$id.'.html',$html); Db::name('links')->where('id',$id)->update(['status'=>1]); //修改状态 $maxId = Db::name('links')->max('id'); if($id == $maxId){ return json(['url'=>'采集完成!','sta'=>1]); } $next = Db::name('links')->where('id','>',$id)->where('status',0)->order('id asc')->limit(1)->find(); $sle = mt_rand(2000,5000); return json(['url'=>$next['url'],'sta'=>0,'sle'=>$sle]); }
5发布到自已的网站(示例代码)
//手动写入数据 public function pushData() { die(); $db2 = [ // 数据库类型 'type' => 'mysql', // 数据库连接DSN配置 'dsn' => '', // 服务器地址 'hostname' => '120.25.75.131', // 数据库名 'database' => '1008', // 数据库用户名 'username' => '1008', // 数据库密码 'password' => 'HKTJAK2ishydFxe5', // 数据库连接端口 'hostport' => '', // 数据库连接参数 'params' => [], // 数据库编码默认采用utf8 'charset' => 'utf8', // 数据库表前缀 'prefix' => 'bp_', ]; //93">产品展示</option> //132">|--------长排较</option> //131">|--------脚杯</option> //130">|--------拉手</option> //129">|--------合页饺链</option> //143 搭扣 $cateName = '搭扣类'; $data = Db::name('links')->where('cateName',$cateName)->field('title,imgs,content')->select(); $insertData = array(); foreach($data as $k=>$v){ $v['cover'] = json_decode($v['imgs'],true)[0]; $v['addtime'] = time(); $v['edittime'] = time(); $v['catid'] = 143; $v['lang'] = 'def'; $insertData[$k] = $v; } foreach($insertData as $k=>$v){ $content = $v['content']; unset($v['content']); $dataId = Db::connect($db2)->table('bp_product')->insertGetId($v); Db::connect($db2)->table('bp_product_data')->insert(['dataId'=>$dataId,'content'=>$content]); } echo $cateName.'写入成功'; }
注意
采集过程中注意访问页面的速度,一个页面随机2-5秒时间延迟,未发现阿里的验证,采集很顺利,
Fiddler 文件备份
tp5备份控制器与数据库备份