使用puppeteer上電影天堂

倉庫地址

github.com/hkc452/dytthtml

起源

忽然想看小歡喜,可是騰訊的視頻廣告太多了,因此就想去電影天堂下載,可是電影天堂的連接複製太麻煩了,並且若是我是想所有複製的,也沒有,想起之前用puppeteer寫過一個爬蟲,恰好拿來改下node

使用方案

1.安裝git

npm instal dytt -ggithub

2.使用npm

dytt url1 url2 ...瀏覽器

3.查看生成的text,複製到迅雷一鍵下載bash

url 是具體的詳情頁,例如:www.dytt8.net/html/tv/hyt…dom

又來源碼解讀??

bin/dytt.js ,處理參數,asserUrl判斷是否電影天堂連接,crawl爬數據async

#!/usr/bin/env node
const crawl = require('../crawl')
const urls = process.argv.slice(2)
if (!urls.length) throw('請輸入電影天堂的連接')
const asserUrl = (url) => {
    if (!url || typeof url !== 'string') return false
    if (/^https?:\/\/www\.dytt8\.net(\/\w+?)+\.html?$/.test(url)) return true
    return false
}

const start = async() => {
    for (let url of urls) {
        if (!asserUrl(url)) continue
        await crawl(url)
    }
    process.exit(0)
}
start()
複製代碼

crawl.js 使用puppeteer.launch啓動瀏覽器,browser.newPage打開新頁面,toGoPage.evaluate分析頁面,其中evaluate沒法使用外部參數,只有傳進去,evaluate裏面的值能夠return出來給外界使用,evaluate裏面是dom環境優化

const puppeteer = require('puppeteer')
const fs = require('fs')
const path = require('path')
let crawl = async (browser, url, format = false) => {
    if (typeof browser === 'string') {
        url = browser
        browser = await puppeteer.launch()
    }
    if (!url) return
    const toGoPage = await browser.newPage()
    try {
        await toGoPage.goto(url ,{
            timeout: 60000
        })
    } catch (error) {
        await browser.close()
        console.log(url+'失敗')
    }
    const result = await toGoPage.evaluate((format) => {
        const fallbackLink = (node) => {
            // 檢查是否知足ftp或者thunder
            // 不然從html裏面獲取
            // 去掉開頭和末尾的空格
            const link = (node.innerText || '').replace(/^\s*|\s*$/g, '')
            // 支持 ftp thunder http(s) 這三種主要協議的下載連接
            if(/^(ftp|thunder|https?):\/\//.test(link)) return link
            const html = node.outerHTML || ''
            const match = html.match(/((ftp|thunder|https?):\/\/[^"]+)/) if(match) { return match[1] } else { return '' } } name = document.querySelector('#header > div > div.bd2 > div.bd3 > div.bd3r > div.co_area2 > div.title_all > h1 > font').innerHTML || Date.now() const links = document.querySelectorAll('#Zoom > span table tr>td a') let resLinks = format ? [] : '' links.forEach((item, index)=> { if (format) { resLinks.push({ // TODO 修復集數問題,由於有些不是從第一集開始的 index: index +1, link: fallbackLink(item) }) } else { resLinks+= '\n'+ fallbackLink(item) } }) return { link: resLinks, name: name } }, format) fs.writeFileSync(path.join(process.cwd(),`${result.name}.text`), format ? JSON.stringify(result.link, null, 2) : result.link) await browser.close() } module.exports = crawl 複製代碼

遇到的坑

1.因爲把源設置爲淘寶源了,致使npm login老是失敗,後面才發現須要

npm login --registry http://registry.npmjs.org

npm publish --registry http://registry.npmjs.org
複製代碼
  1. 因爲迅雷支持一鍵下載所有須要每一個連接單獨一行,因此把每一個連接前加'\n'

效果圖

  1. 下載回來的資源列表
  2. 複製所有連接後,迅雷的效果

結語

這個小項目裏面還有不少優化的空間,看有沒有時間吧,逃:)

相關文章
相關標籤/搜索