puppeteer爬取腾讯漫画资源

puppeteer是2017年5月,由GoogleChrome推出的node包,内置了headless chrome/chromium浏览器,并提供丰富API以全面操控浏览器。可用于截图、生成PDF、数据爬取、自动测试等。
较于phantomjs,puppeteer可以直接用node调用,且API更易用。

对于网站资源的爬取,往往会遇到一个困难:所需的资源并不直接存在,而是经过了加密。比如腾讯漫画的漫画图片就经过了RSA加密。

虽然前端不存在真正的加密,但要找到加密流程并重新实现还是比较复杂的。

利用headless browser进行模拟加载,对加载完成的页面进行资源的查找,是一种替代的方案。这种方法效率要低一些,但开发成本也更低。

下面是一个用puppeteer爬取腾讯漫画资源的例子:

const puppeteer = require('puppeteer');

const wait = (ms) => new Promise(resolve => setTimeout(() => resolve(), ms));

(async () => {
  // 创建browser和page
  const browser = await puppeteer.launch();
  const page = await browser.newPage();

  // 捕获异常,保证browser.close()有效执行 
  try {
    // 转到《海贼王》最新一话页面
    await page.goto('http://ac.qq.com/ComicView/chapter/id/505430/cid/915');

    // 获取图片数目和高度
    const imagesLen = await page.$$eval('#comicContain img[data-h]', imgs => imgs.length);
    const imgHeight = await page.$eval('#comicContain img[data-h]', img => img.getAttribute('data-h'));

    // 自动滚动,使懒加载图片加载
    const step = 1;
    for (let i=1; i < imagesLen / step; i ++) {
      await page.evaluate(`window.scrollTo(0, ${i * imgHeight * step})`);
      // 为确保懒加载触发,需要等待一下。实际需要的时间可能不止100ms
      await wait(100);
    }

    // 获取图片url
    const images = await page.$$eval('#comicContain img[data-h]', imgs => {
      const images = [];
      imgs.forEach(img => {
         images.push(img.src);
      });
      return images;
    });
    console.log(images);
  } catch (err) {
    console.error(err);
  }

  // 关闭浏览器
  await browser.close();
})();

输出:

[ 'http://ac.tc.qq.com/store_file_download?buid=15017&uin=1521420441&dir_path=/&name=19_08_47_49d8b179d3b33a174c0a2e88fe694c03_25517.jpg',
  'http://ac.tc.qq.com/store_file_download?buid=15017&uin=1521420441&dir_path=/&name=19_08_47_ffce200ae6fd6362d62fc668fee04fda_25518.jpg',
  'http://ac.tc.qq.com/store_file_download?buid=15017&uin=1521420441&dir_path=/&name=19_08_47_61815ec742bb71fc229566af0ec540b6_25519.jpg',
  'http://ac.tc.qq.com/store_file_download?buid=15017&uin=1521420441&dir_path=/&name=19_08_47_e8cc16772500e82959d0d2d529747987_25520.jpg',
  'http://ac.tc.qq.com/store_file_download?buid=15017&uin=1521420441&dir_path=/&name=19_08_47_f87e8298efe6d0f53d9effa8d4fae632_25521.jpg',
  'http://ac.tc.qq.com/store_file_download?buid=15017&uin=1521420441&dir_path=/&name=19_08_47_fccdb06ce0fbdc541cabdc1c97dfa809_25522.jpg',
  'http://ac.tc.qq.com/store_file_download?buid=15017&uin=1521420441&dir_path=/&name=19_08_47_e15c61db90fd67b4363755006b35251e_25523.jpg',
  'http://ac.tc.qq.com/store_file_download?buid=15017&uin=1521420441&dir_path=/&name=19_08_47_4ee9f370bc0b6fa6d42a39b8333065c3_25524.jpg',
  'http://ac.tc.qq.com/store_file_download?buid=15017&uin=1521420457&dir_path=/&name=19_08_47_87ad69ffccf51eca8f4b7159ad9cdbae_25525.jpg',
  'http://ac.tc.qq.com/store_file_download?buid=15017&uin=1521420458&dir_path=/&name=19_08_47_5d1bfa6849dd409fa426a1c7dae64ee1_25526.jpg',
  'http://ac.tc.qq.com/store_file_download?buid=15017&uin=1521420458&dir_path=/&name=19_08_47_f3d5b55311f403808dd5fb98ddc54519_25527.jpg',
  'http://ac.tc.qq.com/store_file_download?buid=15017&uin=1521420458&dir_path=/&name=19_08_47_a9fcab335b0b1f7f36d935814c0066df_25528.jpg',
  'http://ac.tc.qq.com/store_file_download?buid=15017&uin=1521420458&dir_path=/&name=19_08_47_c5b18da4620c80cf40cc6d75e3c70327_25529.jpg',
  'http://ac.tc.qq.com/store_file_download?buid=15017&uin=1521420458&dir_path=/&name=19_08_47_4d0d0aaebeb19dfd70e711f8bf97906e_25530.jpg',
  'http://ac.tc.qq.com/store_file_download?buid=15017&uin=1521420458&dir_path=/&name=19_08_47_1b6e00039fe54a70e534c098931cb9b3_25531.jpg',
  'http://ac.tc.qq.com/store_file_download?buid=15017&uin=1521420458&dir_path=/&name=19_08_47_a95418c785bd950764422ccd8ca05269_25532.jpg',
  'http://ac.tc.qq.com/store_file_download?buid=15017&uin=1521420458&dir_path=/&name=19_08_47_5f32a58fe438ead1fb40c3cdd097a4e5_25533.jpg',
  'http://ac.tc.qq.com/store_file_download?buid=15017&uin=1521420458&dir_path=/&name=19_08_47_d2dfe29b136c7c42e0ba1bb56a40e5b0_25534.jpg' ]

可见,对延迟加载资源的页面,还需要做一些模拟操作,来使资源加载出来。

* 实际上,如果对延迟加载部分的js代码有所了解,还可以通过page.request() API来使关键js替换为自己的本地文件。通过稍稍修改其中的逻辑,就可以使资源在一开始时全部加载出来了。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,839评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,543评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,116评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,371评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,384评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,111评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,416评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,053评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,558评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,007评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,117评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,756评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,324评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,315评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,539评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,578评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,877评论 2 345

推荐阅读更多精彩内容