[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖
那是网站问题,我在浏览器点“最末页”,半天没反应

TOP

回复  lxh623


    在我的笔记本上测试 #14 脚本,提取 12000 个文本,3分26秒完成,不算太慢。
大批 ...
WHY 发表于 2018-12-4 11:41

谢谢回复。那天用了15号,有点慢。另一个老兄的也慢。
14号还没有下载完。

TOP

本帖最后由 523066680 于 2018-12-4 12:50 编辑

买个固态硬盘,读写如丝般顺滑(当然其他硬件也要跟上)

TOP

本帖最后由 WHY 于 2018-12-4 23:58 编辑

回复 29# lxh623


    在我的笔记本上测试 #14 脚本,提取 12000 个文本,3分26秒完成,不算太慢。
大批量文本处理的话,最好做一下磁盘优化(如磁盘碎片整理、安装磁盘驱动)。
有一个小技巧,关闭 Windows Defender 或第三方杀软文件实时监控,可以大幅度提高文件读写速度。
#15脚本少一个引号,已修改。

TOP

提取文本的批处理比较慢。我用TextForever来转换,34万大约两个小时。提取却不行,合并也不能批量。不过都还可以解决。批处理来做,主要是看不到进程。
下载用23楼的批处理是比较快。网站也会封,毕竟180多万去找,昨晚,用了TRACKS ERASER PRO 老版软件设置半小时清理cookie等等,好像还可以继续下载。

TOP

本帖最后由 flashercs 于 2018-12-4 07:50 编辑

回复 27# lxh623

有作者了 需要重新下载的.
zgshige.bat
  1. 0<1/*,:
  2. @echo off
  3. CScript.exe -nologo -e:jscript %0
  4. pause
  5. exit /b
  6. */;
  7. function makeXHR() {
  8.     for (var i = 0; i < aXMLHttpVers.length; i++) {
  9.         try {
  10.             return new ActiveXObject(aXMLHttpVers[i]);
  11.         } catch (error) { }
  12.     }
  13.     showError('Can\'t build XMLHTTP automation object.');
  14.     WScript.Quit(1);
  15. }
  16. function makeHtmldoc() {
  17.     var htmldoc = new ActiveXObject('htmlfile');
  18.     htmldoc.open();
  19.     htmldoc.write('<!DOCTYPE html><html><head><meta charset="utf-8" /><meta http-equiv="X-UA-Compatible" content="IE=edge"><title>Page Title</title><meta name="viewport" content="width=device-width, initial-scale=1"></head><body></body></html>');
  20.     htmldoc.close();
  21.     return htmldoc;
  22. }
  23. function makeADOStream() {
  24.     var oADO = new ActiveXObject('ADODB.Stream');
  25.     oADO.Mode = 3;
  26.     return oADO;
  27. }
  28. function byte2str(ado, byteArr, sEncoding) {
  29.     ado.Type = 1;
  30.     ado.Open();
  31.     ado.Write(byteArr);
  32.     ado.Position = 0;
  33.     ado.Type = 2;
  34.     ado.Charset = sEncoding;
  35.     var s = ado.ReadText(-1);
  36.     ado.Close();
  37.     return s;
  38. }
  39. function xhrWorkers() {
  40.     var url;
  41.     var xhr_ = makeXHR();
  42.     var htmldoc = makeHtmldoc();
  43.     var oADO = makeADOStream();
  44.     var re = /<!-- 诗歌正文开始 -->[\s\S]+(?=<!-- 诗歌正文结束 -->)/i;
  45.     xhr_.onReadyStateChange = function () {
  46.         if (xhr_.readyState === 4) {
  47.             if (xhr_.status === 200) {
  48.                 var str = byte2str(oADO, xhr_.responseBody, 'utf-8');
  49.                 var m = str.match(re);
  50.                 if (m) {
  51.                     try {
  52.                         htmldoc.body.innerHTML = m[0];
  53.                         var title = 'TTT ' + htmldoc.body.getElementsByTagName('h3')[0].innerText;
  54.                         var author = htmldoc.body.children[1].children[0].children[0].innerText;
  55.                         var content = htmldoc.body.getElementsByClassName('m-lg font14')[0].innerText;
  56.                         tsOut.WriteLine((title + '\r\n' + author + '\r\n' + content + '\r\n').replace(/\r?\n\s*/g, '<br/>\r\n'));
  57.                         tsCache.WriteLine(url);
  58.                         WScript.StdOut.WriteLine(url);
  59.                     } catch (e) {
  60.                         // WScript.StdOut.WriteLine(htmldoc.documentElement.getElementsByClassName ? 'className' : htmldoc.documentElement.getElementsByTagName ? 'tagName' : 'nothing');
  61.                     }
  62.                 }
  63.             } else {
  64.                 WScript.StdOut.WriteLine(url + ' status=' + xhr_.status);
  65.             }
  66.             aXhr.push(worker);
  67.         }
  68.     };
  69.     var worker = {
  70.         job: function (method, uri, async) {
  71.             url = uri;
  72.             xhr_.open(method, uri, async);
  73.             // setRequestHeaders(xhr_);
  74.             xhr_.send();
  75.         }
  76.     };
  77.     return worker;
  78. }
  79. function setRequestHeaders(xhr_) {
  80.     xhr_.setRequestHeader('Accept', 'text/html, application/xhtml+xml, application/xml; q=0.9, */*; q=0.8');
  81.     xhr_.setRequestHeader('Accept-Language', 'en-US, en; q=0.8, zh-Hans-CN; q=0.5, zh-Hans; q=0.3');
  82.     xhr_.setRequestHeader('Accept-Encoding', 'gzip, deflate');
  83.     xhr_.setRequestHeader('TE', 'gzip, deflate');
  84.     // xhr_.setRequestHeader('Connection', 'close');
  85.     xhr_.setRequestHeader('Cache-Control', 'no-cache');
  86.     xhr_.setRequestHeader('User-Agent', 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Safari/537.36 Edge/17.17134');
  87. }
  88. function parseURL(href, url) {
  89.     var $path = href.replace(/^[^:]*:/, '');
  90.     if (/^\/\/.*/.test($path)) {
  91.         return href;
  92.     } else if (/^\/.*/.test($path)) {
  93.         return domain + $path;
  94.     } else {
  95.         return url.replace(/[^\/]+$/, '') + $path;
  96.     }
  97. }
  98. function showError(err, source) {
  99.     WScript.StdOut.WriteLine('[object Error]' === Object.prototype.toString.call(err) ?
  100.         [
  101.             err.name,
  102.             'source: ' + (undefined === source ? '' : source),
  103.             'number: ' + (err.number >>> 0).toString(16),
  104.             'Information: ' + err.message
  105.         ].join('\r\n')
  106.         :
  107.         err);
  108. }
  109. var aXMLHttpVers = ['MSXML2.XMLHTTP.6.0', 'MSXML2.XMLHTTP.3.0', 'MSXML2.XMLHTTP', 'Microsoft.XMLHTTP'],
  110.     fso = new ActiveXObject('Scripting.FileSystemObject'),
  111.     domain = "http://www.zgshige.com",
  112.     outFile = "zgshige.txt",
  113.     cacheFile = "cache_zgshige.txt",
  114.     tsOut,
  115.     tsCache,
  116.     oCache = {};
  117. new ActiveXObject('WScript.Shell').CurrentDirectory = fso.GetParentFolderName(WScript.ScriptFullName);
  118. try {
  119.     tsCache = fso.OpenTextFile(cacheFile, 1, true);
  120. } catch (e) {
  121.     WScript.Echo('can not read cache file ' + cacheFile);
  122.     WScript.Quit(1);
  123. }
  124. while (!tsCache.AtEndOfStream) {
  125.     oCache[tsCache.ReadLine()] = true;
  126. }
  127. tsCache.Close();
  128. try {
  129.     tsCache = fso.OpenTextFile(cacheFile, 8, true);
  130. } catch (e) {
  131.     showError(e, 'can not write cache file ' + cacheFile);
  132.     WScript.Quit(2);
  133. }
  134. try {
  135.     tsOut = fso.OpenTextFile(outFile, 8, true, -1);//unicode encoding
  136. } catch (e) {
  137.     showError(e, 'can not write file ' + outFile);
  138.     WScript.Quit(3);
  139. }
  140. var oTasks = {
  141.     atEnd: false,
  142.     current: null,
  143.     moveNext: (function () {
  144.         var aIndex = [];
  145.         // var nextPage = 'http://www.zgshige.com/sg/index.shtml'; 可以自定义起始位置
  146.         var nextPage = 'http://www.zgshige.com/zcms/catalog/15112/pc/index_201.shtml';
  147.         var xhr = makeXHR();
  148.         var htmldoc = makeHtmldoc();
  149.         var oADO = makeADOStream();
  150.         var re = /<!-- 主体开始 -->[\S\s]*?(?=<!-- 主体结束 -->)/i;
  151.         var url = nextPage;
  152.         xhr.onReadyStateChange = function () {
  153.             if (xhr.readyState === 4) {
  154.                 if (200 === xhr.status) {
  155.                     var str = byte2str(oADO, xhr.responseBody, 'utf-8');
  156.                     var m = str.match(re);
  157.                     if (m) {
  158.                         htmldoc.body.innerHTML = m[0];
  159.                         var nodes = htmldoc.documentElement.getElementsByClassName('fc_ch1');
  160.                         for (nextPage = null, i = 0, l = nodes.length; i < l; ++i) {
  161.                             if (nodes[i].firstChild.nodeValue === '下一页') {
  162.                                 nextPage = parseURL(nodes[i].parentNode.getAttribute('href'), url);
  163.                                 break;
  164.                             }
  165.                         }
  166.                         if (!oCache[url]) {
  167.                             nodes = htmldoc.body.getElementsByClassName('fc-green text-uppercase');
  168.                             for (var i = 0, l = nodes.length; i < l; ++i) {
  169.                                 var item = parseURL(nodes[i].getAttribute('href'), url);
  170.                                 if (!oCache[item]) {
  171.                                     aIndex.push(item);
  172.                                 }
  173.                             }
  174.                             aIndex.push(url);
  175.                         }
  176.                         if (url = nextPage) {
  177.                             xhr.open('GET', url, true);
  178.                             // setRequestHeaders(xhr);
  179.                             xhr.send();
  180.                         } else {
  181.                             oTasks.atEnd = true;
  182.                             return false;
  183.                         }
  184.                     } else {
  185.                         nextPage = null;
  186.                         oTasks.atEnd = true;
  187.                         return false;
  188.                     }
  189.                 } else {
  190.                     nextPage = null;
  191.                     oTasks.atEnd = true;
  192.                     return false;
  193.                 }
  194.             }
  195.         };
  196.         xhr.open('GET', url, true);
  197.         setRequestHeaders(xhr);
  198.         xhr.send();
  199.         return function () {
  200.             return aIndex.shift();
  201.         };
  202.     })()
  203. };
  204. var maxThreads = 20,
  205.     aXhr = [],
  206.     i, l, task,
  207.     reIndex = /index.*html$/i;
  208. for (i = 0; i < maxThreads; ++i) {
  209.     aXhr.push(xhrWorkers());
  210. }
  211. while (!oTasks.atEnd) {
  212.     while (task = oTasks.moveNext()) {
  213.         if (reIndex.test(task)) {
  214.             tsCache.WriteLine(task);
  215.             WScript.StdOut.WriteLine(task);
  216.             continue;
  217.         }
  218.         while (!aXhr.length) {
  219.             WScript.Sleep(10);
  220.         }
  221.         aXhr.shift().job('GET', task, true);
  222.     }
  223.     WScript.Sleep(100);
  224. }
  225. while (task = oTasks.moveNext()) {
  226.     if (reIndex.test(task)) {
  227.         tsCache.WriteLine(task);
  228.         WScript.StdOut.WriteLine(task);
  229.         continue;
  230.     }
  231.     while (!aXhr.length) {
  232.         WScript.Sleep(10);
  233.     }
  234.     aXhr.shift().job('GET', task, true);
  235. }
  236. tsOut.close();
  237. tsCache.close();
  238. WScript.Quit(0);
复制代码
1

评分人数

TOP

楼主是win7吗?powershell 是2.0 版本?
下载第一个网站的
保存为zgshige.bat
flashercs 发表于 2018-11-19 14:40

好像没有作者。谢谢!

TOP

回复  lxh623

已修改了
flashercs 发表于 2018-11-29 18:43

请问,脚本对应于我的代理软件的自动或者手动模式,手动会提醒吗?

出线一个重定向的提示。谢谢!

TOP

回复 24# lxh623

已修改了

TOP

本帖最后由 lxh623 于 2018-11-27 22:10 编辑
回复  lxh623


    后面的导航页下载很慢,但是内容页下载很快, 5楼更新了一下代码, 59行可以自定义起始 ...
flashercs 发表于 2018-11-26 18:56

请问,句子迷那个脚本(原帖不能回复),我买了网上的代理,设置5分钟切换并清除cookie,这时候,脚本就报“403”并退出。有没有办法不退出,等几秒呢?谢谢!
代理软件有个手动触发(F6),可以下载大约三十个网页就暂停,提醒或者批处理中触发吗,然后等10秒又接着下载?

TOP

回复 21# lxh623


    50 万个文件,每页 60 个文件,就是 8000 多页没下载,可能是你第一次下载 1~100页,第二次下载 200~300页,中间不连续。

以下脚本会把没有下载的存放到 E:\zgshige\Lost 目录,这是第三个脚本 DownLoadURL.PS1,第一、第二个脚本同 6 楼。
(不过这样子折腾很费时间,你看着办)
DownLoadURL.PS1
  1. param([int]$StartIndex, [int]$EndIndex);
  2. $path = 'E:\zgshige\';      #html文件保存路径
  3. $web = New-Object System.Net.WebClient;
  4. $web.Encoding = [Text.Encoding]::UTF8;
  5. for ($i=$StartIndex; $i -le $EndIndex; $i++) {
  6.     $url = 'http://www.zgshige.com/zcms/catalog/15112/pc/index_' + $i + '.shtml';
  7.     $str = $web.DownloadString($url);
  8.     forEach ($m In [regex]::Matches($str, '(?i)<a class="fc-green text-uppercase" href="(http[^"]*)"')) {
  9.         $var = $m.Groups[1].Value;
  10.         $fd  = $var -replace '.*/([^/]+)/[^/]+$', '$1';
  11.         $name = $var -replace '.*/([^/]+)\.s?html$', '$1';
  12.         If (Test-Path ($path + $fd + '\' + $name + '.html')) { continue; }
  13.         $fd = $path + 'Lost\' + $fd;
  14.         If (!(Test-Path $fd)) { $null = md $fd; }
  15.         $s = $web.DownloadString($var);
  16.         $s = $s -replace '<h3>(?!TTT)', '$&TTT';
  17.         sc -Path ($fd + '\' + $name + '.html') -Value $s -Enc UTF8;
  18.     }
  19. }
复制代码
1

评分人数

    • lxh623: 真的太好了!谢谢!技术 + 1

TOP

回复 21# lxh623


    后面的导航页下载很慢,但是内容页下载很快, 5楼更新了一下代码, 59行可以自定义起始下载的导航页面,有 范例

TOP

下载  网页,与楼上一样,也分三个脚本,第1个脚本 startScript.bat 和第2个脚本 startScript.ps1 内容与楼 ...
WHY 发表于 2018-11-19 15:45

zgshige还是差五十多万。
不知道可以做一个下载导航页(三万多)的批处理。
然后,我得到没有下载到的文件的网址,写入文本a,五十万行,再来一个批处理。一万一个文件夹。
谢谢!

TOP

回复 19# lxh623


    请不要删除或改名 文件名含有cache的.txt 文件 ,那么下次运行就是忽略已下载过的了.

TOP

楼主是win7吗?powershell 是2.0 版本?
下载第一个网站的
保存为zgshige.bat
flashercs 发表于 2018-11-19 14:40


第一个文件很大,下载了大约三分之二。请问,两个网站的脚本,可以设置为跳过已经有的文件,只是补足吗?

TOP

返回列表