我正在尝试在我的网站中制作一个程序,以测试不同搜索的热门搜索结果是否相同。例如,它应该告诉“十二”和“十二”的最高搜索结果是相同的,因为两者的最高结果是https://en.wikipedia.org/wiki/12_(number)。使用谷歌感觉幸运的搜索方法,他们将重定向到同一页面,但我不知道如何获取重定向的网址或其内容,以确定它们是否相同。
我一直试图通过在iframe中搜索(12和12),然后获取iframe重定向到的网址来实现此目的,但由于它们位于不同的域中,我无法使其工作。反正有吗?
此外,如果有更好的方法可以做到这一点,那么使用感觉幸运的搜索也可以。
答案 0 :(得分:2)
由于安全限制,您的浏览器沙箱来自不同域的iframe,以防止XSS。有相当广泛的规则来阻止此类活动,因为攻击者可以轻松加载敏感网站并从中搜集个人信息。即使在JavaScript中使用GET请求也会阻止您从跨域页面收集信息。
要从Google搜索页面进行抓取,我会使用外部工具,例如Node.js和Nightwatch.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完成此操作,因为您已经在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.php
向compare.php
发出POST请求。 compare.php
然后发布对发布的两个URL的GET请求,然后使用重定向URL将POST请求发回compareindex.php
,其中显示值。