免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 9863 | 回复: 16
打印 上一主题 下一主题

抓取淘宝产品简介页面时遇到的问题,求解!谢谢! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-11-19 12:49 |只看该作者 |倒序浏览
本帖最后由 sx98083714 于 2010-11-19 13:21 编辑
  1. #!/usr/bin/perl

  2. use strict;
  3. use URI;
  4. use Web::Scraper;
  5. use utf8;
  6. use LWP;
  7. use Encode;
  8. use HTML::TokeParser;
  9. use HTTP::Cookies;

  10. #将输出自动解码为utf8格式
  11. binmode(STDOUT,":encoding(utf8)");

  12. #抓取url
  13. my $url = "http://meilibody.taobao.com/?search=y";

  14. #定义抓取产品列表表达式
  15. my $scraper = scraper{
  16.     process ".permalink","links[]" => { "url" => '@href',"txt" => 'TEXT' };
  17. };

  18. my $result = $scraper -> scrape (URI -> new($url) );

  19. #抓取产品url、标题
  20. for my $row ( @{ $result -> { links } } ){
  21.    
  22.     my $purl = $row -> { "url" };
  23.     my $ptxt = $row -> { "txt" };
  24.    
  25.     #调用函数抓取产品详细内容
  26.     my $pcontent = &getcontent($purl);
  27.    
  28.     print "content:",$pcontent,"\n";
  29.     sleep 10;
  30.    
  31. }

  32. #获取单个产品详细资料
  33. sub getcontent() {
  34.    
  35.     #抓取产品url
  36.     my $url = shift;
  37.    
  38.     my $browser = LWP::UserAgent -> new;
  39.     $browser -> cookie_jar ( { } );
  40.     $browser -> timeout ( 500 );
  41.    
  42.     my $response = $browser -> get ($url,
  43.                                     'User-Agent' => 'Mozilla/5.0 (X11; U; Linux i686; zh-CN; rv:1.9.0.12) Gecko/2009072711 CentOS/3.0.12-1.el5.centos Firefox/3.0.12',
  44.                                     'Accept' => 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
  45.                                     'Accept-Language' => 'zh-cn,zh;q=0.5',
  46.                                     'Accept-Charset' => 'gb2312,utf-8;q=0.7,*;q=0.7',
  47.                                     'Referer' => 'http://meilibody.taobao.com/?search=y',
  48.                                     );
  49.     #获取单个产品网页内容
  50.     my $content = $response -> content;
  51.     #网页内容为utf8编码
  52.     $content = decode ( 'gbk' , $content);
  53.    
  54.     my $stream = HTML::TokeParser -> new (\$content);
  55.    
  56.     #1表示找到内容简介的起始处
  57.     my $find = 0;
  58.     #产品简介html代码
  59.     my $pcontent = "";
  60.    
  61.     while ( my $token = $stream -> get_token ){
  62.         
  63.         #产品简介部分结束,将标记归0,跳出循环
  64.         if ( $find == 1 and $token -> [0] eq 'S' and $token -> [1] eq 'script') {
  65.             $find = 0;
  66.             last;
  67.         }
  68.         
  69.         if ( $find == 0 and $token -> [0] eq 'S' and $token -> [1] eq 'div' and $token -> [2] -> {class} eq "content" ){
  70.             #找到产品简介起始,将标记置为1
  71.             $find = 1;
  72.             $pcontent .= $token -> [4];
  73.         }elsif ( $find == 1  and $token -> [0] eq 'S' ){
  74.             $pcontent .= $token -> [4];
  75.         }elsif ( $find == 1 and $token -> [0] eq 'E'){
  76.             $pcontent .= $token -> [2];
  77.         }elsif ( $find == 1 and $token -> [0] eq 'T'){
  78.             $pcontent .= $token -> [1];
  79.         }elsif ( $find == 1 and $token -> [0] eq 'C'){
  80.             $pcontent .= $token -> [1];
  81.         }elsif ( $find == 1 and $token -> [0] eq 'D'){
  82.             $pcontent .= $token -> [1];
  83.         }
  84.     }
  85.    
  86.     return $pcontent;
  87.    
  88. }
复制代码
匹配应该是没有问题,但是抓取到的产器简介是“描述加载中....",看了似乎产品简介是通过js来得到的,过往神仙如何解决这一问题?谢谢!

论坛徽章:
0
2 [报告]
发表于 2010-11-19 12:58 |只看该作者
自已先顶下!

论坛徽章:
0
3 [报告]
发表于 2010-11-19 13:16 |只看该作者
如果我的实现方法有问题,希望有高手能提供更好的方法,谢谢先!

论坛徽章:
0
4 [报告]
发表于 2010-11-19 13:36 |只看该作者
人家是后台ajax调用获取的,真实的url不是你看到的那个

论坛徽章:
0
5 [报告]
发表于 2010-11-19 13:41 |只看该作者
回复 4# Pro_sky
可有解?

论坛徽章:
0
6 [报告]
发表于 2010-11-19 14:18 |只看该作者

论坛徽章:
0
7 [报告]
发表于 2010-11-19 14:29 |只看该作者
不信顶不来大牛支招。怪了,看到好多windows下的淘宝店铺克隆工具,别人是如何整的?

论坛徽章:
0
8 [报告]
发表于 2010-11-19 16:09 |只看该作者
嘿嘿,找到办法了。试践中。

论坛徽章:
0
9 [报告]
发表于 2010-11-20 11:12 |只看该作者
淘宝在页面的宝贝详情、评价详情、成交记录等处是使用Ajax来获取数据,并未将数据直接嵌入在主页面中。

看了一下HTML源码,它是将数据作为JS的一个变量嵌入到JS中,该JS随主页面下载到本地浏览器的缓存中,在需要嵌入该数据的地方通过JS事件调用,如鼠标点击等。在数据嵌入处都有相关JS代码,难度也不大,分析一下,顺藤摸瓜就能获得想要的原始数据。

楼主在现有代码基础上稍加改动即可实现。

论坛徽章:
0
10 [报告]
发表于 2010-11-21 00:59 |只看该作者
顶一下,也需要这个,有结果希望能分享~
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP