PHP实现采集抓取淘宝网单个商品信息

调用淘宝的数据可以使用淘宝提供的api,如果只需调用淘宝商品图片名称等公开信息在自己网站上,使用PHP中的 file_get_contents 函数实现即可。

思路:

file_get_contents(url) 该函数根据 url 如 http://www.baidu.com 将该网页内容(源码)以字符串形式输出(一个整字符串),然后配合preg_match,preg_replace等这些正则表达式操作就可以实现获取该url特定div,img等信息了。当然前题是淘宝在单个商品页面的结构是固定的,如500图的img中id就是J_ImgBooth!

具体实现方法:(获取500图,名称,价格,属性及商品描述)

代码如下:
URL地址上页面内容保存进$text

A.获取500图:

代码如下:
]*id="J_ImgBooth"[^r]*rc=\"([^"]*)\"[^>]*>/',$text,$img); //运用正则抓取img标签中id为J_ImgBooth的img,$img[0]为该500图img标签,$img[1]为500图的图片地址;

B. 获取名称

代码如下:
([^<>]*)<\/title>/',$title); //因为正文中的商品名称标签没有特殊class或id正则不好抓取,就抓<a href="https://www.f2er.com/tag/biaoqian/" target="_blank" class="keywords">标签</a>中的<a href="https://www.f2er.com/tag/neirong/" target="_blank" class="keywords">内容</a>了,一般来说title中<a href="https://www.f2er.com/tag/neirong/" target="_blank" class="keywords">内容</a>就是商品<a href="https://www.f2er.com/tag/mingcheng/" target="_blank" class="keywords">名称</a>了(实际有些出入),$title[0]整个title<a href="https://www.f2er.com/tag/biaoqian/" target="_blank" class="keywords">标签</a> $title[1]<a href="https://www.f2er.com/tag/biaoqian/" target="_blank" class="keywords">标签</a>中<a href="https://www.f2er.com/tag/neirong/" target="_blank" class="keywords">内容</a>; $title=iconv('GBK','UTF-8',$title); //如果你的网站是utf8编码,那么需要进行一下转码(淘宝是gbk编码) </div></p> <p><h3>C.<a href="https://www.f2er.com/tag/huoqu/" target="_blank" class="keywords">获取</a>价格:</h3></p> <p><div class="codetitle"><span><a style="CURSOR: pointer" data="42268" class="copybut" id="copybut42268" onclick="doCopy('code42268')"><U></U></a> <a href="https://www.f2er.com/tag/daima/" target="_blank" class="keywords">代码</a>如下:</div><div class="codebody" id="code42268"> preg_match('/<([a-z]+)[^i]*id=\"J_StrPrice\"[^>]*>([^<]*)<\/\\1>/is',$price); //同理<a href="https://www.f2er.com/tag/huoqu/" target="_blank" class="keywords">获取</a>id为J_StrPrice的<a href="https://www.f2er.com/tag/biaoqian/" target="_blank" class="keywords">标签</a><a href="https://www.f2er.com/tag/neirong/" target="_blank" class="keywords">内容</a>$price[2],$price[0]是整个<a href="https://www.f2er.com/tag/biaoqian/" target="_blank" class="keywords">标签</a>, $price[1]为h3<a href="https://www.f2er.com/tag/biaoqian/" target="_blank" class="keywords">标签</a>名; $price=floatval($price);//放入<a href="https://www.f2er.com/tag/shujuku/" target="_blank" class="keywords">数据库</a>估计还有转一下变量类型 </div></p> <p><h3>D.<a href="https://www.f2er.com/tag/huoqu/" target="_blank" class="keywords">获取</a><a href="https://www.f2er.com/tag/shuxing/" target="_blank" class="keywords">属性</a>:</h3></p> <p>这之前<a href="https://www.f2er.com/tag/huoqu/" target="_blank" class="keywords">获取</a>的<a href="https://www.f2er.com/tag/neirong/" target="_blank" class="keywords">内容</a>都是在单<a href="https://www.f2er.com/tag/biaoqian/" target="_blank" class="keywords">标签</a>中相对只需一个正则就可搞定,然而如果要<a href="https://www.f2er.com/tag/huoqu/" target="_blank" class="keywords">获取</a>如</p> <p><div class="codetitle"><span><a style="CURSOR: pointer" data="23705" class="copybut" id="copybut23705" onclick="doCopy('code23705')"><U></U></a> <a href="https://www.f2er.com/tag/daima/" target="_blank" class="keywords">代码</a>如下:</div><div class="codebody" id="code23705"> … <div id=”xxx”> <p>…</p> <ul> <p>…</p> </ul> <div>… <div>… </div> </div> </div> <p>…</p> </div></p> <p>这样特定div中有未知n个<><a href="https://www.f2er.com/tag/biaoqian/" target="_blank" class="keywords">标签</a>,<a href="https://www.f2er.com/tag/huoqu/" target="_blank" class="keywords">获取</a>该特定div将会非常的困难,搜了下网上,最接近的也只是”/<([a-z]+)[^>]*>([^<>]|(?R))*<\/\\1>/”这样使用递归抓取<a href="https://www.f2er.com/tag/biaoqian/" target="_blank" class="keywords">标签</a>对,但是他不能抓特定<a href="https://www.f2er.com/tag/biaoqian/" target="_blank" class="keywords">标签</a>,所以想要轻松抓取class=”attributes”的div我是没法办到了。但是淘宝网页有其特殊性,就是它的各个<a href="https://www.f2er.com/tag/biaoqian/" target="_blank" class="keywords">标签</a>结构基本是固定的…<div>…</div><a href="https://www.f2er.com/tag/biaoqian/" target="_blank" class="keywords">标签</a>后面不是</div><div id=”description”>就是</div><div>,所以我们可以采用变通法达到<a href="https://www.f2er.com/tag/huoqu/" target="_blank" class="keywords">获取</a><a href="https://www.f2er.com/tag/shuxing/" target="_blank" class="keywords">属性</a><a href="https://www.f2er.com/tag/biaoqian/" target="_blank" class="keywords">标签</a><a href="https://www.f2er.com/tag/neirong/" target="_blank" class="keywords">内容</a>的目的。</p> <p><div class="codetitle"><span><a style="CURSOR: pointer" data="5951" class="copybut" id="copybut5951" onclick="doCopy('code5951')"><U></U></a> <a href="https://www.f2er.com/tag/daima/" target="_blank" class="keywords">代码</a>如下:</div><div class="codebody" id="code5951"> preg_match('/<(div)[^c]*class=\"attributes\"[^>]*>.*<\/\\1>/is',$text0); //这个正则会抓取<div开始到整个<a href="https://www.f2er.com/tag/yemian/" target="_blank" class="keywords">页面</a>最后一个</div><a href="https://www.f2er.com/tag/biaoqian/" target="_blank" class="keywords">标签</a>,当然我们<a href="https://www.f2er.com/tag/shuxing/" target="_blank" class="keywords">属性</a><a href="https://www.f2er.com/tag/biaoqian/" target="_blank" class="keywords">标签</a>就在这个的前面部分。 <p>$text1=preg_replace("/<\/div>[^<]<em><(div)[^c]</em>id=\"description\"[^>]<em>>.</em><\/\1>/is","",$text0);<br /> //匹配到</div ><div id=”description”>至最后</div>然后用””代替(就是把匹配的<a href="https://www.f2er.com/tag/shanchu/" target="_blank" class="keywords">删除</a>了),所以如果attributes的div后面紧跟的是description那么我们已经达到目的了。</p> <p>$attributes=preg_replace("/<\/div>[^<]<em><(div)[^c]</em>class=\"box J_TBox\"[^>]<em>>.</em><\/\1>/is",$text1);<br /> //如果attributes后面紧跟<a href="https://www.f2er.com/tag/Box/" target="_blank" class="keywords">Box</a> J_T<a href="https://www.f2er.com/tag/Box/" target="_blank" class="keywords">Box</a><a href="https://www.f2er.com/tag/biaoqian/" target="_blank" class="keywords">标签</a>,那么我们还需要使用以上这步来剔除<a href="https://www.f2er.com/tag/Box/" target="_blank" class="keywords">Box</a> J_T<a href="https://www.f2er.com/tag/Box/" target="_blank" class="keywords">Box</a><a href="https://www.f2er.com/tag/biaoqian/" target="_blank" class="keywords">标签</a>,当然如果attributes的div后面紧跟的是description,这一步将不会匹配到任何即什么都不会做。</p> </div></p> <p><h3>E.<a href="https://www.f2er.com/tag/huoqu/" target="_blank" class="keywords">获取</a>描述:</h3></p> <p>通过上面<a href="https://www.f2er.com/tag/fangfa/" target="_blank" class="keywords">方法</a>你肯定觉得淘宝<a href="https://www.f2er.com/tag/yemian/" target="_blank" class="keywords">页面</a>上任何<a href="https://www.f2er.com/tag/biaoqian/" target="_blank" class="keywords">标签</a>都可以很简单<a href="https://www.f2er.com/tag/huoqu/" target="_blank" class="keywords">获取</a>了吧(我之前也是这么想的),但是使用这个<a href="https://www.f2er.com/tag/fangfa/" target="_blank" class="keywords">方法</a><a href="https://www.f2er.com/tag/huoqu/" target="_blank" class="keywords">获取</a>描述时得到的<a href="https://www.f2er.com/tag/neirong/" target="_blank" class="keywords">内容</a>将会是“描述加载中”,是的,这个描述<a href="https://www.f2er.com/tag/neirong/" target="_blank" class="keywords">内容</a>不是在源码中的,它是打开<a href="https://www.f2er.com/tag/yemian/" target="_blank" class="keywords">页面</a>加载进一大堆js后,不知道从淘宝的哪个角落中加载进来的。</p> <p>好吧,那么我们也可以模仿它放一些js进去。不知道哪些对加载描述有用?没事,全加载进来肯定没错。不知道需要放那些特定div上去有作用?抓一个源码,删掉一些div一步步试试看,你会发现“<div id=”detail”> </div></p> <p><div class="codetitle"><span><a style="CURSOR: pointer" data="32654" class="copybut" id="copybut32654" onclick="doCopy('code32654')"><U></U></a> <a href="https://www.f2er.com/tag/daima/" target="_blank" class="keywords">代码</a>如下:</div><div class="codebody" id="code32654"> <div id="description"> <p><div id="J_DivItemDesc">描述加载中</div></p> </div> </div></p> <p>这几个div是加载描述所必须的,那么下面就是写<a href="https://www.f2er.com/tag/daima/" target="_blank" class="keywords">代码</a>了:</p> <p><div class="codetitle"><span><a style="CURSOR: pointer" data="52544" class="copybut" id="copybut52544" onclick="doCopy('code52544')"><U></U></a> <a href="https://www.f2er.com/tag/daima/" target="_blank" class="keywords">代码</a>如下:</div><div class="codebody" id="code52544"> preg_match_all('/<script[^>]*>[^<]*<\/script>/is',$content);//<a href="https://www.f2er.com/tag/yemian/" target="_blank" class="keywords">页面</a>js脚本 $content=$content[0]; $description='<div id="detail"> </div> <div id="description"> <div id="J_DivItemDesc">描述加载中</div> </div>'; foreach ($content as &$v){$description.=iconv('GBK',$v);}; //将这个$description放进<a href="https://www.f2er.com/tag/yemian/" target="_blank" class="keywords">页面</a>,描述就会<a href="https://www.f2er.com/tag/zidong/" target="_blank" class="keywords">自动</a>的加载进来了,当然多个商品描述在同一个<a href="https://www.f2er.com/tag/yemian/" target="_blank" class="keywords">页面</a>也会只有一个描述会被加载的。 </div></p><div class="topcard-tags"><a href="/tag/PHP/" class="tag_link" target="_blank">PHP</a><a href="/tag/zhuaqu/" class="tag_link" target="_blank">抓取</a><a href="/tag/zhuaqup/" class="tag_link" target="_blank">抓取</a><a href="/tag/pzhuaqu/" class="tag_link" target="_blank">抓取</a><a href="/tag/taobaowangdangeshangpinxinxi/" class="tag_link" target="_blank">淘宝网单个商品信息</a><a href="/tag/caiji/" class="tag_link" target="_blank">采集</a><a href="/tag/caijip/" class="tag_link" target="_blank">采集</a></div> </div> </div> </div> <!-- row end--> <div class="clearfix"></div> <!-- row --> <div class="col-sm-12 col-md-12 col-lg-12"> <div class="card"> <div class="title"><h1>相关文章</h1></div><div class="list_con"> <div class="title"> <a href="/php/997740.html" title="Hessian通讯协议【附PHP源代码】">Hessian通讯协议【附PHP源代码】</a> </div> <div class="summary">Hessian开源的远程通讯,采用二进制 RPC的协议,基于 HTTP 传输。可以实现PHP调用Java,Python,C#等多语...</div> </div><div class="list_con"> <div class="title"> <a href="/php/997739.html" title="初识Mongodb总结">初识Mongodb总结</a> </div> <div class="summary">初识Mongodb的一些总结,在Mac Os X下真实搭建mongodb环境,以及分享个Mongodb管理工具,学习期间一些总结...</div> </div><div class="list_con"> <div class="title"> <a href="/php/997738.html" title="初识Mongodb之[CURD]-PHP版">初识Mongodb之[CURD]-PHP版</a> </div> <div class="summary">边看边操作,这样才能记得牢,实践是检验真理的唯一标准.光看不练假把式,光练不看傻把式,边看边练真把式....</div> </div><div class="list_con"> <div class="title"> <a href="/php/997665.html" title="php学习日志 - echo&print">php学习日志 - echo&print</a> </div> <div class="summary">在php中,结果输出一共有两种方式:echo和print,下面将对两种方式做一个比较。 echo与print的区别: (...</div> </div><div class="list_con"> <div class="title"> <a href="/php/997664.html" title="The mbstring extension is missing. Please check your PHP configuration错误及解决方法">The mbstring extension is missing. Please check your PHP configuration错误及解决方法</a> </div> <div class="summary">在安装好wampServer后,一直没有使用phpMyAdmin,今天用了一下,phpMyAdmin显示错误:The mbstring exte...</div> </div><div class="list_con"> <div class="title"> <a href="/php/997663.html" title="php学习日志 - php变量">php学习日志 - php变量</a> </div> <div class="summary">变量是用于存储数据的容器,与代数相似,可以给变量赋予某个确定的值(例如:$x=3)或者是赋予其它的变...</div> </div></div> </div> <!-- row end--> </div> </div> <footer id="footer"> <div class="container"> <div class="copyright"> Copyright © 2018 前端之家. 当前版本 V7.0.16<br> <span class="ml5">前端之家 版权所有 <a href="https://beian.miit.gov.cn/" target="_blank" rel="nofollow">闽ICP备13020303号-10</a> </div> </div> </footer> <script src="/js/base.js"></script> </body> </html>