爬虫新姿势——使用Chrome Devtools写一个小说爬虫

devtools/2024/11/15 14:29:38/

目前,绝大部分的爬虫教程都是基于Python和Node.js。其实,只要有Chrome浏览器,使用Chrome F12打开的的Devtools就能随时随地轻轻松松写一个爬虫,完全不用装其它语言环境。今天就介绍一下只使用Chrome Devtools来爬取网站www.biqudu.com/31_31729/小说并保存为文本文件的爬虫

如何在Chrome Devtools里面写爬虫代码

Devtools提供了Snippets功能让我们可以在这里写JavaScript代码,步骤参考下图:

步骤说明

  1. 打开source标签

  2. 左侧选择Snippets标签

  3. 点击New Snippets新建一个Snippets

  4. 开始写代码

  5. 点击运行代码

  6. 查看控制台输出


 准备爬虫工具函数

1.加载第三方库

根据Url加载一个第三方库,可以用这个函数加载jquery,underscore等工具库,加载完成后就可以在代码中使用这些库了,本例中使用这个函数加载async异步并发控制库。


async function loadLibrary(url) {return new Promise((resolve, reject) => {let script = document.createElement('script');script.onload = resolve;script.onerror = reject;script.src = url;document.body.appendChild(script);});
}

2.下载文件到本地

将string下载到文本文件


function saveFile(string, fileName) {var a = document.createElement('a');a.download = fileName;var blob = new Blob([string], {type: 'text/plain'});a.href = window.URL.createObjectURL(blob);a.click();
}

3.下载HTML

使用了Fetch api,根据url下载一个html文本文件并转换成DOM元素后返回,返回的元素具有DOM api,例如 querySelector,方便对节点的提取和分析。


async function getHtml(url) {let response = await fetch(url);let htmlText = await response.text();let html = document.createElement('html');html.innerHTML = htmlText;return html;
}

准备爬虫业务函数

1.获取小说的所有章节信息

分析小说主页www.biqudu.com/31_31729/,

通过document.querySelectorAll('#list dd a') 可以获取包含所有章节名称和链接的a标签元素。


async function getDirectory(url) {let page = await getHtml(url);let directory = Array.from(page.querySelectorAll('#list dd a'));//去除顶部最新12个章节return directory.slice(12);
}

2.获取一个章节的内容

分析小说章节 www.biqudu.com/31_31729/21…,章节内容位于ID为content的DIV元素中


async function getSection({ href, innerText: title }) {console.log(`开始获取 ${title}`);let html = await getHtml(href);let content = html.querySelector('#content');Array.from(content.querySelectorAll('script')).forEach(scriptTag => content.removeChild(scriptTag));var text = title + '\r\n' + content.innerText + '\r\n';return text;
}

完整代码

因为小说有几百几千章节,不可能一个一个章节下载,那样速度太慢了。也不能一下子全下载。所以
爬取时使用了async异步并发控制库(这个async和async function里面的async只是名字一样而已),并发数量为6,设置大了也没用因为Chrome浏览器对同一域名下的同时请求数量是6。

完整代码运行步骤

  1. Chrome浏览器打开小说主页如:www.biqudu.com/31_31729/

  2. 在小说主页页面打开Devtools 新建snippets并将下面的完整代码粘贴进去

  3. 点击运行代码开始爬取小说


(async function () {// https://www.biqudu.com/31_31729/async function loadLibrary(url) {return new Promise((resolve, reject) => {let script = document.createElement('script');script.onload = resolve;script.onerror = reject;script.src = url;document.body.appendChild(script);});}function saveFile(string, fileName) {var a = document.createElement('a');a.download = fileName;var blob = new Blob([string], {type: 'text/plain'});a.href = window.URL.createObjectURL(blob);a.click();}async function getHtml(url) {let response = await fetch(url);let htmlText = await response.text();let html = document.createElement('html');html.innerHTML = htmlText;return html;}async function getDirectory(url) {let page = await getHtml(url);let directory = Array.from(page.querySelectorAll('#list dd a'));//去除顶部最新12个章节return directory.slice(12);}async function getSection({ href, innerText: title }) {console.log(`开始获取 ${title}`);let html = await getHtml(href);let content = html.querySelector('#content');Array.from(content.querySelectorAll('script')).forEach(scriptTag => content.removeChild(scriptTag));var text = title + '\r\n' + content.innerText + '\r\n';return text;}async function run() {let asyncLibUrl = 'https://cdn.bootcss.com/async/2.1.4/async.js';await loadLibrary(asyncLibUrl);let directory = await getDirectory(location.href);let q = window.async.queue(async function (section, taskDone) {try {section.text = await getSection(section);} catch (e) {console.error(e);section.text = "章节下载失败:" + e;} finally {taskDone();}}, 6);//并发送设成6q.drain = function () {let name = document.querySelector('#maininfo h1').innerText + '.txt';console.log(`小说《${name}》下载完成`);let content = "";directory.forEach(function ({ text }) {content += text;});saveFile(content, name);}q.push(directory);}await run();}());


http://www.ppmy.cn/devtools/134182.html

相关文章

Wordpress常用配置,包括看板娘跨域等

一个Wordpress的博客已经搭建完成了,那么为了让它看起来更有人间烟火气一点,有一些常用的初始配置,这里整理一下。 修改页脚 页脚这里默认会显示Powered by Wordpress,还有一个原因是这里要加上备案信息。在主题里找到页脚&…

android framework ams/wms常见系统日志(main\system\events\crash,protoLog使用)

重要性 wms和ams的一些系统原生日志能够帮助我们快速定位问题日志分类 在日常framework工作中常见的日志类别如下: -b , --buffer= Request alternate ring buffer, ‘main’, ‘system’, ‘radio’, ‘events’, ‘crash’, ‘default’ or ‘all’. Additionally, ‘kerne…

压缩指令的使用

gzip 和 gunzip 是两个用于压缩和解压缩文件的命令。 下面是这两个命令的一些基本信息和使用技巧: gzip 压缩 基本语法 gzip 文件名功能描述:压缩文件,只能将文件压缩成 .gz 格式的文件。 经验技巧 只能压缩文件,不能压缩目…

docker--工作目录迁移

前言 安装docker,默认的情况容器的默认存储路径会存储系统盘的 /var/lib/docker 目录下,系统盘一般默认 50G,容器输出的所有的日志,文件,镜像,都会存在这个地方,时间久了就会占满系统盘。 一、…

【资料】网络安全风险评估报告,风险管理报告,网络安全风险管理计划,网络安全网络安全能力验证报(Word原件)

一、概述 1.1工作方法 1.2评估依据 1.3评估范围 1.4评估方法 1.5基本信息 二、资产分析 2.1 信息资产识别概述 2.2 信息资产识别 三、评估说明 3.1无线网络安全检查项目评估 3.2无线网络与系统安全评估 3.3 ip管理与补丁管理 3.4防火墙 四、威胁细类分析 4.1威胁…

用友U8-Cloud uapbd.refdef.query sql注入漏洞复现

0x01 产品描述: ‌用友U8-Cloud‌是由用

安全见闻-泷羽sec课程笔记

编程语言 C语言:一种通用的、面向过程的编程语言,广泛应用于系统软件和嵌入式开发。 C:在C语言基础上发展而来,支持面向对象编程,常用于尊戏开发、高性能计算等领域。 Java:一种广泛使用的面问对象编程语言,具有跨平台…

STM32学习笔记-----引脚的输出速度(翻转速率)选择要注意的问题

在STM32微控制器中,输出引脚的翻转速率(或切换速率)是指引脚状态从高电平到低电平,或从低电平到高电平的速度。这个速率通常由几个因素决定,选择时需要考虑以下几个方面: 1. 引脚驱动能力 STM32的引脚可以…