识别相同的“感觉幸运”搜索

时间:2018-05-28 19:32:48

标签: javascript php html node.js

我正在尝试在我的网站中制作一个程序,以测试不同搜索的热门搜索结果是否相同。例如,它应该告诉“十二”和“十二”的最高搜索结果是相同的,因为两者的最高结果是https://en.wikipedia.org/wiki/12_(number)。使用谷歌感觉幸运的搜索方法,他们将重定向到同一页面,但我不知道如何获取重定向的网址或其内容,以确定它们是否相同。

我一直试图通过在iframe中搜索(12和12),然后获取iframe重定向到的网址来实现此目的,但由于它们位于不同的域中,我无法使其工作。反正有吗?

此外,如果有更好的方法可以做到这一点,那么使用感觉幸运的搜索也可以。

1 个答案:

答案 0 :(得分:2)

由于安全限制,您的浏览器沙箱来自不同域的iframe,以防止XSS。有相当广泛的规则来阻止此类活动,因为攻击者可以轻松加载敏感网站并从中搜集个人信息。即使在JavaScript中使用GET请求也会阻止您从跨域页面收集信息。

Node.js方法

要从Google搜索页面进行抓取,我会使用外部工具,例如Node.jsNightwatch.js,这可以用来轻松自动执行您正在查找的网络任务完成。

因为您只是想简单地比较"感觉幸运的结果页面"搜索时,您可以使用Node.js request库来执行请求,并比较结果数据。这是一些有效的代码:

var request = require("request");

var url1 = "https://www.google.com/search?hl=en&q=wikipediatwelve&btnI=I'm+Feeling+Lucky&aq=f&oq=";
var url2 = "https://www.google.com/search?hl=en&q=wikipedia&btnI=I'm+Feeling+Lucky&aq=f&oq=";

request(url1, function (error1, response1, body1) {
    request(url2, function (error2, response2, body2) {
        console.log(response1.request.uri.href); // https://en.wikipedia.org/wiki/12_(number)
        console.log(response2.request.uri.href); // https://en.wikipedia.org/wiki/Main_Page
        if(response1.request.uri.href == response2.request.uri.href){
            console.log("Same page!");
        }else{
            console.log("Different page!");
        }
    });
});

如果您的计算机上没有安装Node.js,则可以使用此代码here。只需点击"克隆并编辑此文档"在页面底部,然后注册/。

您也可以在Python等其他平台中使用等效库,而不是Node.js。

PHP方法

您也可以使用PHP完成此操作,因为您已经在Web服务器上使用它了。我们使用两个页面,一个用于输入请求URL并使用结果,另一个用于执行HTTP GET请求。这是一些有效的代码:

重要提示

如果您将这些PHP页面暴露给互联网,任何人都可以使用您的Web服务器向任何URL发出HTTP请求。这是 DANGEROUS ,我强烈建议不要这样做。您需要添加检查以确保不会恶意使用您的代码。如果代码仅供您使用,则不适用,并且绝对无法通过互联网访问。 Security through obscurity不够好!

<强> compareindex.php

<?php
    $sendLoc = "compare.php";
?>

<!-- This part submits the URLs to the compare script to get executed -->
<form action="<?php echo($sendLoc); ?>" method="post">
    <input type="text" name="URL1" placeholder="Enter URL1">
    <input type="text" name="URL2" placeholder="Enter URL2">
    <button type="submit">Submit</button>
</form>

<!-- This part gets the posted values back from the compare script to be processed in JavaScript -->
<script>
    var finalURL1 = "<?php echo($_POST['fURL1']); ?>"; // PHP will fill these variables if we just requested a comparison
    var finalURL2 = "<?php echo($_POST['fURL2']); ?>";

    document.write(finalURL1); //Just an example, displaying the returned values and if they're equal
    document.write("<br>");
    document.write(finalURL2);
    document.write("<br>");
    if(finalURL1 && finalURL2){
        document.write("Equal: " + (finalURL1==finalURL2));
    }
</script>

<强> compare.php

<?php
    $returnLoc = "compareindex.php";
?>

<!-- This part gets the URL values posted and determines the final URLs (after redirect) -->
<?php
    function getRedirectURL($URL) {
        $ch = curl_init(); //Create curl resource 
        curl_setopt($ch, CURLOPT_URL, $URL); //Set starting url 
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); //Return the transfer as a string 
        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); //Follow redirects
        curl_exec($ch); //Execute request to get final url, discard data
        $fURL = curl_getinfo($ch, CURLINFO_EFFECTIVE_URL); //Get final url
        curl_close($ch); //Close curl resource to free up system resources 
        return $fURL; //Return final url
    }

    $URL1 = $_POST['URL1'];
    $URL2 = $_POST['URL2'];

    $returnValues['fURL1'] = getRedirectURL($URL1);
    $returnValues['fURL2'] = getRedirectURL($URL2);
?>

<!-- This part takes the final URLs and posts them back to the original page -->
<form id="redirForm" action="<?php echo($returnLoc); ?>" method="post">
<?php
    foreach ($returnValues as $a => $b) { //Makes a HTML form input for each return value
        echo '<input type="hidden" name="'.htmlentities($a).'" value="'.htmlentities($b).'">';
    }
?>
</form>
<script>
    document.getElementById('redirForm').submit(); //Submit the form automatically
</script>

您在输入框中输入网址,然后当您按提交时,compareindex.phpcompare.php发出POST请求。 compare.php然后发布对发布的两个URL的GET请求,然后使用重定向URL将POST请求发回compareindex.php,其中显示值。

Image of the result