V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
tension
V2EX  ›  程序员

求PHP抓取代码... 采集代码

  •  
  •   tension · 2013-07-28 22:46:57 +08:00 · 4892 次点击
    这是一个创建于 4123 天前的主题,其中的信息可能已经有所发展或是发生改变。
    请问,我想抓取此页面
    https://selfsolve.apple.com/wcResults.do?num=0&sn=C07KK317DWYL

    源代码 内有一段

    warrantyPage.warrantycheck.displayProductInfo

    相关的东西,我想抓取,该如何写呢?

    再@joyqi的指点下,

    $url='https://selfsolve.apple.com/wcResults.do?num=0&sn=C07KK317DWYL';
    $lines_string=file_get_contents($url);
    echo htmlspecialchars($lines_string);

    我用这个,下一步 截取我想要的信息
    20 条回复    1970-01-01 08:00:00 +08:00
    tension
        1
    tension  
    OP
       2013-07-28 22:58:42 +08:00
    用正则获取到相关内容...
    whuhacker
        2
    whuhacker  
       2013-07-28 22:59:38 +08:00
    如果是 DOM 中的元素,可以试下 PHP Simple HTML DOM Parser
    看了下 warrantyPage.warrantycheck.displayProductInfo 是段 JS 里的代码,貌似只能自己手写正则表达式了。
    bakac
        3
    bakac  
       2013-07-28 23:00:28 +08:00
    用 pyquery库 你就能向jquery一样操作
    bakac
        4
    bakac  
       2013-07-28 23:00:48 +08:00
    修正 是phpquery
    bakac
        5
    bakac  
       2013-07-28 23:02:30 +08:00
    你那张似乎只能用正则
    shiny
        6
    shiny  
       2013-07-28 23:03:00 +08:00
    你想要哪一段代码?
    tension
        7
    tension  
    OP
       2013-07-28 23:06:07 +08:00
    @shiny 我想要这一段

    <script type="text/javascript">
    var warrantyPage;
    //instantiate warranty checker
    var warrantyChecker = new WarrantyChecker();
    var hasErrors = false;

    Event.observe(window, 'load', function() {

    warrantyPage = new WCPage();
    warrantyPage.warrantycheck.initialize(399994);




    warrantyPage.warrantycheck.hidePanel();
    $('cookieSpinner').hide();


    warrantyPage.warrantycheck.hideRow(' iPhone notactivated');

    $('results').show();
    warrantyPage.warrantycheck.showTitle('status');

    var regTextKeyLong = '借助已验证的购买日期,Apple 可以快速找到您的产品并为您提供所需帮助。';
    $('registration-text').update(regTextKeyLong);
    warrantyPage.setClassAndShow('registration', 'green', 'registration-true');

    warrantyPage.warrantycheck.displayProductInfo('https://km.support.apple.com.edgekey.net/kb/securedImage.jsp?configcode=DWYL&size=72x72', 'Mac mini (Late 2012)', false,'C07KK317DWYL', false, '', 'C07KK317DWYL');

    warrantyPage.warrantycheck.displayPHSupportInfo( true, '电话技术支持:有效', '在最初 90 天内,您的产品可享受免费的电话技术支持服务。<br/>预计到期日:20 September 2013<br/><a href="http://www.apple.com/support/country/index.html?dest=complimentary">关于免费支持服务的更多信息</a>', 'https://expresslane.apple.com/GetproductgroupList.do?serialno=C07KK317DWYL');

    warrantyPage.warrantycheck.displayHWSupportInfo(true, '维修和服务保修情况:有效', '您的产品可享受 Apple 有限保修中的硬件维修和服务。<br/>预计到期日:21 June 2014<br/>注:在中国购买的 Mac 和 iPad 电脑产品中的所有主要部件均可享受中国相关法律规定的 2 年保修。在浙江省,消费者权益保护法赋予了消费者自购买台式电脑之日起 3 年的质量问题保修服务。<a href="http://www.apple.com.cn/support/warranties/">点按此处了解更多详细信息.</a><br/><a href="http://support.apple.com/kb/he44?viewlocale=zh_CN">了解 Apple 针对您产品的保修信息。</a>', 'https://selfsolve.apple.com/GetWarranty.do?sn=C07KK317DWYL');

    warrantyPage.warrantycheck.displayEligibilityInfo('LI', true, '符合 AppleCare Protection Plan 条件', 'C07KK317DWYL', '获取 AppleCare Protection Plan,以将硬件产品的技术支持和硬件维修保修期限延长至 3 年(自购买之日算起)。', '/AgrOfferFlow.do','CHN','APP','I6l5YAkMK1j6vTnAm70jYg==', false);

    warrantyPage.warrantycheck.displayDisputeInfo('<div class="sosumi">如果您认为针对您的产品所显示的信息不正确,可<a href="https://selfsolve.apple.com/Dispute.do?transType=Warranty_Checker&sn=C07KK317DWYL" id="hardware-epop" target="_blank">在线提交购买凭证</a>或通过传真提交。验证保修时,需要您提供销售收据,因此请务必妥善保管该收据。无论注册与否,您的保修是一样的。</div>');

    warrantyChecker.trackOmnitureResults();


    });

    </script>

    并且把里面的部分内容 输出成函数
    someFork
        8
    someFork  
       2013-07-28 23:22:23 +08:00
    @tension 测试了

    <?php


    $url = "https://selfsolve.apple.com/wcResults.do?num=0&sn=C07KK317DWYL";
    $html = file_get_contents($url);

    $pattern = '/warrantyPage.warrantycheck.displayProductInfo\(\'.*\'\);/';
    preg_match($pattern, $html, $matches);
    print_r($matches);


    ?>
    shiny
        9
    shiny  
       2013-07-28 23:28:28 +08:00
    这种情况我更愿意使用 DOM 来含关键词的 script 标签。
    https://gist.github.com/shiny/6098962
    tension
        10
    tension  
    OP
       2013-07-28 23:32:39 +08:00
    @shiny 其实我不止一行数据需要拿出来...
    shiny
        11
    shiny  
       2013-07-28 23:34:18 +08:00
    @tension 拿出的就是整个目标 script 里标签里的内容。如果说要具体哪行数据可以说明。
    tension
        12
    tension  
    OP
       2013-07-28 23:34:55 +08:00
    @shiny 这个输出的东西,我还是需要 再 格式化一遍才能用的
    tension
        13
    tension  
    OP
       2013-07-28 23:37:37 +08:00
    @shiny 例如
    warrantyPage.setClassAndShow
    warrantyPage.warrantycheck.displayProductInfo
    warrantyPage.warrantycheck.displayPHSupportInfo
    warrantyPage.warrantycheck.displayHWSupportInfo
    warrantyPage.warrantycheck.displayEligibilityInfo
    warrantyPage.warrantycheck.displayDisputeInfo

    这几组里的数据 都有用
    shiny
        14
    shiny  
       2013-07-28 23:52:31 +08:00
    @tension 那还是正则吧,更新了下gist,输出上面几组函数调用里的参数…… 还可以更精准地捕捉里面的HTML什么的…… 看自己的需要。
    pubby
        15
    pubby  
       2013-07-28 23:56:14 +08:00
    @tension 要那几个函数的输入参数?
    1. 内容不太复杂可以用增则
    2. 内容复杂就把整段js拿出来,去掉无关js语句加上伪造一些相关的函数功能,放入node.js中跑出结果来
    tension
        16
    tension  
    OP
       2013-07-29 00:07:25 +08:00
    @shiny 恩,谢谢 这个可以精准的抓取到内容了,接下来就是 格式化有用的东西
    tension
        17
    tension  
    OP
       2013-07-29 00:20:05 +08:00
    @shiny 其实我想最终得到的东西是

    $registration-true = "registration-true";
    $model = "Mac mini (Late 2012)";
    $warranty = "true";
    $warranty_status = "电话技术支持:有效";
    $warranty_data = "September 20, 2013";
    $tel_support = "true";
    $tel_support_status = "维修和服务保修情况:有效";
    $tel_support_data = "June 21, 2014";


    其实最终我想要的是这样...
    vigoss
        18
    vigoss  
       2013-07-29 00:44:49 +08:00
    明晚有空可以帮你整下,如果那时候还没解决的话.其实就是正则吧.


    实在不行多正则两次就行了0 0.以前抓数据的时候我深刻感觉到如果写个牛逼的正则一次性所有数据都找到了.
    自己还是分了两次..第一次把所有<li>拿到..第二次再分离里面的数据..
    tension
        19
    tension  
    OP
       2013-07-29 00:45:48 +08:00
    @vigoss 谢谢了...
    DKR
        20
    DKR  
       2013-07-29 10:57:38 +08:00
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2739 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 15:06 · PVG 23:06 · LAX 07:06 · JFK 10:06
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.