I'm a massive fan of Yahoo's developer tools, I think they're massively underrated by geekdom, and I'm still heavily reliant on their geo-coding services like Placemaker. It makes me pretty sad to admit I've recently switched from Yahoo BOSS to Bing's search API, so I thought I'd share my reasons, together with some PHP sample code.
In a nutshell, BOSS wasn't finding enough results for the sort of work I'm doing. Here's an example search, looking for people called Susan Fogg with public Facebook profiles:
http://www.bing.com/search?q=site%3Awww.facebook.com%2Fpeople+intitle%3A%22Susan+Fogg%22
6 results
http://search.yahoo.com/search?p=site%3Awww.facebook.com%2Fpeople+intitle%3A%22Susan+Fogg%22
1 result
http://www.google.com/search?q=site%3Awww.facebook.com%2Fpeople+intitle%3A%22Susan+Fogg%22&filter=0
15 results
This is not a scientific survey by any means, but Bing seems to index a lot more of the obscure pages on social networks than Yahoo. If only Google offered an API, they would be even better, but switching to Bing still offers a big improvement for my application.
I was nervous that Bing would be crippled by usage terms, but luckily they are effectively unrestricted and can be used for non-user-facing applications like mine.
Here's the code I'm using, as a download or included inline below:
<?php
// You'll ned to get your own API keys for these services. See
// http://developer.yahoo.com/wsregapp/
// http://www.bing.com/developers/createapp.aspx
define('BING_API_KEY', '');
define('YAHOO_API_KEY', '');
function pete_curl_get($url, $params)
{
$post_params = array();
foreach ($params as $key => &$val) {
if (is_array($val)) $val = implode(',', $val);
$post_params[] = $key.'='.urlencode($val);
}
$post_string = implode('&', $post_params);
$fullurl = $url."?".$post_string;
$ch = curl_init();
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
curl_setopt($ch, CURLOPT_URL, $fullurl);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_USERAGENT, 'Mailana (curl)');
$result = curl_exec($ch);
curl_close($ch);
return $result;
}
function perform_boss_web_search($terms)
{
$searchurl = 'http://boss.yahooapis.com/ysearch/web/v1/';
$searchurl .= urlencode(implode(' ', $terms));
$searchparams = array(
'appid' => YAHOO_API_KEY,
'format' => 'json',
'count' => '50',
);
$response = pete_curl_get($searchurl, $searchparams);
$responseobject = json_decode($response, true);
if ($responseobject['ysearchresponse']['totalhits']==0)
return array();
$allresponseresults = $responseobject['ysearchresponse']['resultset_web'];
$result = array();
foreach ($allresponseresults as $responseresult)
{
$result[] = array(
'url' => $responseresult['url'],
'title' => $responseresult['title'],
'abstract' => $responseresult['abstract'],
);
}
return $result;
}
function perform_bing_web_search($terms)
{
$searchurl = 'http://api.bing.net/json.aspx?';
$searchurl .= 'AppId='.BING_API_KEY;
$searchurl .= '&Query='.urlencode(implode(' ', $terms));
$searchurl .= '&Sources=Web';
$searchurl .= '&Web.Count=50';
$searchurl .= '&Web.Offset=0';
$searchurl .= '&Web.Options=DisableHostCollapsing+DisableQueryAlterations';
$searchurl .= '&JsonType=raw';
$response = pete_curl_get($searchurl, array());
$responseobject = json_decode($response, true);
if ($responseobject['SearchResponse']['Web']['Total']==0)
return array();
$allresponseresults = $responseobject['SearchResponse']['Web']['Results'];
$result = array();
foreach ($allresponseresults as $responseresult)
{
$result[] = array(
'url' => $responseresult['Url'],
'title' => $responseresult['Title'],
'abstract' => $responseresult['Description'],
);
}
return $result;
}
if (isset($_REQUEST['q'])) {
$terms = explode(' ', urldecode($_REQUEST['q']));
} else {
$terms = array();
}
$termstring = implode(' ', $terms);
?>
<html>
<head>
<title>Test page for BOSS and Bing search apis</title>
</head>
<body>
<div style="
;padding:20px;">
<center>
<form method="GET" action="index.php">
Search terms: <input type="text" size="40" name="q" value="<?=$termstring?>"/>
</form>
</center>
</div>
<?php
if (count($terms)>0) {
$bingresults = perform_bing_web_search($terms);
$bossresults = perform_boss_web_search($terms);
print '<br/><br/><h2>Bing search results ('.count($bingresults).')</h2><br/>';
foreach ($bingresults as $result) {
print '<a href="'.$result['url'].'">'.$result['title'].'</a><br/>';
print '<span style="font-size:80%">'.$result['abstract'].'</span><br/><hr/>';
}
print '<br/><br/><h2>BOSS search results ('.count($bingresults).')</h2><br/>';
foreach ($bingresults as $result) {
print '<a href="'.$result['url'].'">'.$result['title'].'</a><br/>';
print '<span style="font-size:80%">'.$result['abstract'].'</span><br/><hr/>';
}
}
?>