Php 查询谷歌搜索引擎?
我试图查询谷歌搜索引擎的日期,以获得第一页的结果,然后处理它。我当前使用的查询返回结果,但不在我设置的日期范围内;如果我将同一个查询复制到google中,它会对日期起作用,但不会从我的PHP脚本中起作用。脚本仅返回当前或正常结果,就好像没有设置日期参数一样。下面是使用的部分代码片段。下面是我所指的查询以及$url变量中发布的代码片段 查询:Php 查询谷歌搜索引擎?,php,jquery,google-chrome,Php,Jquery,Google Chrome,我试图查询谷歌搜索引擎的日期,以获得第一页的结果,然后处理它。我当前使用的查询返回结果,但不在我设置的日期范围内;如果我将同一个查询复制到google中,它会对日期起作用,但不会从我的PHP脚本中起作用。脚本仅返回当前或正常结果,就好像没有设置日期参数一样。下面是使用的部分代码片段。下面是我所指的查询以及$url变量中发布的代码片段 查询:https://www.google.com/search?q=“.$Query.&source=lnt&tbs=cdr%3A1%2.$startDate.$
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=(.+)&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);
}
$Query=$\u POST['Query'];
$Query=str_replace(“,“+”,$Query);
如果($\u POST['Start\u date']=''){
$startday='1';
$startmonth='11';
$startyear='2011';
}
如果($_POST['End\u 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';
如果($_POST['Query']!=''){
$url='1https://www.google.com/search?
q='.$Query.&source=lnt&tbs=cdr%3A1%2'.$startDate.$EndDate.&tbm=';
回显$url。“”;
$html=file\u get\u html($url);
$searchresults=array();
$linkObjs=$html->find('h3.ra');
foreach($linkObjs作为$linkObj){
$link=trim($linkObj->href);
//如果它不是直接链接,而是在其中找到的url引用,则提取
如果(!preg_-match('/^https?/',$link)&&preg_-match('/q=(.+)&sa=/U',$link,$matches)&&preg_-match('/^https?/',$matches[1]){
$link=$matches[1];
}如果(!preg_match('/^https?/',$link)){//如果不是有效链接,则跳过
继续;
}
数组推送($searchresults,$link);
}
谷歌为未启用JavaScript
的设备提供了不同的html结构(file\u get\u html($url)
)。暂时在chrome上查看页面。这样你就可以确保在脚本中使用正确的div id
、类等
根据您的评论更新:
如果禁用JavaScript,Google不允许通过直接url按日期范围进行搜索。
尽管如此,您仍然可以使用daterange
Google操作符在指定的日期范围内查找由Googlebot编制索引的页面。提交的日期必须采用Julian date
格式,并且应省略分数以使该操作符正常工作
Example: daterange:2452671-2452671 lisbon
daterange
运算符至少需要一个合适的搜索词,并且可以与其他运算符组合使用
gregoriantojd()
要将Gregorian日期
转换为Julian日期
,您可以使用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(2014年12月28日);//2457020
$nResults=“100”;
$Query=“里斯本”;
$url=”https://www.google.com/search?q=$Query+daterange:$startDate-$endDate&btnG=Search&num=$nResults&gbv=1”;
回显$url。“”;
$html=file\u get\u html($url);
$searchresults=array();
$linkObjs=$html->find('h3.ra');
foreach($linkObjs作为$linkObj){
$link=trim($linkObj->href);
//如果它不是直接链接,而是在其中找到的url引用,则提取
如果(!preg_-match('/^https?/',$link)&&preg_-match('/q=(.+)&sa=/U',$link,$matches)&&preg_-match('/^https?/',$matches[1]){
$link=$matches[1];
}如果(!preg_match('/^https?/',$link)){//如果不是有效链接,则跳过
继续;
}
数组推送($searchresults,$link);
}
打印(搜索结果);
/*
数组([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
等
*/
您发布的代码中有换行符内部url:
$url = 'https://www.google.com/search?
q='.$Query.'&source=lnt&tbs=cdr%3A1%2'.$startDate.$EndDate.'&tbm=';
通常表示为LF
字符(0x0D
,在类unix系统上)或CR
+LF
字符(0x0D
+0x0A
,windows)
因此,如果仔细查看请求的url,脚本将发送一个requst,其中GET参数名为%0D%0Aq
,而不是q
为了纠正这一点,您应该将整个两行放在一行上,或者将换行符放在字符串文字的外部,在您的情况下,这些文字是每对单独的QOUTE之间的字符串,例如(第二行开头的点更容易避免忽略两行的重叠):
这就是它复制和粘贴的方式,因为字符串中没有空格。当我在谷歌中复制和粘贴回显URL时,它可以工作,但在脚本执行中不起作用。感谢我紧急处理的回复,这就是我无法响应的原因。当我禁用javascript时,你是对的。查询不再使用我指定的日期范围,它只是t返回正常结果。你能建议一个可能适用于日期范围的查询吗?Google datarange:operator accept Julian years,即:daterange:2451607-2451610
,你能发布一个你使用的查询示例吗?查询:@user3002303我到家后会看一看。效果非常好!我唯一的问题是如何增加如果搜索结果超过10个,我将不得不问另一个问题,我相信。
$url = 'https://www.google.com/search?
q='.$Query.'&source=lnt&tbs=cdr%3A1%2'.$startDate.$EndDate.'&tbm=';
$url = 'https://www.google.com/search?q='
. $Query . '&source=lnt&tbs=cdr%3A1%2' . $startDate . $EndDate . '&tbm=';