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

2013-07-28 22:46:57 +08:00
 tension
请问,我想抓取此页面
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);

我用这个,下一步 截取我想要的信息
4909 次点击
所在节点    程序员
20 条回复
tension
2013-07-28 22:58:42 +08:00
用正则获取到相关内容...
whuhacker
2013-07-28 22:59:38 +08:00
如果是 DOM 中的元素,可以试下 PHP Simple HTML DOM Parser
看了下 warrantyPage.warrantycheck.displayProductInfo 是段 JS 里的代码,貌似只能自己手写正则表达式了。
bakac
2013-07-28 23:00:28 +08:00
用 pyquery库 你就能向jquery一样操作
bakac
2013-07-28 23:00:48 +08:00
修正 是phpquery
bakac
2013-07-28 23:02:30 +08:00
你那张似乎只能用正则
shiny
2013-07-28 23:03:00 +08:00
你想要哪一段代码?
tension
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
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
2013-07-28 23:28:28 +08:00
这种情况我更愿意使用 DOM 来含关键词的 script 标签。
https://gist.github.com/shiny/6098962
tension
2013-07-28 23:32:39 +08:00
@shiny 其实我不止一行数据需要拿出来...
shiny
2013-07-28 23:34:18 +08:00
@tension 拿出的就是整个目标 script 里标签里的内容。如果说要具体哪行数据可以说明。
tension
2013-07-28 23:34:55 +08:00
@shiny 这个输出的东西,我还是需要 再 格式化一遍才能用的
tension
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
2013-07-28 23:52:31 +08:00
@tension 那还是正则吧,更新了下gist,输出上面几组函数调用里的参数…… 还可以更精准地捕捉里面的HTML什么的…… 看自己的需要。
pubby
2013-07-28 23:56:14 +08:00
@tension 要那几个函数的输入参数?
1. 内容不太复杂可以用增则
2. 内容复杂就把整段js拿出来,去掉无关js语句加上伪造一些相关的函数功能,放入node.js中跑出结果来
tension
2013-07-29 00:07:25 +08:00
@shiny 恩,谢谢 这个可以精准的抓取到内容了,接下来就是 格式化有用的东西
tension
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
2013-07-29 00:44:49 +08:00
明晚有空可以帮你整下,如果那时候还没解决的话.其实就是正则吧.


实在不行多正则两次就行了0 0.以前抓数据的时候我深刻感觉到如果写个牛逼的正则一次性所有数据都找到了.
自己还是分了两次..第一次把所有<li>拿到..第二次再分离里面的数据..
tension
2013-07-29 00:45:48 +08:00
@vigoss 谢谢了...
DKR
2013-07-29 10:57:38 +08:00

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/77263

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX