Próbuję stworzyć skrypt, który pobierze wszystkie obrazy wyszukiwania Google w celu utworzenia zestawu danych mojego projektu ml. Obserwowałem ten samouczek, aby pobrać obraz w wysokiej rozdzielczości, ale nagle pojawia się błąd, który mówi:

Odmówiono załadowania skryptu „https: // ajax. googleapis.com/ajax/libs/jquery/2.2.0/jquery.min.js ', ponieważ narusza następującą dyrektywę polityki bezpieczeństwa treści: "script-src' report-sample '' nonce-Q6xQOKx7e + e0TlGbQFPX3g ' „niebezpieczne w tekście” ”. Zwróć uwagę, że „script-src-elem” nie zostało jawnie ustawione, więc „script-src” jest używane jako rozwiązanie zastępcze

Pewna pomoc byłaby bardzo mile widziana. Uruchamiam ten kod, wklejając go do konsoli javascript. Dzięki!

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();
2
nitesh sonwani 2 kwiecień 2020, 11:25

3 odpowiedzi

Najlepsza odpowiedź

Używasz jQuery do czegoś, co można zrobić w natywnym javascript.

document.querySelectorAll działa z selektorami głównie tak, jak robi to jQuery . Nie zwraca tablicy, ale (moim zdaniem) nieporęczną NodeList.

Aby uzyskać poprawną iterację, wolę rozpowszechniać do tablicy, a następnie wywołaj forEach na nim.

[...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>

Ponadto metoda pozyskiwania danych jest obecnie inna.

Na wszystkich obrazach musisz najpierw wywołać kliknięcie.
Spowoduje to aktywację programów obsługi zdarzeń javascript, które ustawią href dziadka obrazu.
Musisz najpierw uruchomić programy obsługi zdarzeń Google, więc odłączamy resztę naszego przepływu wykonywania, aby skrypt Google mógł zrobić swoje i zaktualizować DOM. Robimy to za pomocą setTimeout ().
Następnie, gdy skrypty Google zostały uruchomione, elementy DOM zostały zaktualizowane, nasze zaplanowane limity czasu mają szansę na uruchomienie, a teraz href zostały wypełnione.

Przed kliknięciem link wygląda następująco: przed kliknięciem

Po kliknięciu po kliknięciu

Teraz widzimy, że href został wypełniony. Wprowadzony adres URL to:

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

W tym adresie URL po imgurl= widzimy coś zaczynającego się od https. To jest nasz docelowy adres URL obrazu, ale został on zakodowany jako urlenkodowany i stanowi część większego adresu URL.
Więc manipulujemy łańcuchem za pomocą prostych operacji na podciągach.

Wtedy nadal mamy dziwne postacie

Https% 3A% 2F% 2Fwww.researchgate.net% 2Fprofile% 2FJerome_Droniou% 2Fpublication% 2F305983658% 2Ffigure% 2Ffig5% 2FAS% 3A668650201690119% 401536430039650% 2FMesh-patterns-for-the-left-testing Test-1-prawy-test-2.png

Do tego możemy użyć decodeURIComponent () aby przekształcić go w normalny adres 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'))

Następnie dodajemy to do naszej tablicy.

Kiedy już wszystko załatwiliśmy, tworzymy plik URL i pobieramy go.

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

});
2
Tschallacka 2 kwiecień 2020, 11:25

Myślę, że musisz dodać coś takiego:

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

Dodaj to do zasad, istnieje wiele różnych sposobów (zobacz dokumentację).

-1
david 2 kwiecień 2020, 13:12

Odmówiono załadowania skryptu z powodu Polityki bezpieczeństwa treści. W przeglądarce Firefox możesz wyłączyć csp przez about: config w pasku adresu URL i ustawić security.csp.enable na false.

Próbowałem przetestować poniższy kod w konsoli 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');

Powodzenia :)

1
TomInCode 2 kwiecień 2020, 10:20