Я запрашиваю html контента с сайта с топором ios в JS, но сайт блокирует мой запрос - PullRequest
3 голосов
/ 08 апреля 2020

Я хочу, чтобы мой сценарий извлекал данные html с сайта, но он возвращает страницу, которая говорит, что он знает, что мой сценарий является ботом, и дает ему пройти тест «Я не робот».

Вместо того, чтобы возвращать содержимое сайта, он возвращает страницу, которая частично читается ... "

Когда вы просматривали, что-то в вашем браузере \ n заставило нас думать, что вы бот."

Мой код ...

const axios = require('axios');

const url = "https://www.bhgre.com/Better-Homes-and-Gardens-Real-Estate-Blu-Realty-49231c/Brady-Johnson-7469865a";
axios(url, {headers: {
  'Mozilla': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:47.0) Gecko/20100101 Firefox/47.3 Mozilla/5.0 (Macintosh; Intel Mac OS X x.y; rv:42.0) Gecko/20100101 Firefox/43.4.0',
}})
.then(response => {
  const html = response.data;
  console.log(html)
})
.catch(console.error);

Я пробовал несколько разных заголовков, но сайт не обманывает, что мой сценарий - человек. Это в NodeJS.

Возможно, это имеет или не имеет отношения к моей проблеме, но, надеюсь, этот код будет существовать на сервере моего сайта в React, который я создаю. Я не пытаюсь почистить сайт как единое целое. Я хотел бы, чтобы мой сайт читал с этого сайта немного контента вместо того, чтобы вручную обновлять мой сайт битами контента на этом сайте при каждом его изменении.

1 Ответ

3 голосов
/ 08 апреля 2020

Доступ к каждому сайту с помощью топора ios или скручивания невозможен. Существуют различные виды проверок, включая CORS, которые могут помешать кому-либо получить доступ к сайту напрямую через клиента, кроме браузера.

Вы можете достичь того же, используя фантом (https://www.npmjs.com/package/phantom). Это обычно используется скребками, и если вы боитесь, что другой сайт может заблокировать вас для повторного доступа, вы можете использовать произвольный интервал перед выполнением запросов. Если вам нужно прочитать что-то со страницы HTML, вы можете использовать cheerio (https://www.npmjs.com/package/cheerio).

Надеюсь, это поможет.

Ниже приведен код что я пробовал и работал для вашего URL:

const phantom = require('phantom');

(async () => {
    const url = "https://www.bhgre.com/Better-Homes-and-Gardens-Real-Estate-Blu-Realty-49231c/Brady-Johnson-7469865a";
    const instance = await phantom.create(['--ignore-ssl-errors=yes', '--load-images=no']);
    const page = await instance.createPage();
    const status = await page.open(url);

    if (status !== 'success') {
      console.error(status);
      await instance.exit();
      return;
    }

    const content = await page.property('content');
    await instance.exit();
    console.log(content);
})();
...