Web scrapping sjp.pl

0

Cześć,

Od paru dni się męczę z web scrappingiem sjp.pl. Robię gierkę boggle - coś w stylu Scrabble tylko bardziej kompaktowe i na czas ;). I chciałem dodać wygodną funkcję sprawdzania, czy słowo jest dopuszczalne w grach. Ogarnąłem już to od strony logicznej, ale niestety CORS mnie blokuje.

Próbowałem już kilku różnych sposobów, użycie cors() jako middleware, fetche z dodatkowym url corsującym (?) coś takiego znalazłem na forum. Najbliżej działającej wersji rozwiązania jestem w kodzie poniżej - gdy odpali się dodatek w Chrome CORS, wszystko działa, no ale zakładam, że jak się wrzuci to potem na github pages, to nie będzie działało :(. Czy moglibyście coś doradzić, jak to zrobić, by błąd poniżej zacytowany się nie pojawiał?

xhr.js:166 Cross-Origin Read Blocking (CORB) blocked cross-origin response https://sjp.pl/programista with MIME type text/html. See https://www.chromestatus.com/feature/5629709824032768 for more details.

import React from 'react';
import SearchBar from '../SearchBar/SearchBar';
import sjp from '../../apis/sjp';

const axios = require('axios');
const cheerio = require('cheerio');
const cors = require('cors');

class SjpChecker extends React.Component {
  state = { response: [] };

  onWordSubmit = async word => {
    const response = await axios
      .get(`https://sjp.pl/${word}`)
      .then(response => {
        const html = response.data;
        const $ = cheerio.load(html);
        const slowo = $('p')
          .first()
          .text();
        this.setState({ response: slowo });
      })
      .catch(console.error);
    console.log(this.state.response);
  };

  render() {
    return (
      <div className="ui field">
        <SearchBar onFormSubmit={this.onWordSubmit} />
      </div>
    );
  }
}

export default SjpChecker;
1

Nie wiem co tam konkretnie potrzebujesz, ale osobiście najsensowniejsze, co udało mi się wymyślić w temacie komunikacji pomiędzy różnymi stronami to window.postMessage.

https://developer.mozilla.org/en-US/docs/Web/API/Window/postMessage
https://blog.piotrnalepa.pl/2013/06/24/html5-jak-komunikowac-sie-miedzy-stronami-za-pomoca-html5-postmessage-api/

3

Ale, że próbujesz po stronie przeglądarki w js odwoływać się do innej, nie twojej strony i tam blokuje cors? no to się nie da tego obejść. Po to on jest, żeby takie rzeczy blokować. Możesz to obejść jedynie tworząc swój backend i nim pośredniczyć w komunikacji.

0

@Freja Draco: dzięki za podpowiedź, ale tak czytam te rozwiązania i chyba nie kumam jak to ma działać w moim wypadku, albo nie wiem. Próbowałem to zaadaptować do siebie, ale nie doszedłem z tym do niczego

@mr_jaro: hm, jeszcze raz: appka będzie sobie docelowo wisiała na heroku/github pages, polega to na tym, że odpalasz sobie grę i jak potrzebujesz, to wpisujesz słowo do sprawdzenia na sjp.pl w formularzu wbudowanym w appkę, a sjp.pl zwraca odpowiedź: "dopuszczalne w grach" : "niedopuszczalne w grach". W momencie kiedy to robię na localhost, zwraca mi błąd CORS i blokuje działanie tej funkcji. Da się, czy się nie da tego obejść?

0

Czy wiesz czym jest CORS? Przeczytaj co to jest i do czego służy. Obecnie mam wrażenie, że chcesz szybko otrzymać rezultat, nawet nie sprawdzając z czego wynika błąd. Jeśli sjp nie ma publicznego api i jescze porobila sobie regulki CORS, no to chyba jasne że nie chcą tego upubliczniac.

Prędzej przyda Ci się jakiś parser htmla i uderzanie ze spreparowanymi nagłówkami. Może tak coś wyciagniesz.

0

@Kefir92: napisałem ci jak to obejść przecież.

0
Kefir92 napisał(a):

@Freja Draco: dzięki za podpowiedź, ale tak czytam te rozwiązania i chyba nie kumam jak to ma działać w moim wypadku, albo nie wiem. Próbowałem to zaadaptować do siebie, ale nie doszedłem z tym do niczego

A bo w sumie niedopatrzyłam, co właściwie potrzebujesz. Mój sposób to jest metoda komunikacji, którą da się zastosować, jak obie domeny są twoje i możesz sobie umieszczać na nich dowolne skrypty, a ty potrzebujesz zassać coś z cudzej strony.

1 użytkowników online, w tym zalogowanych: 0, gości: 1