正在尝试使用 javascript 下载所有 google 搜索图像

Trying to download all of the google search images using javascript

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

Refused to load the script 'https://ajax.googleapis.com/ajax/libs/jquery/2.2.0/jquery.min.js' because it violates the following Content Security Policy directive: "script-src 'report-sample' 'nonce-Q6xQOKx7e+e0TlGbQFPX3g' 'unsafe-inline'". Note that 'script-src-elem' was not explicitly set, so 'script-src' is used as a fallback

如果能提供一些帮助,我们将不胜感激。我 运行 将此代码粘贴到 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();

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

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

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

拒绝加载脚本是因为内容安全策略。在 Firefox 中,您可以通过 url 栏中的 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');

祝你好运:)

您正在使用 jQuery 来完成本机可以完成的事情 javascript。

document.querySelectorAll works with selectors mainly as jQuery does. It does not return an array, but an (in my opinion) unwieldy NodeList.

为了让它正确迭代,我更喜欢spread it into an array and then call 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 已被填充。

点击前 link 看起来像这样:

点击后

我们现在看到 href 已被填充。已输入的url为:

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

在这个 url 中,我们在 imgurl= 之后看到以 https 开头的内容。这是我们的目标图像 url,但它已经过 url 编码并且是更大的 url.
的一部分 所以我们用一些简单的子字符串操作来操作字符串。

那我们还有奇怪的字符

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

为此,我们可以使用 decodeURIComponent() 将其转换为正常的 url

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);

});