使用cURL

时间:2015-12-22 01:08:53

标签: php curl

出于学习目的,我正在尝试从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);
        }

    }

?>

1 个答案:

答案 0 :(得分:1)

那么你不应该在HTML中使用正则表达式。它主要是有效,但是当它没有时,你必须经历数百页并弄清楚哪一个是失败的,为什么,并纠正正则表达式,然后希望并祈祷未来一切都不会再发生了。剧透警报:它会。

长话短说,请阅读这个有趣的答案:RegEx match open tags except XHTML self-contained tags

不要使用正则表达式来解析HTML。使用HTML解析器,它是不使用正则表达式的复杂算法,并且可靠(只要HTML有效)。在第一个示例中,您已经使用了一个。是的,它很慢,因为它不仅仅是在文档中搜索字符串。但它很可靠。您还可以使用其他实现,尤其是本地实现,如http://php.net/manual/en/domdocument.loadhtml.php