出于学习目的,我正在尝试从Steam商店中获取数据,如果图像game_header_image_full
存在,我已经到了游戏中。两种选择都是有效的,但有一个问题。一个是非常慢,另一个似乎错过了一些数据,因此没有将URL写入文本文件。
出于某种原因,Simple HTML DOM设法捕获了9个URL,而第二个(cURL)只捕获了8个带有preg_match的URL。
问题1。
$reg
的格式是$html->find('img.game_header_image_full')
会捕获的,而不是我的preg_match
吗?或问题是其他什么?
问题2。
我在这里做得对吗?计划选择cURL替代方案,但我可以以某种方式加快速度吗?
简单的HTML DOM解析器(搜索100个ID的时间:1分钟,39秒。返回:9个URL。)
<?php
include('simple_html_dom.php');
$i = 0;
$times_to_run = 100;
set_time_limit(0);
while ($i++ < $times_to_run) {
// Find target image
$url = "http://store.steampowered.com/app/".$i;
$html = file_get_html($url);
$element = $html->find('img.game_header_image_full');
if($i == $times_to_run) {
echo "Success!";
}
foreach($element as $key => $value){
// Check if image was found
if (strpos($value,'img') == false) {
// Do nothing, repeat loop with $i++;
} else {
// Add (don't overwrite) to file steam.txt
file_put_contents('steam.txt', $url.PHP_EOL , FILE_APPEND);
}
}
}
?>
VS。 cURL替代..(搜索100个ID的时间:34s。返回:8个URL。)
<?php
$i = 0;
$times_to_run = 100;
set_time_limit(0);
while ($i++ < $times_to_run) {
$ch = curl_init();
curl_setopt( $ch, CURLOPT_URL, 'http://store.steampowered.com/app/'.$i);
curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true);
$content = curl_exec($ch);
$url = "http://store.steampowered.com/app/".$i;
$reg = "/<\\s*img\\s+[^>]*class=['\"][^'\"]*game_header_image_full[^'\"]*['\"]/i";
if(preg_match($reg, $content)) {
file_put_contents('steam.txt', $url.PHP_EOL , FILE_APPEND);
}
}
?>
答案 0 :(得分:1)
那么你不应该在HTML中使用正则表达式。它主要是有效,但是当它没有时,你必须经历数百页并弄清楚哪一个是失败的,为什么,并纠正正则表达式,然后希望并祈祷未来一切都不会再发生了。剧透警报:它会。
长话短说,请阅读这个有趣的答案:RegEx match open tags except XHTML self-contained tags
不要使用正则表达式来解析HTML。使用HTML解析器,它是不使用正则表达式的复杂算法,并且可靠(只要HTML有效)。在第一个示例中,您已经使用了一个。是的,它很慢,因为它不仅仅是在文档中搜索字符串。但它很可靠。您还可以使用其他实现,尤其是本地实现,如http://php.net/manual/en/domdocument.loadhtml.php