Puppeteer не вернет HTML-тег в безголовом режиме, но будет, когда он не находится в безголовом режиме - почему это так? - PullRequest
0 голосов
/ 25 марта 2019

Я недавно начал экспериментировать с Puppeteer на JavaScript для веб-скриппинга и заметил, что когда я запускаю свой код с экземпляром Puppeteer без головы, он не возвращает искомый тег, а вместо этого возвращает []. Тем не менее, когда безголовый режим отключен, код возвращает метку просто отлично. Возвращаемый тег:

[ ElementHandle {
    _context:
     ExecutionContext { _client: [CDPSession], _world: [DOMWorld], _contextId: 3 },
    _client:
     CDPSession {
       _events: [Object],
       _eventsCount: 27,
       _maxListeners: undefined,
       _callbacks: Map {},
       _connection: [Connection],
       _targetType: 'page',
       _sessionId: '6950CA7711045DA500204C2EFDAFC5B3' },
    _remoteObject:
     { type: 'object',
       subtype: 'node',
       className: 'HTMLHeadingElement',
       description: 'h1',
       objectId: '{"injectedScriptId":3,"id":3}' },
    _disposed: false,
    _page:
     Page {
       _events: {},
       _eventsCount: 0,
       _maxListeners: undefined,
       _closed: false,
       _client: [CDPSession],
       _target: [Target],
       _keyboard: [Keyboard],
       _mouse: [Mouse],
       _timeoutSettings: [TimeoutSettings],
       _touchscreen: [Touchscreen],
       _accessibility: [Accessibility],
       _networkManager: [NetworkManager],
       _frameManager: [FrameManager],
       _emulationManager: [EmulationManager],
       _tracing: [Tracing],
       _pageBindings: Map {},
       _ignoreHTTPSErrors: false,
       _coverage: [Coverage],
       _javascriptEnabled: true,
       _viewport: [Object],
       _screenshotTaskQueue: [TaskQueue],
       _workers: Map {} },
    _frameManager:
     FrameManager {
       _events: [Object],
       _eventsCount: 3,
       _maxListeners: undefined,
       _client: [CDPSession],
       _page: [Page],
       _networkManager: [NetworkManager],
       _timeoutSettings: [TimeoutSettings],
       _frames: [Map],
       _contextIdToContext: [Map],
       _isolatedWorlds: [Set],
       _mainFrame: [Frame] } } ]

Я пытался использовать await page.goto(url, {"waitUntil" : "networkidle0"});, чтобы заставить программу дождаться полной загрузки страницы, прежде чем возвращать тег, но опять не повезло. Вот мой неисправный код:

const initializeBrowserTask = async (proxy) => {
  console.log("Initializing browser task...");
  if (proxy == '') {
    console.log('No proxy.')
    const browser = await puppeteer.launch({ headless: false });
    return browser;
  } else {
    const browser = await puppeteer.launch({
      'args': ['--proxy-server=`${proxy}`']
    });
    console.log("Proxy: `${proxy}`")
    return browser;
  };

}

const browserTask = async (proxy, url) => {
  const browser = await initializeBrowserTask(proxy);
  let check = 0
  const page = await browser.newPage();
  console.log('Running...')
  await page.goto(url);
  console.log("Arrived at URL!")
  let status = await page.$x('//*[@id="app"]/div[1]/div/div[1]/h1');
  console.log(status)


};

browserTask('', 'http://adidas.com/yeezy')

Я удалил {"waitUntil" : "networkidle0"}, как упоминалось ранее, поскольку это не решило проблему. По какой-то причине этот код будет работать, когда браузер не без заголовка, но вернет [], когда он есть. Почему возникает эта проблема и как я могу ее исправить?

1 Ответ

0 голосов
/ 25 марта 2019

Просто выяснил, что не так с моим кодом. Судя по всему, сайт, который я пытался очистить (adidas.com), отфильтровывает запросы, основанные на заголовках. Чего я не осознавал, так это того, что в безголовом режиме я фактически заходил на страницу Adidas 403 Access Denied, поэтому тег, который я хотел найти, не существовал. Я полагаю, что безголовый кукловод - это просто еще один способ отправки HTTP-запросов, в то время как безголовый - это скорее настоящий веб-драйвер, поэтому Adidas не блокировал режим без заголовка.

Чтобы исправить режим без головы и добавить соответствующие заголовки, я использовал эту строку кода перед `page.goto (url); ' строка:

await page.setUserAgent('Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.109 Safari/537.36');

Оказывается, все, чего мне не хватало, - это заголовки, чтобы заставить сайт Adidas не блокировать меня.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...