我希望能够从雅虎财经中获取诸如文章列表等数据。目前我有一个本地托管网页,搜索雅虎财经的股票代码(例如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>";
}
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>
我只是相同的代码 - 我真的不知道我应该用它做什么?!
答案 0 :(得分:0)
Idk for fgetcsv
但file_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")
;所以你可以存储更多的数据!