如何使用PHP的fgetcsv和fopen从其他网站获取特定数据

时间:2015-04-19 06:26:00

标签: php html web-crawler fopen

我希望能够从雅虎财经中获取诸如文章列表等数据。目前我有一个本地托管网页,搜索雅虎财经的股票代码(例如Nok),然后它返回开盘价,当前价格以及价格上涨或下跌的距离。 / p>

我想要做的是抓住雅虎在页面上的相关链接 - 这些链接有与股价相关的文章......例如https://au.finance.yahoo.com/q?s=nok&ql=1向下滚动到标题,我想要抓住那些链接。

目前我正在写一本书(万维网的PHP高级版,我知道它已经过时了,但我发现它已经存在于昨天并且非常有趣:))在书中它说“访问它时很重要网页确切地知道数据的位置' - 我认为现在可以解决这个问题...也许能够搜索其中包含特定关键字的链接或类似的链接!

我想知道我是否可以使用特殊技巧来抓取网页上的特定数据?像抓取工具一样,他们可以抓取与某些内容相关的链接。 如果知道如何做到这一点会很棒,那么我将来可以将它应用到其他科目。

我现在添加我的代码。这纯粹是为了练习,因为我在课程中学习PHP:)

##getquote.php
    <!DOCTYPE html PUBLIC "-//W3// DTD XHTML 1.0 Transitional//EN" 
    "http://www.w3.org/TR/2000/REC-xhtml1-20000126/DTD/xhtml1-transitional.dtd">

    <html xmlns="https://www.w3.org/1999/xhtml">
    <head>
        <title>Get Stock Quotes</title>
        <link href='css/style.css' type="text/css" rel="stylesheet">
    </head>
    <h1>Stock Reader</h1>
        <body>
    <?php

    //Read[1] = current price
    //read[5] = opening price
    //read[4] = down or up whatever percent from opening according to current price


    //Step one    
    //Begin the PHP section my checking if the form has been submitted
        if(isset($_POST['submit'])){
            //Step two
            //Check if a stock symbol was entered.
            if(isset($_POST['symbol'])){

            //Define the url to be opened
            $url = 'http://quote.yahoo.com/d/quotes.csv?s=' . $_POST['symbol'] . '&f=sl1d1t1c1ohgv&e=.csv';

                //Open the url, if can't SHUTDOWN script and write msg
            $fp = fopen($url, 'r') or die('Cannot Access YAHOO!.');
        //This will get the first 30 characters from the file located in $fp
            $read = fgetcsv ($fp, 30);
                //Close the file processsing.
                fclose($fp);
                include("php/displayDetails.php");

            }

            else{
                echo "<div style='color:red'>Please enter a SYMBOL before submitting the form</div>";
            }

        }
    ?>
            <form action='getquote.php' method='post'>
                <p>Symbol: </p><input type='text' name='symbol'>
                <br />
                <input type="submit" value='Fetch Quote' name="submit">

            </form>
            <br />
            <br />

##displayDetails.php

    <div class='display-contents'>
    <?php
                echo "<div>Todays date: " . $read[2] . "</div>";
                //Current price
                echo "<div>The current value for " . $_POST["symbol"] . " is <strong>$ " . $read[1] . "</strong></div>";
                //Opening Price
                echo "<div>The opening value for " . $_POST["symbol"] . " is <strong>$ " . $read[5] . "</strong></div>";

                if($read[1] < $read[5])
                {
                //Down or Up depending on opening.
                echo "<div>" .strtoupper($_POST['symbol']) ."<span style='color:red'> <em>IS DOWN</em> </span><strong>$" . $read[4] . "</strong></div>";
                }
                else{
                     echo "<div>" . strtoupper($_POST['symbol']) ."<span style='color:green'> <em>IS UP</em> </span><strong>$" . $read[4] . "</strong></div>";

        }

将代码添加到displayDetails.php

function getLinks(){
    $siteContent = file_get_contents($url);
$div = explode('class="yfi_headlines">',$siteContent); 
    // every thing inside is a content you want

    $innerContent = explode('<div class="ft">',$div)[0]; //now you have inner content of your div;

$list  = explode("<ul>",$innerConent)[1];
$list  = explode("</ul>",$list)[0];

    echo $list;
}

        ?>
        </div>

我只是相同的代码 - 我真的不知道我应该用它做什么?!

1 个答案:

答案 0 :(得分:0)

Idk for fgetcsvfile_get_contents可以将页面的全部内容整理到字符串变量中。 然后你可以搜索字符串中的链接(不要使用正则表达式进行html内容搜索:Link regex

我简要地看了一下雅虎的源代码,你可以这样做: -yfi_headlines是一个div class witch wrappes所需的链接

$siteContent = file_get_contents($url);
$div = explode('class="yfi_headlines">',$siteContent)[1]; // every thing inside is a content you want
搜索div内的

-last类是:ft

$innerContent = explode('<div class="ft">',$div)[0]; //now you have inner content of your div;

重复获取<ul>内部内容

$list  = explode("<ul>",$innerConent)[1];
$list  = explode("</ul>",$list)[0];

现在您有一个格式为<li><a href="href">text</a></li>

的链接列表

使用DOMDocument可以更有效地解析网页: Example 要获取页面内容,您还可以查看此答案 https://stackoverflow.com/a/15706743/2656311

[ADITIONALY]如果它是一个大型网站:在函数开始时执行:ini_set("memory_limit","1024M");所以你可以存储更多的数据!