忽然想看小欢喜,可是腾讯的视频广告太多了,因此就想去电影天堂下载,可是电影天堂的连接复制太麻烦了,并且若是我是想所有复制的,也没有,想起之前用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
复制代码
这个小项目里面还有不少优化的空间,看有没有时间吧,逃:)