爬取网站的图片之一

批量下载网页中图片并解析章节内容的自动化脚本
本文介绍了一个使用Node.js编写的自动化脚本,用于批量下载网页中的图片,并通过解析HTML内容自动获取章节名称、下一章节链接及图片URL,实现网页内容的高效提取和管理。

var http = require('http');
var fs = require('fs');
var request = require('request');

function base64_decode (data) {
var b64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
var o1, o2, o3, h1, h2, h3, h4, bits, i = 0, ac = 0, dec = "", tmp_arr = [];
if (!data) {return data;}
data += '';
do {
h1 = b64.indexOf(data.charAt(i++));
h2 = b64.indexOf(data.charAt(i++));
h3 = b64.indexOf(data.charAt(i++));
h4 = b64.indexOf(data.charAt(i++));
bits = h1<<18 | h2<<12 | h3<<6 | h4;
o1 = bits>>16 & 0xff;
o2 = bits>>8 & 0xff;
o3 = bits & 0xff;
if (h3 == 64) {
tmp_arr[ac++] = String.fromCharCode(o1);
} else if (h4 == 64) {
tmp_arr[ac++] = String.fromCharCode(o1, o2);
} else {
tmp_arr[ac++] = String.fromCharCode(o1, o2, o3);
}
} while (i < data.length);
dec = tmp_arr.join('');
dec = utf8_decode(dec);
return dec;
}
function base64_encode (data) {
var b64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
var o1, o2, o3, h1, h2, h3, h4, bits, i = 0, ac = 0, enc="", tmp_arr = [];
if (!data){return data;}
data = utf8_encode(data+'');
do {
o1 = data.charCodeAt(i++);
o2 = data.charCodeAt(i++);
o3 = data.charCodeAt(i++);
bits = o1<<16 | o2<<8 | o3;
h1 = bits>>18 & 0x3f;
h2 = bits>>12 & 0x3f;
h3 = bits>>6 & 0x3f;
h4 = bits & 0x3f;
tmp_arr[ac++] = b64.charAt(h1) + b64.charAt(h2) + b64.charAt(h3) + b64.charAt(h4);
} while (i < data.length);
enc = tmp_arr.join('');
switch (data.length % 3) {
case 1:
enc = enc.slice(0, -2) + '==';
break;
case 2:
enc = enc.slice(0, -1) + '=';
break;
}
return enc;
}
function utf8_decode ( str_data ) {
var tmp_arr = [], i = 0, ac = 0, c1 = 0, c2 = 0, c3 = 0;
str_data += '';
while ( i < str_data.length ) {
c1 = str_data.charCodeAt(i);
if (c1 < 128) {
tmp_arr[ac++] = String.fromCharCode(c1);
i++;
} else if ((c1 > 191) && (c1 < 224)) {
c2 = str_data.charCodeAt(i+1);
tmp_arr[ac++] = String.fromCharCode(((c1 & 31) << 6) | (c2 & 63));
i += 2;
} else {
c2 = str_data.charCodeAt(i+1);
c3 = str_data.charCodeAt(i+2);
tmp_arr[ac++] = String.fromCharCode(((c1 & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));
i += 3;
}
}
return tmp_arr.join('');
}

function utf8_encode ( argString ) {
var string = (argString+'');
var utftext = "";
var start, end;
var stringl = 0;
start = end = 0;
stringl = string.length;
for (var n = 0; n < stringl; n++) {
var c1 = string.charCodeAt(n);
var enc = null;
if (c1 < 128) {
end++;
} else if (c1 > 127 && c1 < 2048) {
enc = String.fromCharCode((c1 >> 6) | 192) + String.fromCharCode((c1 & 63) | 128);
} else {
enc = String.fromCharCode((c1 >> 12) | 224) + String.fromCharCode(((c1 >> 6) & 63) | 128) + String.fromCharCode((c1 & 63) | 128);
}
if (enc !== null) {
if (end > start) {
utftext += string.substring(start, end);
}
utftext += enc;
start = end = n+1;
}
}
if (end > start) {
utftext += string.substring(start, string.length);
}
return utftext;
}


var counter = 0;
var totalNum = 0;

function downloadPic(url,filePath,fn){
var r = request(url).pipe(fs.createWriteStream(filePath));
r.on('close', function(){
fn();
}).on('error',function(){
log('download pic error!');
if(nextChapterPath && chapterNow < chapterNum){
downloadChapter(nextChapterPath);
}else{
chapterNow++;
}
});
}

function downloadFiles(arr,baseDir){
var length = arr.length;
var i = 0;
function loadNext(index){
downloadPic(arr[i], baseDir + '/' + index + '.jpg',function(){
i++;
if(i < length){
loadNext(i);
}else{
console.log('Chapter ' + chapterNow + ' All done!');
chapterNow++;
if(nextChapterPath && chapterNow < chapterNum){
downloadChapter(nextChapterPath);
}
}
});
}
loadNext(i);
}


var baseDir = 'F:/node_test/Pictures/';

var urlReg = new RegExp('qTcms_S_m_murl_e\\s*=\\s*"([\\w+/=]+)"');
var isUrlReg = /^http:\/\//;
var chapterReg = new RegExp('qTcms_S_m_playm\\s*=\\s*"\\W+(\\d+)\\W+"');
var nextChapterReg = new RegExp('qTcms_Pic_nextArr\\s*=\\s*"([/\\w.])html"');

var chapterNow = 0,
chapterNum = 10;
var nextChapterPath = '';

function log(data){
fs.appendFile(baseDir + 'log.txt',data + '\r\n','utf8',function(err){
if(err)
{
console.log(err);
}
});
}


function downloadChapter(path){
log('//------------------------------------------------------------------//');

var page = 'http://some.page.com' + path;
log('正在读取:' + page);

var html = '';
http.get(page , function(res) {
res.setEncoding('utf-8');
res.on('data', function(data) {
// collect the data chunks to the variable named "html"
html += data;
}).on('end', function() {

var dir = baseDir;
if(chapterReg.test(html)){
dir += '第' + RegExp.$1 + '话';
}else{
console.log('找不到章节');
return;
}
if (!fs.existsSync(dir)) {
fs.mkdirSync(dir);
}else{
console.log(dir + ' 已存在!');
return;
}
//
log('文件存放目录:' + dir);

var nextChapterReg = new RegExp('qTcms_Pic_nextArr\\s*=\\s*"([/\\w.]+)"');
if(nextChapterReg.test(html)){
nextChapterPath = RegExp.$1;
log('下一个页面地址:' + nextChapterPath);
}else{
nextChapterPath = null;
}

var url64 = null,
picArr = null;
if(urlReg.test(html)){

url64 = base64_decode (RegExp.$1);

log('图片数组:\r\n' + url64);

picArr = url64.split('$');
picArr = picArr.filter(function(val){
return isUrlReg.test(val);
});


downloadFiles(picArr,dir);
}else{
//console.log("not found.");
console.log(html);
}
});
});
}

downloadChapter('someurl');
Delphi 12.3 作为一款面向 Windows 平台的集成开发环境,由 Embarcadero Technologies 负责其持续演进。该环境以 Object Pascal 语言为核心,并依托 Visual Component Library(VCL)框架,广泛应用于各类桌面软件、数据库系统及企业级解决方案的开发。在此生态中,Excel4Delphi 作为一个重要的社区开源项目,致力于搭建 Delphi 与 Microsoft Excel 之间的高效桥梁,使开发者能够在自研程序中直接调用 Excel 的文档处理、工作表管理、单元格操作及宏执行等功能。 该项目以库文件与组件包的形式提供,开发者将其集成至 Delphi 工程后,即可通过封装良好的接口实现对 Excel 的编程控制。具体功能涵盖创建与编辑工作簿、格式化单元格、批量导入导出数据,乃至执行内置公式与宏指令等高级操作。这一机制显著降低了在财务分析、报表自动生成、数据整理等场景中实现 Excel 功能集成的技术门槛,使开发者无需深入掌握 COM 编程或 Excel 底层 API 即可完成复杂任务。 使用 Excel4Delphi 需具备基础的 Delphi 编程知识,并对 Excel 对象模型有一定理解。实践中需注意不同 Excel 版本间的兼容性,并严格遵循项目文档进行环境配置与依赖部署。此外,操作过程中应遵循文件访问的最佳实践,例如确保目标文件未被独占锁定,并实施完整的异常处理机制,以防数据损毁或程序意外中断。 该项目的持续维护依赖于 Delphi 开发者社区的集体贡献,通过定期更新以适配新版开发环境与 Office 套件,并修复已发现的问题。对于需要深度融合 Excel 功能的 Delphi 应用而言,Excel4Delphi 提供了经过充分测试的可靠代码基础,使开发团队能更专注于业务逻辑与用户体验的优化,从而提升整体开发效率与软件质量。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
### 如何使用编程语言或工具爬取网站上的图片 #### 工具与技术概述 为了完成从网站上抓取图片的任务,可以采用多种技术和工具组合。其中最常用的工具之一是 Python 编程语言及其生态中的库和模块。这些工具能够帮助开发者轻松解析 HTML 页面、定位图像资源并将其保存至本地。 以下是具体的方法和技术: 1. **HTML 解析** 使用 `requests` 库发送 HTTP 请求获取网页源码,并通过 `BeautifulSoup` 或者正则表达式提取 `<img>` 标签内的属性值(通常是 `src` 属性)。这一步骤用于识别页面中所有的图片链接[^2]。 2. **网络请求管理** 借助于 `urllib.request.urlretrieve()` 函数或者更高级别的第三方库如 `aiohttp` 实现异步下载功能,从而提高效率。对于简单的场景可以直接调用同步方式逐一访问指定 URL 并保存文件;而对于复杂需求,则需考虑并发控制等因素以优化性能表现。 3. **异常处理机制设计** 在实际操作过程中可能会遇到各种意外情况比如连接超时错误、目标服务器返回状态码非正常范围等问题 。因此,在编写脚本时应加入完善的错误捕获逻辑以便及时发现问题所在位置以及采取相应措施恢复运行流程 。 4. **存储路径规划** 定义清晰合理的目录结构用来存放所获取到的数据集 ,例如按日期分层创建子文件夹或将不同类型的内容分开单独放置等策略都可以有效提升后期维护便利度的同时也方便后续进一步加工处理工作开展下去 。 ```python import os from bs4 import BeautifulSoup as soup # HTML data structure import urllib.request # fetch url content def download_images(url, folder_name="images"): try: if not os.path.exists(folder_name): os.makedirs(folder_name) html_page = urllib.request.urlopen(url).read() parsed_html = soup(html_page,"html.parser") images = [(img[&#39;alt&#39;], img[&#39;src&#39;]) for img in parsed_html.find_all(&#39;img&#39;, src=True)] count=0 for name,img_url in images[:5]: full_path=os.path.join(folder_name,str(count)+".jpg") urllib.request.urlretrieve(img_url ,full_path ) print(f"{name} saved at {full_path}") count +=1 except Exception as e : print(e) download_images("http://example.com") ``` 以上代码片段展示了基本的爬虫架构,它会尝试打开给定网址读取整个文档树寻找所有符合条件 (`<img>`) 的节点并将前五个匹配项对应的二进制流写入硬盘驱动器当中去[^2]。 #### 数据清理与验证 在某些情况下可能还需要额外步骤来进行必要的转换操作——例如调整分辨率大小适配特定应用场景的要求或者是去除水印标记等等特殊定制化服务内容都需要依赖专门软件包支持才能顺利完成任务执行过程 。 #### 总结 综上所述,利用Python 可以非常便捷高效地构建起一套完整的解决方案体系来满足日常工作中关于自动化采集互联网公开可用素材的需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值