【问题标题】:Query google search engine?查询谷歌搜索引擎?
【发布时间】:2015-04-25 22:23:47
【问题描述】:

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

查询: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);
}

【问题讨论】:

    标签: php jquery google-chrome


    【解决方案1】:

    Google 会为未启用 JavaScript 的设备 (file_get_html($url)) 提供不同的 html 结构。暂时在 chrome 上 Disable JavaScript 并检查页面。这样您就可以确保在您的脚本中使用正确的div id'sclasses 等。


    根据您的 cmets 更新:

    如果禁用了 JavaScript,Google 不允许通过直接 url 按日期范围进行搜索。 尽管如此,您仍然可以使用daterange Google 运算符来查找在指定日期范围内被 Googlebot 索引的页面。提交的日期必须采用Julian date 格式,并且应省略小数以使该运算符正常工作。

    Example: daterange:2452671-2452671 lisbon
    

    daterange 运算符至少需要一个适当的搜索词,并且可以与其他运算符组合。


    gregoriantojd()

    要将Gregorian date 转换为Julian 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...
    */
    

    【讨论】:

    • 感谢您的回复,我有紧急情况需要处理,这就是我无法回复的原因。当我禁用 javascript 时,您是正确的,查询不再使用我指定的日期范围,它只返回正常结果。您能否建议一个可能适用于日期范围的查询?
    • Google 数据范围:运营商接受儒略年,即:daterange:2451607-2451610 ,您可以发布您使用的查询的示例吗?
    • 查询:google.com/…
    • @user3002303 我到家后看看。
    • 非常棒!我唯一的另一个问题是如何将搜索结果增加到 10 多个,但我将不得不提出另一个问题,我相信。
    【解决方案2】:

    您在您发布的代码中的 url 中有 linebreak

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

    Linebreak 通常表示为LF 字符(0x0D,在类unix 系统上)或CR+LF 字符(0x0D+0x0A,windows)。

    因此,如果您仔细查看您请求的 url,您的脚本会发送一个带有名为 %0D%0Aq insted 的 q 的 GET 参数的请求。

    为了纠正这一点,您应该将上面的整个两行放在一行上,或者将换行符放在字符串文字之外,在您的情况下,这些文字是每对单个 qoutes 之间的字符串,例如(第二行开头的点使其更容易不要忽视两线连接):

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

    【讨论】:

    • 这是复制和粘贴的方式,因为字符串中没有空格
    • 当我在 google 中复制并粘贴回显的 URL 时,它可以工作,但不能在脚本执行中。
    猜你喜欢
    • 2017-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-05
    • 2014-01-06
    • 2022-12-03
    • 2019-09-19
    • 1970-01-01
    相关资源
    最近更新 更多