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');
分享到:
相关推荐
今天写了一个爬取百度图片的爬虫案例,写了个博客分享一下,有不足之处请您您多多指正。 首先,打开百度图片链接百度图片,随便传入一个关键词比如…emm美女吧,会出现很多图片,想要把这些图片全部保存到本地首先...
指定配置与车型,自动爬取车型配置信息,程序为爬取屏幕尺寸大小,可以根据自己的需求自行更改
mongodb的应用之用python爬取网页内容并用mongodb保存. 由于mongodb是文档型数据库,区别于传统的数据库,它是用来管理文档的。在传统的数据库中,信息被分割成离散的数据段,而在文档数据库中,文档是处理信息的...
基于requests和re模块,爬取百度...代码实现思路可参考【Python_requests学习笔记(一)】基于requests和re模块,爬取百度图片:https://blog.csdn.net/sallyyellow/article/details/129200458?spm=1001.2014.3001.5501
Python爬虫实战之爬取网站全部图片(二) 传送门: https://blog.csdn.net/qq_33958297/article/details/89388556 爬取网址: http://www.meizitu.com/a/more_1.html 爬取地址:...
本项目主要实现了首先通过python编写的爬虫程序,对今日头条的新闻进行爬取,爬取的内容相对丰富,内容,图片都有爬取,另外,将获取到的新闻进行了实体分析,用textrank图算法计算了关联程度,得到了每篇新闻的一个...
嗯,我们知道搜索或浏览网站时会有很多精美、漂亮的图片。 我们下载的时候,得鼠标一个个下载,而且还翻页。 那么,有没有一种方法,可以使用非人工方式自动识别并下载图片。美美哒。 那么请使用python语言,构建一...
一款可以复制别人开区网站的软件,输入地址即可下载整个网站源码程序,php asp 之类的动态程序无法下载。只能下载html htm 的静态页面文件! Teleport Ultra 所能做的,不仅仅是离线浏览某个网页,它可以从 ...
当下微博已经成为各个年龄段网友冲浪的重要平台之一,许多影视明星、大V网红、官方代表也纷纷入驻微博这一平台.在此背景下,微博已经成为众多粉丝获取爱豆近况、爱豆自拍、和爱豆互动的有效平台之一,于是获取爱豆的...
这些工具帮助爬虫定位和提取目标数据,如文本、图片、链接等。 数据存储: 爬虫将提取的数据存储到数据库、文件或其他存储介质中,以备后续分析或展示。常用的存储形式包括关系型数据库、NoSQL数据库、JSON文件等。...
文章目录常用正则表达式实例:爬取笑话大全的图片 常用正则表达式 单个字符: 符号 含义 . 除换行以外所有字符 [] [a-w] a-w 之间任意一个字符 \d 数字[0-9] \D 非数字 \w 数字、字母、下划线、中文 ...
这些工具帮助爬虫定位和提取目标数据,如文本、图片、链接等。 数据存储: 爬虫将提取的数据存储到数据库、文件或其他存储介质中,以备后续分析或展示。常用的存储形式包括关系型数据库、NoSQL数据库、JSON文件等。...
这段Python代码实现了一个简单的网络爬虫,主要用于从指定网站 http://www.netbian.com 上抓取图片并将其保存到本地。它首先通过HTTP请求获取网站的HTML源代码,然后使用PyQuery库来解析页面,锁定并提取页面中的...
一、获取每张笔直的真是地址 从唯一丶给的地址 http://joyoncloud.com/wallpaper/img_detail/jtix/big/,进去后,查看网页源代码,分析每张图片的规律,通过正则表达式,构造壁纸的地址。其地址为...
从一个人的关注列表开始,递归爬取所有关注的人和被关注者,从而实现爬取整个知乎上所有进行过关注和被关注的人的信息。没有关注的人且没有被关注的用户不进行爬取。爬取下来的所有信息存入到 MongoDB 中。
这些工具帮助爬虫定位和提取目标数据,如文本、图片、链接等。 数据存储: 爬虫将提取的数据存储到数据库、文件或其他存储介质中,以备后续分析或展示。常用的存储形式包括关系型数据库、NoSQL数据库、JSON文件等。...
趁热需打铁,随着这几天的鸡血澎湃,我们来实现一下爬取淘宝商品信息,我记得几年前曾用python写了下抓取淘宝天猫,京东,拍拍的爬虫,专门采集商品信息,图片,评论及评论图片,我还用pyqt开发了个客户端,效果还...
懒加载就是当 某个图片的位置在你的屏幕范围之内,它才会加载出来。这个是比较好理解的。 (这个懒加载对用户和服务器都是比较友好的,但是对于我们爬虫来说就比较蛮烦了。往往用xpath或者bs4取解析数据的时候,就不...
添加修正以下功能: 1、修正了页面抓取内容路径的自动更改 2、修正了另一种样式引入的抓去@import url(""); 3、修正了外部js文件的抓取限制 4、修改了抓取链接a标签中的图片资源