尝试使用javascript下载所有Google搜索图像

我正在尝试制作一个脚本,该脚本下载所有Google搜索图像以制作我的ml项目的数据集。我正在按照this tutorial下载高分辨率图片,但是突然出现一个错误,提示:

拒绝加载脚本'https://ajax.googleapis.com/ajax/libs/jquery/2.2.0/jquery.min.js',因为它违反了以下内容安全策略指令:“ script-src'report-sample''nonce-Q6xQOKx7e + e0TlGbQFPX3g''unsafe-inline'”。请注意,未明确设置“ script-src-elem”,因此将“ script-src”用作后备

一些帮助将不胜感激。我通过将其粘贴到javascript控制台中来运行此代码。谢谢!

var script = document.createElement('script');
script.src = "https://ajax.googleapis.com/ajax/libs/jquery/2.2.0/jquery.min.js";
document.getElementsByTagName('head')[0].appendChild(script);

// grab the URLs
var urls = $('.rg_di .rg_meta').map(function() {
  return JSON.parse($(this).text()).ou;
});

// write the URls to file (one per line)
var textToSave = urls.toArray().join('\n');
var hiddenElement = document.createElement('a');
hiddenElement.href = 'data:attachment/text,' + encodeURI(textToSave);
hiddenElement.target = '_blank';
hiddenElement.download = 'urls.txt';
hiddenElement.click();

chieiey2009 回答:尝试使用javascript下载所有Google搜索图像

您将jQuery用于可以使用本机javascript完成的操作。

document.querySelectorAll主要与jQuery一起使用选择器。它不返回数组,而是(在我看来)笨拙的NodeList

要使其正确迭代,我更喜欢将其spread放入数组,然后在其上调用forEach

[...document.querySelectorAll('.foo')].forEach((element,index) => {
   console.log(element.innerText);
});
<div class="foo">bar</div>
<div class="foo">baz</div>
<div class="foo">bal</div>

此外,获取数据的方法目前不同。

在所有图像上,您需要先触发一次点击。
这将激活javascript事件处理程序,该事件处理程序将设置图片祖父母的href。
您需要先让Google事件处理程序运行,以便我们分离其余的执行流程,以便google脚本可以执行此操作并更新DOM。我们使用setTimeout()进行此操作。
然后,当google脚本运行时,DOM元素已更新,我们计划的超时时间有运行的机会,现在href已被填充。

在单击之前,链接如下所示: before click

点击后

after click

我们现在看到已填充href。输入的网址是:

https://www.google.com/imgres?imgurl=https%3A%2F%2Fwww.researchgate.net%2Fprofile%2FJerome_Droniou%2Fpublication%2F305983658%2Ffigure%2Ffig5%2FAS%3A668650201690119%401536430039650%2FMesh-patterns-for-the-tests-using-the-HMM-method-left-Test-1-right-Test-2.png&imgrefurl=https%3A%2F%2Fwww.researchgate.net%2Ffigure%2FMesh-patterns-for-the-tests-using-the-HMM-method-left-Test-1-right-Test-2_fig5_305983658&tbnid=_UuLNMPCQAT0uM&vet=12ahUKEwjhsu31zcnoAhWbgKQKHR3jAdUQMygAegUIARDTAQ..i&docid=LThLi5REXoitfM&w=428&h=428&q=hmm%20test&ved=2ahUKEwjhsu31zcnoAhWbgKQKHR3jAdUQMygAegUIARDTAQ

在此网址中,我们在imgurl=之后看到以https开头的内容。这是我们的目标图片网址,但已经过urlencode编码,并且是较大网址的一部分。
因此,我们使用一些简单的子字符串操作来操作字符串。

然后我们还有奇怪的字符

https%3A%2F%2Fwww.researchgate.net%2Fprofile%2FJerome_Droniou%2Fpublication%2F305983658%2Ffigure%2Ffig5%2FAS%3A668650201690119%401536430039650%2FMesh模式用于使用HMM的测试方法-left-Test-1-right-Test-2.png

为此,我们可以使用decodeURIComponent()将其转换为普通网址

document.write(decodeURIComponent('https%3A%2F%2Fwww.researchgate.net%2Fprofile%2FJerome_Droniou%2Fpublication%2F305983658%2Ffigure%2Ffig5%2FAS%3A668650201690119%401536430039650%2FMesh-patterns-for-the-tests-using-the-HMM-method-left-Test-1-right-Test-2.png'))

然后将其添加到数组中。

处理完所有内容后,我们将创建urls文件并下载。

var urls = [];
var count = 0;
[...document.querySelectorAll('.rg_i')].forEach((element,index) => {
   let el = element.parentElement.parentElement;
   el.click();
   count++;
   setTimeout(() => {
       let google_url = el.href;

       let start = google_url.indexOf('=',google_url.indexOf('imgurl'))+1;
       let encoded = google_url.substring(start,google_url.indexOf('&',start));
       let url = decodeURIComponent(encoded);
       urls.push(url);
       console.log(count);
       if(--count == 0) {
          let textToSave = urls.join('\n');
          let hiddenElement = document.createElement('a');
          hiddenElement.href = 'data:attachment/text,' + encodeURI(textToSave);
          hiddenElement.target = '_blank';
          hiddenElement.download = 'urls.txt';
          hiddenElement.click();
       }

   },50);

});
,

拒绝加载脚本是因为内容安全策略。在Firefox中,您可以通过网址栏中的about:config禁用csp,并将security.csp.enable设置为false。

我尝试在Firefox控制台中使用以下代码进行测试:

    javascript: (function(e,s) {
    e.src = s;
    e.onload = function() {
        jQuery.noConflict();
        console.log('jQuery injected');

        jQuery(".rg_i").get().forEach(function(entry,index,array) {
        var src = jQuery('.rg_i').attr('src');
        console.log("src1: " + src);
        });

        var src = jQuery('.rg_i').attr('src');
        console.log("src2: " + src);
    };
    document.head.appendChild(e);

})(document.createElement('script'),'//ajax.googleapis.com/ajax/libs/jquery/2.2.0/jquery.min.js');

祝你好运:)

,

我认为您需要添加以下内容:

<meta http-equiv="Content-Security-Policy" content="default-src https://cdn.example.net; child-src 'none'; object-src 'none'">

将其添加到策略中,有很多不同的方式(请参阅文档)。

本文链接:https://www.f2er.com/2529727.html

大家都在问