簡體   English   中英

Puppeteer不會在無頭模式下返回HTML標簽,但是當它不在無頭模式時 - 這是為什么?

[英]Puppeteer won't return an HTML tag in headless mode but will when it is not in headless mode - why is this?

我最近開始在JavaScript中嘗試使用Puppeteer進行網頁編寫,並注意到當我使用無頭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"} ,因為它沒有解決問題。 出於某種原因,當瀏覽器不是無頭時,此代碼將起作用,但是當它沒有時會返回[] 為什么會出現此問題?如何解決?

剛弄清楚我的代碼出了什么問題。 顯然,我試圖抓取的網站(adidas.com)根據標頭過濾掉了請求。 我沒有意識到的是,在無頭模式下,我實際上到達了Adidas的403 Access Denied頁面,這就是我想找到的標簽不存在的原因。 我猜無頭的木偶操作者只是發送HTTP請求的另一種方式,而非無頭的人更像是一個真正的webdriver,這就是為什么非無頭模式沒有被阿迪達斯阻止的原因。

為了修復無頭模式並添加適當的頭文件,我在`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');

事實證明,我所缺少的是標題,以欺騙阿迪達斯網站不阻止我。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM