2015-04-25 124 views
1

我想按日期查询谷歌搜索引擎,以获得第一页结果然后处理它。我目前使用的查询返回结果,但不是在我设置的日期范围内;如果我将相同的查询复制到谷歌它适用于日期,但不是从我的PHP脚本。该脚本只返回当前或正常结果,就好像日期参数未设置一样。下面是使用的代码片段的一部分。我所指的查询以及在$ url变量中发布的代码片段中。查询谷歌搜索引擎?

查询:https://www.google.com/search?q='.$Query.'&source=lnt&tbs=cdr%3A1%2'.$startDate.$EndDate.'&tbm=

$Query= $_POST['Query']; 
$Query=str_replace(" ","+",$Query); 
if ($_POST['Start_date']==''){ 
$startday='1'; 
$startmonth='11'; 
$startyear='2011'; 
} 
if ($_POST['End_date']==''){ 
$endday='1'; 
$endmonth='11'; 
$endyear='2013'; 
} 
$startDate='Ccd_min%3A'.$startmonth.'%2F'.$startday.'%2F'.$startyear.'.%2'; 
$EndDate='Ccd_max%3A'.$endmonth.'%2F'.$endday.'%2F'.$endyear.''; 

if ($_POST['Query']!=''){ 
$url = 'https://www.google.com/search? 
q='.$Query.'&source=lnt&tbs=cdr%3A1%2'.$startDate.$EndDate.'&tbm='; 
echo $url .'<p>'; 
$html = file_get_html($url); 
$searchresults=array(); 
$linkObjs = $html->find('h3.r a'); 
foreach ($linkObjs as $linkObj) { 
$link = trim($linkObj->href); 

    // if it is not a direct link but url reference found inside it, then extract 
    if (!preg_match('/^https?/', $link) && preg_match('/q=(.+)&amp;sa=/U', $link, $matches) && preg_match('/^https?/', $matches[1])) { 
     $link = $matches[1]; 
    } else if (!preg_match('/^https?/', $link)) { // skip if it is not a valid link 
     continue; 
    } 
    array_push($searchresults,$link); 
} 

回答

1

谷歌提出了一个不同的HTML结构,设备,而不JavaScript启用(file_get_html($url))。暂时在Chrome上Disable JavaScript并检查页面。这样你就一定会得到正确的div id's,classes等在你的脚本上使用。


更新根据您的意见:

谷歌不允许通过直接链接按日期范围的搜索,如果JavaScript被禁用。 虽然,您仍然可以使用Google运营商的daterange查找由Googlebot在指定的日期范围内编制索引的网页。提交的日期必须为Julian date格式,并且应该省略分数以便该操作员正常工作。

Example: daterange:2452671-2452671 lisbon 

daterange操作者需要至少一个适当的搜索词,并且可以与其它运营商进行组合。


gregoriantojd()

要转换Gregorian dateJulian date可以使用PHP函数gregoriantojd(int $month , int $day , int $year),即:

$startDate = gregoriantojd(12, 28, 2011); 
//2455924 

$endDate = gregoriantojd(12, 28, 2014); 
//2457020 

你的搜索$url应该是这样的:

$url = "https://www.google.pt/search?q=lisbon+daterange:2455924-2457020&btnG=Search&num=100&gbv=1" 

最终代码:

include_once("simple_html_dom.php"); 

$startDate = gregoriantojd(12, 28, 2011); //2455924 
$endDate = gregoriantojd(12, 28, 2014); //2457020 
$nResults = "100"; 
$Query= "lisbon"; 

$url = "https://www.google.com/search?q=$Query+daterange:$startDate-$endDate&btnG=Search&num=$nResults&gbv=1"; 

echo $url .'<p>'; 
$html = file_get_html($url); 
$searchresults=array(); 
$linkObjs = $html->find('h3.r a'); 
foreach ($linkObjs as $linkObj) { 
$link = trim($linkObj->href); 

    // if it is not a direct link but url reference found inside it, then extract 
    if (!preg_match('/^https?/', $link) && preg_match('/q=(.+)&amp;sa=/U', $link, $matches) && preg_match('/^https?/', $matches[1])) { 
     $link = $matches[1]; 
    } else if (!preg_match('/^https?/', $link)) { // skip if it is not a valid link 
     continue; 
    } 
    array_push($searchresults,$link); 
} 
print_r($searchresults); 

/* 
Array ([0] => http://www.cnn.com/2014/01/25/travel/lisbon-coolest-city/ [1] => http://www.tripadvisor.com/Tourism-g189158-Lisbon_Lisbon_District_Central_Portugal-Vacations.html 
etc... 
*/ 
+0

感谢您的回复,我有紧急事项要处理,因此我无法回复。你是正确的,当我禁用JavaScript的查询不再使用我指定的日期范围,它只是返回正常结果。你能建议一个可能适用于日期范围的查询吗? – Dario

+0

Google datarange:运营商接受Julian年,即:'daterange:2451607-2451610',您可以发布您使用的查询示例吗? –

+0

查询:https://www.google.com/search?q=pdf&source=lnt&tbs=cdr%3A1%2Ccd_min%3A11%2F1%2F2011.%2Ccd_max%3A11%2F1%2F2013&tbm= – Dario

0

你有换行符内部URL在您发布的代码:

$url = 'https://www.google.com/search? 
q='.$Query.'&source=lnt&tbs=cdr%3A1%2'.$startDate.$EndDate.'&tbm='; 

Linebreak通常represened为LF字符(0x0D,在类Unix系统)或CR + LF个字符(0x0D + 0x0A,窗口)。

因此,如果您仔细查看了您请求的网址,那么脚本会发送一个名为%0D%0Aq的GET参数的请求,其名称为q

为了实现这一点,您应该在一行上面放置整行两行,或者您的猫在行字符串之外放置换行符,这是您的情况下每对单行字符之间的字符串。g(在第二行开始的点更容易不会忽略双线横幅):

$url = 'https://www.google.com/search?q=' 
    . $Query . '&source=lnt&tbs=cdr%3A1%2' . $startDate . $EndDate . '&tbm='; 
+0

这是它如何复制和粘贴,因为字符串中没有空格 – Dario

+0

当我复制并粘贴回显网址在谷歌它的作品,但不是在脚本执行。 – Dario

+0

哦对不起,我认为它是在你的代码相同:) – bittomix