使用puppeteer获取完整的网页源html-但始终缺少某些部分

时间:2020-08-27 10:29:36

标签: javascript web-scraping web-crawler puppeteer headless-browser

我正在尝试在以下网页上抓取特定字符串:

https://www.booking.com/hotel/nl/scandic-sanadome-nijmegen.en-gb.html?checkin=2020-09-19;checkout=2020-09-20;i_am_from=nl;

我想从此网页源获取的信息是下面的字符串中的序列号(这是我在右键单击鼠标时可以搜索的内容->

"View Page source"): 
 name="nr_rooms_4377601_232287150_0_1_0"/ name="nr_rooms_4377601_232287150_1_1_0" 

我正在使用“ puppeteer”,下面是我的代码:

const puppeteer = require('puppeteer');
(async() => {
    const browser = await puppeteer.launch();
    const page = await browser.newPage();
    //await page.goto('https://example.com');
    const response = await page.goto("My-url-above");
    let bodyHTML = await page.evaluate(() => document.body.innerHTML);
    let outbodyHTML = await page.evaluate(() => document.body.outerHTML);
    console.log(await response.text());
    console.log(await page.content());
    await browser.close();
})()

但是我无法在response.text()page.content()中找到要查找的字符串。

我在页面中使用了错误的方法吗?

如何将实际的页面源转储到网页上,这与我右键单击鼠标时完全相同?

1 个答案:

答案 0 :(得分:0)

如果您调查这些字符串出现的位置,那么您可以在具有特定类(<select>)的.hprt-nos-select元素中看到它们:

<select
  class="hprt-nos-select"
  name="nr_rooms_4377601_232287150_0_1_0"
  data-component="hotel/new-rooms-table/select-rooms"
  data-room-id="4377601"
  data-block-id="4377601_232287150_0_1_0"
  data-is-fflex-selected="0"
  id="hprt_nos_select_4377601_232287150_0_1_0"
  aria-describedby="room_type_id_4377601 rate_price_id_4377601_232287150_0_1_0 rate_policies_id_4377601_232287150_0_1_0"
>

您将等到将此元素加载到DOM中,然后它也将在页面源中可见:

await page.waitForSelector('.hprt-nos-select', { timeout: 0 });

实际上,您遇到的问题是,您访问的url有一些额外的URL参数: ?checkin=2020-09-19;checkout=2020-09-20;i_am_from=nl; 伪造者没有考虑 >(您可以获取完整的屏幕截图,您会看到它仍然具有默认的酒店搜索表单,但没有特定的酒店优惠,而不是您所期望的)。

您应该使用伪造者(page.click()等与搜索表单进行交互,以自行设置日期和原籍国,以实现预期的页面内容。

相关问题