Board logo

标题: [已解决]各20元求两个网站资料下载 [打印本页]

作者: lxh623    时间: 2018-11-18 08:05     标题: [已解决]各20元求两个网站资料下载

本帖最后由 lxh623 于 2018-12-8 19:25 编辑

http://www.zgshige.com/sg/
这个有index。感觉比较醒目。
http://www.52shici.com/original.php?type=1
这个有20个栏目,右边上面两行。下面也是可以翻页。

标题前面加上TTT,第一个有“作者:”,第二个是不是把“文/”换成“作者:”(自己加工也行)。正文保持原来网页转行与隔行,就好了。

谢谢!!
作者: 窄口牛    时间: 2018-11-18 09:33

你一次多出点儿,做个交互智能的。
作者: lxh623    时间: 2018-11-18 18:44

可以自己手动下载的,想着大侠的脚本舒服,不用太复杂的加工。
如果有热心朋友愿意帮忙,感激不尽。如果没有,就手动下载了。谢谢!
作者: happy886rr    时间: 2018-11-18 20:15

你08年就注册了,难道这种简单问题自己都写不出代码吗?
作者: flashercs    时间: 2018-11-19 14:40

本帖最后由 flashercs 于 2018-11-26 18:53 编辑

楼主是win7吗?powershell 是2.0 版本?
下载第一个网站的
保存为zgshige.bat
  1. 0<1/*,:
  2. @echo off
  3. %windir%\system32\CScript.exe -nologo -e:jscript %0
  4. pause
  5. exit /b
  6. */;
  7. (function () {
  8.     var xhr = (function () {
  9.         var aXMLHttpVers = ['MSXML2.XMLHTTP.6.0', 'MSXML2.XMLHTTP.3.0', 'MSXML2.XMLHTTP', 'Microsoft.XMLHTTP'];
  10.         for (var i = 0; i < aXMLHttpVers.length; i++) {
  11.             try {
  12.                 return new ActiveXObject(aXMLHttpVers[i]);
  13.             } catch (error) { }
  14.         }
  15.         showError('Can\'t build XMLHTTP automation object.');
  16.         WScript.Quit(1);
  17.     })(),
  18.         fso = new ActiveXObject('Scripting.FileSystemObject'),
  19.         htmldoc = new ActiveXObject('htmlfile'),
  20.         oADO = new ActiveXObject('ADODB.Stream'),
  21.         domain = "http://www.zgshige.com",
  22.         outFile = "shige.txt",
  23.         cacheFile = "cache.txt",
  24.         tsOut,
  25.         tsCache,
  26.         oCache = {},
  27.         url,
  28.         aIndex = [],
  29.         nextPage,
  30.         nodes,
  31.         reScriptNode = /<script[^>]*>[\s\S]*?<\/script>(?!['"'])/g,
  32.         i,
  33.         l;
  34.     oADO.Mode = 3;
  35.     new ActiveXObject('WScript.Shell').CurrentDirectory = fso.GetParentFolderName(WScript.ScriptFullName);
  36.     try {
  37.         tsCache = fso.OpenTextFile(cacheFile, 1, true);
  38.     } catch (e) {
  39.         WScript.Echo('can not read cache file ' + cacheFile);
  40.         WScript.Quit(1);
  41.     }
  42.     while (!tsCache.AtEndOfStream) {
  43.         oCache[tsCache.ReadLine()] = true;
  44.     }
  45.     tsCache.Close();
  46.     try {
  47.         tsCache = fso.OpenTextFile(cacheFile, 8, true);
  48.     } catch (e) {
  49.         showError(e, 'can not write cache file ' + cacheFile);
  50.         WScript.Quit(2);
  51.     }
  52.     try {
  53.         tsOut = fso.OpenTextFile(outFile, 8, true, -1);//unicode encoding
  54.     } catch (e) {
  55.         showError(e, 'can not write file ' + outFile);
  56.         WScript.Quit(3);
  57.     }
  58.     // url可以自己设置起始下载位置;例如 url = 'http://www.zgshige.com/zcms/catalog/15112/pc/index_29937.shtml';
  59.     url = 'http://www.zgshige.com/sg/index.shtml';
  60.     while (url) {
  61.         if (!getHTML(url)) break;
  62.         aIndex.length = 0;
  63.         nodes = htmldoc.documentElement.getElementsByClassName('fc-green text-uppercase');
  64.         for (i = 0, l = nodes.length; i < l; ++i) {
  65.             aIndex.push(parseURL(nodes[i].getAttribute('href'), url));
  66.         }
  67.         nodes = htmldoc.documentElement.getElementsByClassName('fc_ch1');
  68.         for (nextPage = null, i = 0, l = nodes.length; i < l; ++i) {
  69.             if (nodes[i].firstChild.nodeValue === '下一页') {
  70.                 nextPage = parseURL(nodes[i].parentNode.getAttribute('href'), url);
  71.                 break;
  72.             }
  73.         }
  74.         // WScript.StdOut.WriteLine('aIndex.length=' + aIndex.length);
  75.         // WScript.StdOut.WriteLine('innerHTML=' + htmldoc.documentElement.childNodes[0].innerHTML);
  76.         for (i = 0, l = aIndex.length; i < l; ++i) {
  77.             url = aIndex[i];
  78.             if (oCache[url] || !getHTML(url)) continue;
  79.             try {
  80.                 tsOut.WriteLine(('TTT' + htmldoc.documentElement.getElementsByTagName('h3')[0].innerText + '\r\n' + htmldoc.documentElement.getElementsByClassName('m-lg font14')[0].innerText).replace(/\r?\n */g, '<br/>\r\n'));
  81.                 tsCache.WriteLine(url);
  82.             } catch (e) {
  83.             }
  84.         }
  85.         url = nextPage;
  86.     }
  87.     tsOut.close();
  88.     tsCache.close();
  89.     WScript.Quit();
  90.     function parseURL(href, url) {
  91.         var $path = href.replace(/^[^:]*:/, '');
  92.         if (/^\/\/.*/.test($path)) {
  93.             return href;
  94.         } else if (/^\/.*/.test($path)) {
  95.             return domain + $path;
  96.         } else {
  97.             return url.replace(/[^\/]+$/, '') + $path;
  98.         }
  99.     }
  100.     function showError(err, source) {
  101.         WScript.StdOut.WriteLine('[object Error]' === Object.prototype.toString.call(err) ?
  102.             [
  103.                 err.name,
  104.                 'source: ' + (undefined === source ? '' : source),
  105.                 'number: ' + (err.number >>> 0).toString(16),
  106.                 'Information: ' + err.message
  107.             ].join('\r\n')
  108.             :
  109.             err);
  110.     }
  111.     function getHTML(url) {
  112.         WScript.StdOut.Write('fetching ' + url + '...')
  113.         xhr.open('GET', url, false);
  114.         xhr.setRequestHeader('Accept', 'text/html, application/xhtml+xml, application/xml; q=0.9, */*; q=0.8');
  115.         xhr.setRequestHeader('Accept-Language', 'en-US, en; q=0.8, zh-Hans-CN; q=0.5, zh-Hans; q=0.3');
  116.         xhr.setRequestHeader('Accept-Encoding', 'gzip, deflate');
  117.         xhr.setRequestHeader('TE', 'gzip, deflate');
  118.         xhr.setRequestHeader('Cache-Control', 'no-cache');
  119.         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');
  120.         try {
  121.             xhr.send();
  122.             if (200 === xhr.status) {
  123.                 oADO.Type = 1;
  124.                 oADO.Open();
  125.                 oADO.Write(xhr.responseBody);
  126.                 oADO.Position = 0;
  127.                 oADO.Type = 2;
  128.                 oADO.Charset = 'utf-8';
  129.                 htmldoc.open();
  130.                 htmldoc.write(oADO.ReadText(-1).replace(reScriptNode, ''));
  131.             } else {
  132.                 WScript.StdOut.WriteLine('failed')
  133.                 return false
  134.             }
  135.         } catch (e) {
  136.             WScript.StdOut.WriteLine('failed')
  137.             return false;
  138.         } finally {
  139.             htmldoc.close();
  140.             oADO.Close();
  141.         }
  142.         WScript.StdOut.WriteLine('success')
  143.         return true;
  144.     }
  145. })();
复制代码

作者: WHY    时间: 2018-11-19 15:35

本帖最后由 WHY 于 2018-11-19 20:19 编辑

分三个脚本,第1个脚本 startScript.bat,第 2 个脚本 startScript.ps1,第 3 个脚本 DownLoadURL.PS1,三个脚本存放在同一目录。
双击 startScript.bat 运行。

startScript.bat
  1. @echo off
  2. echo;Wait ...
  3. PowerShell -exec ByPass -f "startScript.ps1"
  4. echo;Done
  5. pause
复制代码
startScript.ps1
修改  startScript.ps1 第11行变量 $i 的取值范围,这里是从第一页到第100页
  1. $SessionState = [System.Management.Automation.Runspaces.InitialSessionState]::CreateDefault();
  2. $Pool = [RunspaceFactory]::CreateRunspacePool(1, 5, $SessionState, $Host);
  3. $Pool.Open();
  4. $ScriptBlock = {
  5.     param([int]$StartIndex, [int]$EndIndex)
  6.     PowerShell -exec ByPass -f "DownLoadURL.ps1" -StartIndex $StartIndex -EndIndex $EndIndex;
  7. }
  8. $Jobs = @(); $Step = 4;
  9. for ($i = 1; $i -le 100; $i+=$Step) {
  10.     $Start = $i;
  11.     $End = $i + $step - 1;
  12.     $PowerShell = [PowerShell]::Create().AddScript($ScriptBlock).AddArgument($Start).AddArgument($End);
  13.     $PowerShell.RunspacePool = $Pool;
  14.     $Jobs += $PowerShell.BeginInvoke();
  15. }
  16. while (!$ok) {
  17.     $ok = $True;
  18.     ForEach ($Job In $Jobs) { If (!$Job.IsCompleted) {$ok = $False} }
  19.     sleep -Milliseconds 200
  20. }
复制代码
DownLoadURL.PS1
修改 DownLoadURL.PS1 第 6 行 $type 的值,可以取值从 1~19
  1. param([int]$StartIndex, [int]$EndIndex);
  2. $path = 'E:\52shici\';      #html文件保存路径
  3. $web = New-Object System.Net.WebClient;
  4. $web.Encoding = [Text.Encoding]::UTF8;
  5. $type = 1;
  6. $fd  = $path + $type;
  7. If (!(Test-Path $fd)) { $null = md $fd; }
  8. for ($i=$StartIndex; $i -le $EndIndex; $i++) {
  9.     $url = 'http://www.52shici.com/original.php?type=' + $type + '&page=' + $i;
  10.     $str = $web.DownloadString($url);
  11.     forEach ($m In [regex]::Matches($str, '<li><span class="l"><a\s+target="_blank" href="([^"]*)"')) {
  12.         $var = 'http://www.52shici.com/' + $m.Groups[1].Value;
  13.         $name = ($var -replace '.*\?');
  14.         $s = $web.DownloadString($var);
  15.         $s = $s -replace '(?<=<span class="author">)(.*?)文/', '$1作者 ';
  16.         sc -Path ($fd + '\' + $name + '.html') -Value $s -Enc UTF8;
  17.     }
  18. }
复制代码

作者: WHY    时间: 2018-11-19 15:45

本帖最后由 WHY 于 2018-11-20 19:29 编辑

下载 http://www.zgshige.com 网页,与楼上一样,也分三个脚本,第1个脚本 startScript.bat 和第2个脚本 startScript.ps1 内容与楼上相同,三个脚本存放在同一目录下。
第 3 个脚本 DownLoadURL.PS1 如下,双击 startScript.bat 运行。
  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  = $path + ($var -replace '.*/([^/]+)/[^/]+$', '$1');
  11.         If (!(Test-Path $fd)) { $null = md $fd; }
  12.         $name = $var -replace '.*/([^/]+)\.s?html$', '$1';
  13.         $s = $web.DownloadString($var);
  14.         $s = $s -replace '<h3>(?!TTT)', '$&TTT';
  15.         sc -Path ($fd + '\' + $name + '.html') -Value $s -Enc UTF8;
  16.     }
  17. }
复制代码
改一下正则,提高点速度。
作者: lxh623    时间: 2018-11-19 21:59

windows8,下周windows10 。谢谢!
作者: flashercs    时间: 2018-11-20 09:03

52shici还有两个内容 works 和 posts 开始搞错了都......也不知要哪个?都弄上吧.
52shiciWorks.bat
  1. 0<1/*,:
  2. @echo off
  3. CScript.exe -nologo -e:jscript %0
  4. pause
  5. exit /b
  6. */;
  7. (function () {
  8.     var xhr = (function () {
  9.         var aXMLHttpVers = ['MSXML2.XMLHTTP.6.0', 'MSXML2.XMLHTTP.3.0', 'MSXML2.XMLHTTP', 'Microsoft.XMLHTTP'];
  10.         for (var i = 0; i < aXMLHttpVers.length; i++) {
  11.             try {
  12.                 return new ActiveXObject(aXMLHttpVers[i]);
  13.             } catch (error) { }
  14.         }
  15.         showError('Can\'t build XMLHTTP automation object.');
  16.         WScript.Quit(1);
  17.     })(),
  18.         fso = new ActiveXObject('Scripting.FileSystemObject'),
  19.         htmldoc = new ActiveXObject('htmlfile'),
  20.         domain = "http://www.52shici.com",
  21.         outFile = "52shici_works.txt",
  22.         cacheFile = "cache_52shici_works.txt",
  23.         tsOut,
  24.         tsCache,
  25.         oCache = {},
  26.         url,
  27.         reCrLfS = /\r?\n */g,
  28.         i,
  29.         l,
  30.         aIndex = [];
  31.     new ActiveXObject('WScript.Shell').CurrentDirectory = fso.GetParentFolderName(WScript.ScriptFullName);
  32.     try {
  33.         tsCache = fso.OpenTextFile(cacheFile, 1, true);
  34.     } catch (e) {
  35.         showError('can not read cache file ' + cacheFile);
  36.         WScript.Quit(1);
  37.     }
  38.     while (!tsCache.AtEndOfStream) {
  39.         oCache[tsCache.ReadLine()] = true;
  40.     }
  41.     tsCache.Close();
  42.     try {
  43.         tsCache = fso.OpenTextFile(cacheFile, 8, true);
  44.     } catch (e) {
  45.         showError(e, 'can not write cache file ' + cacheFile);
  46.         WScript.Quit(2);
  47.     }
  48.     try {
  49.         tsOut = fso.OpenTextFile(outFile, 8, true, -1);//unicode encoding
  50.     } catch (e) {
  51.         showError(e, 'can not write file ' + outFile);
  52.         WScript.Quit(3);
  53.     }
  54.     // main
  55.     for (var type = 0; type <= 19; ++type) {
  56.         var url = 'http://www.52shici.com/original.php?type=' + type + '&page=';
  57.         var totalPages;
  58.         if (!getHTMLindex(url + 1, true)) continue;
  59.         var body = htmldoc.body;
  60.         totalPgs = body.lastChild.innerText.match(/当前\d+\/(\d+)页/)[1];
  61.         WSH.Echo('totalpages=' + totalPgs);
  62.         for (var m = 1; m <= totalPgs; ++m) {
  63.             if (oCache[url + m] || !getHTMLindex(url + m)) continue;
  64.             body = htmldoc.body;
  65.             var aList = body.getElementsByTagName('a');
  66.             aIndex.length = 0;
  67.             for (i = 0, l = aList.length; i < l; ++i) {
  68.                 aIndex.push(parseURL(aList[i].getAttribute('href'), url));
  69.             }
  70.             for (i = 0, l = aIndex.length; i < l; ++i) {
  71.                 getContent(aIndex[i]);
  72.             }
  73.             tsCache.WriteLine(url + m);
  74.         }
  75.     }
  76.     tsOut.close();
  77.     tsCache.close();
  78.     WScript.Quit();
  79.     function getContent(url) {
  80.         if (oCache[url] || !getHTML(url)) return;
  81.         var main = htmldoc.body.children[0];
  82.         var nodes = main.children;
  83.         try {
  84.             for (var i = 0, l = nodes.length; i < l; ++i) {
  85.                 var item = nodes[i];
  86.                 switch (item.className) {
  87.                     case 'works-h1':
  88.                         var title = 'TTT ' + item.children[0].innerText;
  89.                         // WSH.Echo( 'title: '+title);
  90.                         var author = item.children[1].innerText.replace('文/', '作者:');
  91.                         // WSH.Echo( 'author: '+author);
  92.                         break;
  93.                     case 'works-content':
  94.                         var content = item.innerText;
  95.                         i = l;
  96.                         break;
  97.                     default:
  98.                         break;
  99.                 }
  100.             }
  101.             tsOut.WriteLine((title + '\r\n' + author + '\r\n' + content).replace(reCrLfS, '<br/>\r\n'));
  102.             tsCache.WriteLine(url);
  103.         } catch (e) {
  104.             showError(e);
  105.         }
  106.     }
  107.     function showError(err, source) {
  108.         WScript.StdOut.WriteLine('[object Error]' === Object.prototype.toString.call(err) ?
  109.             [
  110.                 err.name,
  111.                 'source: ' + (undefined === source ? '' : source),
  112.                 'number: ' + (err.number >>> 0).toString(16),
  113.                 'Information: ' + err.message
  114.             ].join('\r\n')
  115.             :
  116.             err);
  117.     }
  118.     function getHTMLindex(url, boltotalPages) {
  119.         WScript.StdOut.Write('fetching ' + url + '...')
  120.         xhr.open('GET', url, false);
  121.         xhr.setRequestHeader('Accept', 'text/html, application/xhtml+xml, application/xml; q=0.9, */*; q=0.8');
  122.         xhr.setRequestHeader('Accept-Language', 'en-US, en; q=0.8, zh-Hans-CN; q=0.5, zh-Hans; q=0.3');
  123.         xhr.setRequestHeader('host', 'www.52shici.com/');
  124.         xhr.setRequestHeader('Connection', 'close');
  125.         xhr.setRequestHeader('Cache-Control', 'no-cache');
  126.         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');
  127.         try {
  128.             xhr.send();
  129.             // WSH.Echo(xhr.responseText.match(/<span[^>]*class=['"]mt['"][^>]*>[^<]*<\/span>/i)[0]);
  130.             // WSH.Quit();
  131.             if (200 === xhr.status) {
  132.                 htmldoc.open();
  133.                 htmldoc.write('<!DOCTYPE html><html><head></head><body>' + xhr.responseText.match(/<ul[^>]*id="listWorks"[^>]*>[\s\S]*?<\/ul>/i)[0] + (boltotalPages ? xhr.responseText.match(/<span[^>]*class=['"]mt['"][^>]*>[^<]*<\/span>/i)[0] : '') + '</body></html>');
  134.             } else {
  135.                 WScript.StdOut.WriteLine('failed. status:' + xhr.status);
  136.                 return false
  137.             }
  138.         } catch (e) {
  139.             WScript.StdOut.WriteLine('failed');
  140.             return false;
  141.         } finally {
  142.             htmldoc.close();
  143.         }
  144.         WScript.StdOut.WriteLine('success');
  145.         return true;
  146.     }
  147.     function getHTML(url) {
  148.         WScript.StdOut.Write('fetching ' + url + '...')
  149.         xhr.open('GET', url, false);
  150.         xhr.setRequestHeader('Accept', 'text/html, application/xhtml+xml, application/xml; q=0.9, */*; q=0.8');
  151.         xhr.setRequestHeader('Accept-Language', 'en-US, en; q=0.8, zh-Hans-CN; q=0.5, zh-Hans; q=0.3');
  152.         xhr.setRequestHeader('host', 'www.52shici.com/');
  153.         xhr.setRequestHeader('Connection', 'close');
  154.         xhr.setRequestHeader('Cache-Control', 'no-cache');
  155.         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');
  156.         try {
  157.             xhr.send();
  158.             if (200 === xhr.status) {
  159.                 htmldoc.open();
  160.                 var aTxt = xhr.responseText.match(/<div class="main"[\s\S]+(?=<!--main end -->)/i);
  161.                 htmldoc.write('<!DOCTYPE html><html><head></head><body>' + aTxt[0] + '</body></html>');
  162.             } else {
  163.                 WScript.StdOut.WriteLine('failed. status:' + xhr.status);
  164.                 return false
  165.             }
  166.         } catch (e) {
  167.             WScript.StdOut.WriteLine('failed');
  168.             return false;
  169.         } finally {
  170.             htmldoc.close();
  171.         }
  172.         WScript.StdOut.WriteLine('success');
  173.         return true;
  174.     }
  175.     function parseURL(href, url) {
  176.         var $path = href.replace(/^[^:]*:/, '');
  177.         if (/^\/\/.*/.test($path)) {
  178.             return href;
  179.         } else if (/^\/.*/.test($path)) {
  180.             return domain + $path;
  181.         } else {
  182.             return url.replace(/[^\/]+$/, '') + $path;
  183.         }
  184.     }
  185. })();
复制代码
52shiciPosts.bat
  1. 0<1/*,:
  2. @echo off
  3. CScript.exe -nologo -e:jscript %0
  4. pause
  5. exit /b
  6. */;
  7. (function () {
  8.     var xhr = (function () {
  9.         var aXMLHttpVers = ['MSXML2.XMLHTTP.6.0', 'MSXML2.XMLHTTP.3.0', 'MSXML2.XMLHTTP', 'Microsoft.XMLHTTP'];
  10.         for (var i = 0; i < aXMLHttpVers.length; i++) {
  11.             try {
  12.                 return new ActiveXObject(aXMLHttpVers[i]);
  13.             } catch (error) { }
  14.         }
  15.         showError('Can\'t build XMLHTTP automation object.');
  16.         WScript.Quit(1);
  17.     })(),
  18.         fso = new ActiveXObject('Scripting.FileSystemObject'),
  19.         htmldoc = new ActiveXObject('htmlfile'),
  20.         domain = "http://www.52shici.com",
  21.         outFile = "52shici_posts.txt",
  22.         cacheFile = "cache_52shici_posts.txt",
  23.         tsOut,
  24.         tsCache,
  25.         oCache = {},
  26.         url,
  27.         reCrLfS = /\r?\n */g,
  28.         i,
  29.         l = 300000,
  30.         strOut,
  31.         nodeContent,
  32.         sTitle,
  33.         sAuthor,
  34.         sContent;
  35.     new ActiveXObject('WScript.Shell').CurrentDirectory = fso.GetParentFolderName(WScript.ScriptFullName);
  36.     try {
  37.         tsCache = fso.OpenTextFile(cacheFile, 1, true);
  38.     } catch (e) {
  39.         showError('can not read cache file ' + cacheFile);
  40.         WScript.Quit(1);
  41.     }
  42.     while (!tsCache.AtEndOfStream) {
  43.         oCache[tsCache.ReadLine()] = true;
  44.     }
  45.     tsCache.Close();
  46.     try {
  47.         tsCache = fso.OpenTextFile(cacheFile, 8, true);
  48.     } catch (e) {
  49.         showError(e, 'can not write cache file ' + cacheFile);
  50.         WScript.Quit(2);
  51.     }
  52.     try {
  53.         tsOut = fso.OpenTextFile(outFile, 8, true, -1);//unicode encoding
  54.     } catch (e) {
  55.         showError(e, 'can not write file ' + outFile);
  56.         WScript.Quit(3);
  57.     }
  58.     // main
  59.     for (i = 1; i < l; ++i) {
  60.         if (oCache['' + i]) continue;
  61.         url = 'http://www.52shici.com/posts.php?id=' + i;
  62.         if (!getHTML(url)) continue;
  63.         var node = htmldoc.documentElement.childNodes[1].childNodes[0];
  64.         try {
  65.             for (var m = 0, n = node.childNodes.length; m < n; ++m) {
  66.                 var item = node.childNodes[m];
  67.                 switch (item.className) {
  68.                     case 'posts-h1':
  69.                         sTitle = 'TTT ' + item.innerText;
  70.                         break;
  71.                     case 'posts-h2':
  72.                         sAuthor = '作者:' + item.firstChild.innerText;
  73.                         break;
  74.                     case 'posts-content':
  75.                         item.removeChild(item.lastChild);
  76.                         sContent = item.innerText;
  77.                         break;
  78.                     default:
  79.                         break;
  80.                 }
  81.             }
  82.             strOut = sTitle + '\r\n' + sAuthor + '\r\n' + sContent;
  83.             tsOut.WriteLine(strOut.replace(reCrLfS, '<br/>\r\n'));
  84.             tsCache.WriteLine(i);
  85.         } catch (e) {
  86.             continue;
  87.         }
  88.     }
  89.     tsOut.close();
  90.     tsCache.close();
  91.     WScript.Quit();
  92.     function showError(err, source) {
  93.         WScript.StdOut.WriteLine('[object Error]' === Object.prototype.toString.call(err) ?
  94.             [
  95.                 err.name,
  96.                 'source: ' + (undefined === source ? '' : source),
  97.                 'number: ' + (err.number >>> 0).toString(16),
  98.                 'Information: ' + err.message
  99.             ].join('\r\n')
  100.             :
  101.             err);
  102.     }
  103.     function getHTML(url) {
  104.         WScript.StdOut.Write('fetching ' + url + '...')
  105.         xhr.open('GET', url, false);
  106.         xhr.setRequestHeader('Accept', 'text/html, application/xhtml+xml, application/xml; q=0.9, */*; q=0.8');
  107.         xhr.setRequestHeader('Accept-Language', 'en-US, en; q=0.8, zh-Hans-CN; q=0.5, zh-Hans; q=0.3');
  108.         xhr.setRequestHeader('host', 'www.52shici.com/');
  109.         xhr.setRequestHeader('Connection', 'close');
  110.         xhr.setRequestHeader('Cache-Control', 'no-cache');
  111.         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');
  112.         try {
  113.             xhr.send();
  114.             if (200 === xhr.status) {
  115.                 htmldoc.open();
  116.                 var aTxt = xhr.responseText.match(/<div class="sidebar"[\s\S]+(?=<div class="posts-do")/i);
  117.                 if (!aTxt) throw false;
  118.                 htmldoc.write('<!DOCTYPE html><html><head><meta http-equiv="Content-Type" content="text/html; charset=GB2312" /></head><body>' + aTxt[0] + '</div></body></html>');
  119.             } else {
  120.                 WScript.StdOut.WriteLine('failed. status:' + xhr.status);
  121.                 return false
  122.             }
  123.         } catch (e) {
  124.             WScript.StdOut.WriteLine('failed');
  125.             return false;
  126.         } finally {
  127.             htmldoc.close();
  128.         }
  129.         WScript.StdOut.WriteLine('success');
  130.         return true;
  131.     }
  132. })();
复制代码

作者: lxh623    时间: 2018-11-20 11:03

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

这个第10行的数字不像以前一个可以修改吧?谢谢!
作者: lxh623    时间: 2018-11-23 07:49

另一个问题是,怎样从本地以日子或类别命名的文件夹,一次性提取一个txt。要求还是标题加TTT 。
下载到本地的html,可以检查是否缺页。
一个15元。谢谢!
作者: flashercs    时间: 2018-11-23 12:54

本帖最后由 flashercs 于 2018-12-6 22:27 编辑

先设置52shici.html的根目录路径;
保存 提取52shici_Works.bat
  1. @echo off
  2. REM 设置htmlRoot = 52shici的html文件根目录
  3. set "htmlRoot=E:\PowerShell\WebHttpRequest\52shici\html"
  4. REM 设置txtFilePath = 提取的文本文件名,放在脚本同目录下
  5. set "txtFilePath=提取52shici.txt"
  6. for /f "tokens=1 delims=:" %%A in ('findstr /n "#######*" %0') do more +%%A %0 >"%~dpn0.ps1"
  7. powershell.exe -ExecutionPolicy Bypass -File "%~dpn0.ps1" "%htmlRoot%" "%~dp0%txtFilePath%"
  8. pause
  9. exit /b
  10. ################################################################
  11. param([string]$htmlRoot, [string]$txtFilePath)
  12. $sw = [System.IO.StreamWriter]::new($txtFilePath, $true, [System.Text.Encoding]::Unicode)
  13. $sw.AutoFlush = $true
  14. # [string]$scriptPath = [System.IO.Path]::GetDirectoryName($MyInvocation.MyCommand.Defination)
  15. $htmldoc = New-Object -ComObject htmlfile
  16. $null = $htmldoc.IHTMLDocument2_open()
  17. $htmldoc.IHTMLDocument2_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>')
  18. $htmldoc.IHTMLDocument2_close()
  19. [System.IO.Directory]::GetFiles($htmlRoot, '*.html', [System.IO.SearchOption]::AllDirectories)|ForEach-Object {
  20.     $m = [System.IO.File]::ReadAllText($_, [System.Text.Encoding]::UTF8) -match '<div class="main"[\s\S]+(?=<!--main end -->)'
  21.     if ($m) {
  22.         Write-Host "提取$_" -ForegroundColor Green
  23.         try {
  24.             $htmldoc.body.innerHTML = $Matches[0]
  25.             $div = $htmldoc.body.firstChild
  26.             $nodeh1 = $div.getElementsByClassName('works-h1')[0]
  27.             $title = 'TTT ' + $nodeh1.children[0].innerText
  28.             $author = $nodeh1.children[1].innerText
  29.             $content = $div.getElementsByClassName('works-content')[0].innerText
  30.             $sw.WriteLine((($title + "`r`n" + $author + "`r`n" + $content + "`r`n") -replace "`r?`n\s*", "<br/>`r`n"))
  31.         }
  32.         catch {
  33.                
  34.         }
  35.     }
  36. }
  37. Remove-Variable -Name htmldoc
  38. $sw.Close()
复制代码

作者: flashercs    时间: 2018-11-23 13:42

本帖最后由 flashercs 于 2018-12-6 22:28 编辑

提取zgshige.bat
  1. @echo off
  2. REM 设置htmlRoot = zgshige的html文件根目录
  3. set "htmlRoot=E:\PowerShell\WebHttpRequest\zgshige\htmlsrc"
  4. REM 设置txtFilePath = 提取的文本文件名
  5. set "txtFilePath=提取zgshige.txt"
  6. for /f "tokens=1 delims=:" %%A in ('findstr /n "#######*" %0') do more +%%A %0 >"%~dpn0.ps1"
  7. powershell.exe -ExecutionPolicy Bypass -File "%~dpn0.ps1" "%htmlRoot%" "%~dp0%txtFilePath%"
  8. pause
  9. exit /b
  10. ################################################################
  11. param([string]$htmlRoot, [string]$txtFilePath)
  12. $sw = [System.IO.StreamWriter]::new($txtFilePath, $true, [System.Text.Encoding]::Unicode)
  13. $sw.AutoFlush = $true
  14. # [string]$scriptPath = [System.IO.Path]::GetDirectoryName($MyInvocation.MyCommand.Defination)
  15. $htmldoc = New-Object -ComObject htmlfile
  16. $null = $htmldoc.IHTMLDocument2_open()
  17. $htmldoc.IHTMLDocument2_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>')
  18. $htmldoc.IHTMLDocument2_close()
  19. [System.IO.Directory]::GetFiles($htmlRoot, '*.html', [System.IO.SearchOption]::AllDirectories)|ForEach-Object {
  20.     $m = [System.IO.File]::ReadAllText($_, [System.Text.Encoding]::UTF8) -match '(?<=<!-- 诗歌正文开始 -->)[\s\S]+(?=<!-- 诗歌正文结束 -->)'
  21.     if ($m) {
  22.         Write-Host "提取$_" -ForegroundColor Green
  23.         try {
  24.             $htmldoc.body.innerHTML = $Matches[0]
  25.             $title = 'TTT ' + $htmldoc.body.getElementsByTagName('h3')[0].innerText
  26.             $author = $htmldoc.body.children[1].children[0].children[0].innerText
  27.             $content = $htmldoc.body.getElementsByClassName('m-lg font14')[0].innerText
  28.             $sw.WriteLine((($title + "`r`n" + $author + "`r`n" + $content + "`r`n") -replace "\r?\n\s*", "<br/>`r`n"))
  29.         }
  30.         catch {
  31.                
  32.         }
  33.     }
  34. }
  35. Remove-Variable -Name htmldoc
  36. $sw.Close()
复制代码

作者: WHY    时间: 2018-11-23 14:39

本帖最后由 WHY 于 2018-11-26 21:09 编辑

回复 11# lxh623


    假设从 http://www.zgshige.com 下载的 html 存放在 E:\zgshige 目录下。
分两个脚本,zgshige.bat 和 zgshige.PS1,两个脚本存放在同一目录下,双击 bat 文件运行。

zgshige.bat
  1. @echo off
  2. set "htmlPath=E:\zgshige"
  3. dir /b /s "%htmlPath%\*.html" > List.txt
  4. PowerShell -exec ByPass -f "zgshige.PS1" List.txt
  5. del List.txt
  6. pause
复制代码
zgshige.PS1
  1. param([String]$ListFile);
  2. $stream = New-Object IO.StreamWriter('zgshige.Log', $True, [Text.Encoding]::UTF8);
  3. forEach ($file In (type $ListFile -ReadCount 0)) {
  4.     $str = [IO.File]::ReadAllText($file, [Text.Encoding]::UTF8);
  5.     $arr = $str -split '<!--\s*诗歌正文(?:开始|结束)\s*-->';
  6.     If ($arr.Count -eq 3) {
  7.         $s = $arr[1] -replace '<h3>(?!TTT)', '$&TTT';
  8.         $s = $s -replace '(?<!\r)\n', "`r`n";
  9.         $s = $s -replace '&nbsp;|<(?!br)[^>]*>';
  10.         $s = $s -replace '(?m)^\s+';
  11.         $stream.WriteLine($s + "`r`n");
  12.         If (++$n % 6000 -eq 0) { $stream.Flush(); }
  13.     }
  14. }
  15. $stream.Close();
复制代码

作者: WHY    时间: 2018-11-23 14:44

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

假设从 http://www.52shici.com 下载的 html 存放在 E:\52shici 目录下。
也是分两个脚本,52shici.bat 和 52shici.PS1,两个脚本存放在同一文件夹下,双击 bat 文件运行。

52shici.bat
  1. @echo off
  2. set "htmlPath=E:\52shici"
  3. dir /b /s "%htmlPath%\*.html" > List.txt
  4. PowerShell -exec ByPass -f "52shici.PS1" List.txt
  5. del List.txt
  6. pause
复制代码
52shici.PS1
  1. param([String]$ListFile);
  2. $stream = New-Object IO.StreamWriter('52shici.Log', $True, [Text.Encoding]::UTF8);
  3. $reg1 = [regex]'<em>([^<>]*)</em>\s*<span class="author">([^<>]*)</span>';
  4. $reg2 = [regex]'<div class="works-content"[\s\S]*被阅读过\s*\d+\s*次';
  5. forEach ($file In (type $ListFile -ReadCount 0)) {
  6.     $str = [IO.File]::ReadAllText($file, [Text.Encoding]::UTF8);
  7.     $m1  = $reg1.Match($str);
  8.     $m2  = $reg2.Match($str);
  9.     If ($m1.Success -and $m2.Success) {
  10.         $s = 'TTT' + $m1.Groups[1].Value + $m1.Groups[2].Value + "`r`n";
  11.         $s += $m2.Groups[0].Value;;
  12.         $s = $s -replace '(?<!\r)\n', '\r\n';
  13.         $s = $s -replace '&nbsp;|<(?!br)[^>]*>';
  14.         $s = $s -replace '(?m)^\s+';
  15.         $stream.WriteLine($s + "`r`n");
  16.         If (++$n % 6000 -eq 0) { $stream.Flush(); }
  17.     }
  18. }
  19. $stream.Close();
复制代码

作者: lxh623    时间: 2018-11-23 14:52

看不大懂说的意思. 假装看懂了....我语文从来不及格的...
假设当前目录是E:\abc ,分类子目录有 0 ,1 ,2 ,3 ...
flashercs 发表于 2018-11-23 12:54

分别合成一个文本。谢谢!
还没有下载完。
作者: lxh623    时间: 2018-11-23 15:00

本帖最后由 lxh623 于 2018-11-23 15:28 编辑

两位都在。新的问题是怎样下载百度搜索结果页面。这是以前我没有下载到的一个。
我想把文本a的每一行打开,搜索,结果数量从1-99,具体不知道。怎样全部下载百度结果的html,也不知道会不会重名。
类似网址:https://www.baidu.com/s?q1=《目送》&q2=&q3=&q4=&gpc=stf&ft=&q5=&q6=www.juzimi.com&tn=baiduadv

以后,我准备提取含有writer或者article的链接的缓存。再去下载。当然,直接提取这样的网址或者下载这样的快照页面更好了。
还是20 。谢谢!
作者: lxh623    时间: 2018-11-24 15:25

文本提取还有几天,之后,再来了结。谢谢!
作者: lxh623    时间: 2018-11-24 19:40

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


第一个文件很大,下载了大约三分之二。请问,两个网站的脚本,可以设置为跳过已经有的文件,只是补足吗?
作者: flashercs    时间: 2018-11-24 20:15

回复 19# lxh623


    请不要删除或改名 文件名含有cache的.txt 文件 ,那么下次运行就是忽略已下载过的了.
作者: lxh623    时间: 2018-11-26 16:16

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

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

回复 21# lxh623


    后面的导航页下载很慢,但是内容页下载很快, 5楼更新了一下代码, 59行可以自定义起始下载的导航页面,有 范例
作者: WHY    时间: 2018-11-26 21:06

回复 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. }
复制代码

作者: lxh623    时间: 2018-11-27 21:47

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


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

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

回复 24# lxh623

已修改了
作者: lxh623    时间: 2018-11-30 16:06

回复  lxh623

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

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

出线一个重定向的提示。谢谢!
作者: lxh623    时间: 2018-12-1 08:31

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

好像没有作者。谢谢!
作者: flashercs    时间: 2018-12-2 18:08

本帖最后由 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);
复制代码

作者: lxh623    时间: 2018-12-4 10:14

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

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

回复 29# lxh623


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

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

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


作者: lxh623    时间: 2018-12-6 09:12

回复  lxh623


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

谢谢回复。那天用了15号,有点慢。另一个老兄的也慢。
14号还没有下载完。
作者: 523066680    时间: 2018-12-6 11:51

那是网站问题,我在浏览器点“最末页”,半天没反应
作者: lxh623    时间: 2018-12-6 14:21

本帖最后由 lxh623 于 2018-12-6 14:25 编辑

回复 23# WHY
还是麻烦您做一个根据文本中的链接地址下载的脚本。下载到一个文件夹就可以。
今天中午,我改成从26500开始,居然一个没有下载到。要是每一次都从前面第一页开始,也不现实,做了好多天了。
剩下还是14万。谢谢!!
作者: lxh623    时间: 2018-12-6 14:24

那是网站问题,我在浏览器点“最末页”,半天没反应
523066680 发表于 2018-12-6 11:51

前面说的是转化提取。下载还可以吧。打开最后一页,我这里也是一两分钟,毕竟3万多。
作者: 523066680    时间: 2018-12-6 15:54

本帖最后由 523066680 于 2018-12-6 21:27 编辑

回复 35# lxh623

    所以现在主要讨论的是 http://www.52shici.com/ 下载后的数据提取、整合问题?
我以为是另一个网站 http://www.zgshige.com/

52shici 这个网站的文章页面,有手机版的,手机版页面体积小一半以上,可以减少处理消耗。不过如果已经下完了就没必要重下了。
作者: WHY    时间: 2018-12-6 20:36

回复 34# lxh623


    我觉得没必要再写一个,无非就是怕下载漏了,只要你把下载的页面数字记住就行了。
比如这一次下载 200~300 页,for ($i = 200; $i -le 300; $i+=$Step)
下一次你改成 for ($i = 301; $i -le 400; $i+=$Step) 就会接着下载 301~400 页。

www.zgshige.com 这个网站很怪,前面几百页还好,越往后越慢,点开都难,当然越下载就越慢。
作者: lxh623    时间: 2018-12-7 08:16

回复  lxh623


    我觉得没必要再写一个,无非就是怕下载漏了,只要你把下载的页面数字记住就行了。
...
WHY 发表于 2018-12-6 20:36

我设置26500到最后,一个中午没有下载到一个。2016缺10万,2015缺4万。
作者: WHY    时间: 2018-12-7 10:25

下载不全的话直接用 #23 的脚本吧,我这里测试 26500~26600 下载时确实很慢,但是不缺页。
不明白你是啥情况。
作者: lxh623    时间: 2018-12-7 15:22

下载不全的话直接用 #23 的脚本吧,我这里测试 26500~26600 下载时确实很慢,但是不缺页。
不明白你是啥情 ...
WHY 发表于 2018-12-7 10:25

用的就是这个,一个下载不到。
作者: 523066680    时间: 2018-12-7 15:39

回复 40# lxh623

    那个网站靠后的页面我用浏览器也打不开~
作者: lxh623    时间: 2018-12-8 19:27

总算下载完了,今天学习了一个代码。分享一下。
  1. M:\新建文件夹\aria2c.exe -c -s 7 -j 7 -i 1.txt
复制代码

作者: lxh623    时间: 2018-12-10 09:15

本帖最后由 lxh623 于 2018-12-10 09:23 编辑
回复  lxh623


    假设从  下载的 html 存放在 E:\zgshige 目录下。
分两个脚本,zgshige.bat 和 zg ...
WHY 发表于 2018-11-23 14:39

麻烦一下,这个最好依序每一个文件夹提取为一个文本,名称用文件夹名。可能更快,也方便检查是否缺少。20元。谢谢!
作者: WHY    时间: 2018-12-10 14:18

本帖最后由 WHY 于 2018-12-13 16:30 编辑

回复 43# lxh623


zgshige.bat
  1. @echo off
  2. echo %time%
  3. set "htmlPath=E:\zgshige"
  4. dir /b /s "%htmlPath%\*.html" > List.txt
  5. PowerShell -exec ByPass -f "zgshige.PS1" List.txt
  6. del List.txt
  7. echo %time%
  8. pause
复制代码
zgshige.ps1
  1. param([String]$ListFile);
  2. $MyPath = $MyInvocation.MyCommand.Path -replace '[^\\]+$';
  3. forEach ($file In (type $ListFile -ReadCount 0)) {
  4.     $str = [IO.File]::ReadAllText($file, [Text.Encoding]::UTF8);
  5.     $arr = $str -split '<div class="(?:text-center b-b b-2x b-lt|col-xs-12 hidden-sm[^"]*)">';
  6.     If ($arr.Count -eq 3) {
  7.         $s = $arr[1] -replace '<h3>(?!TTT)', '$&TTT';         #标题前面加 TTT
  8.         $s = $s -replace '(?<!\r)\n', "`r`n";
  9.         $s = $s -replace '<div class="(signature|m-lg font14|note)">|</?br>|<br/>|</p>', '<br />';
  10.         $s = $s -replace '<!--(?:(?!-->)[\s\S])*-->|&nbsp;';  #删除注释标签和转义空格
  11.         $s = $s -replace '<(?!br|/?h3)[^>]*>';                #保留换行标签和h3标签
  12.         $s = $s -replace '(<br />)+', '$1';
  13.         $s = $s -replace '(?m)^\s+';                          #删除行首空格
  14.         $name = ($file -split '\\')[-2] + '.Log';
  15.         [IO.File]::AppendAllText($MyPath + $name, $s + "`r`n", [Text.Encoding]::UTF8);
  16.     }
  17. }
复制代码

作者: lxh623    时间: 2018-12-10 14:40

回复  lxh623


zgshige.batzgshige.ps1
WHY 发表于 2018-12-10 14:18


屏幕闪得很快。调用两个参数来readalltext时,发生异常,未能找到路径。PS1,字符5 。
作者: WHY    时间: 2018-12-10 15:11

回复 45# lxh623


    你用的是什么系统?
我改了下,你再试。
作者: lxh623    时间: 2018-12-10 16:07

回复 46# WHY
WINDOWS8 ,还有10 。
作者: WHY    时间: 2018-12-10 18:40

我在 win10,win7测试没有问题。14楼脚本能运行吗?
你看看出错的时候有没有输出 List.txt 文本。
作者: lxh623    时间: 2018-12-10 18:55

回复 48# WHY
新电脑运行中。谢谢!
旧的windows8 好像不行,是不是什么没有安装?
作者: lxh623    时间: 2018-12-11 15:51

回复  lxh623


zgshige.batzgshige.ps1
WHY 发表于 2018-12-10 14:18


https://share.weiyun.com/5p4FqYQ
麻烦帮我看看。这个文件夹,共943个,只得到670个。谢谢!
作者: WHY    时间: 2018-12-11 16:49

有些 html 文本不带注释
44楼脚本 zgshige.ps1 第6行改成:
  1. $arr = $str -split '<div class="(?:text-center b-b b-2x b-lt|col-xs-12 hidden-sm[^"]*)">';
复制代码

作者: lxh623    时间: 2018-12-11 19:12

回复 51# WHY

处理中。谢谢!
作者: lxh623    时间: 2018-12-13 09:13

本帖最后由 lxh623 于 2018-12-13 15:31 编辑
有些 html 文本不带注释
44楼脚本 zgshige.ps1 第6行改成:
WHY 发表于 2018-12-11 16:49


http://www.zgshige.com/c/2015-07-05/530371.shtml
这页提取后,没有转行。类似的还有很多。
看了一下,可能需要<br></p><p>先替换为<br>,然后</p><p>替换为<br>。比如,http://www.zgshige.com/c/2015-10-08/657236.shtml

如果这样的页面,几个标题都用粗体,类似<b>真想</b>,那就更好了。
但愿有更好的办法。谢谢!
作者: 523066680    时间: 2018-12-13 13:03

网盘的那部分提取结果
https://share.weiyun.com/58Jcutw
作者: WHY    时间: 2018-12-13 16:33

回复 53# lxh623


    顶楼就没说清,不明白你到底需要什么结果。
44楼改了下,试试吧
作者: lxh623    时间: 2018-12-13 19:17

回复 55# WHY

也不是没有说清楚,因为网页复杂,有许多变化。我又真的不太懂,只是麻烦您了。
这不,又一个,<div>也想修改成<br>,怎么样修改?http://www.zgshige.com/c/2015-06-10/504946.shtml
作者: WHY    时间: 2018-12-13 23:36

本帖最后由 WHY 于 2018-12-17 18:21 编辑

zgshige.bat
  1. @echo off
  2. echo Wait ...
  3. set "htmlPath=E:\zgshige"
  4. dir /b /s "%htmlPath%\*.html" > List.txt
  5. PowerShell -exec ByPass -f "zgshige.PS1" List.txt
  6. del List.txt
  7. echo Done!
  8. pause
复制代码
zgshige.ps1
  1. param([String]$ListFile);
  2. Add-Type -AssemblyName System.Web;
  3. forEach ($file In (type $ListFile -ReadCount 0)) {
  4.     $str = [IO.File]::ReadAllText($file, [Text.Encoding]::UTF8);
  5.     $arr = $str -split '<div (?:class="text-center b-b b-2x b-lt|id="content|class="m-lg font14|class="p-sm)">';
  6.     If ($arr.Count -eq 5) {
  7.         $s = $arr[1] + '<br />' + $arr[2] + '<br />';
  8.         $s += $arr[3] -replace '[\u4E00-\u9FFF\p{P}](?=<(?!/?br)|\r?\n)', '$&<br />';  #中文及标点后面加<br />
  9.         $s = $s -replace '<h3>(?!TTT)', '$&TTT';              #标题前面加 TTT
  10.         $s = $s -replace '<!--(?:(?!-->)[\s\S])*-->';         #删除注释标签
  11.         $s = $s -replace '</?br>|<br/>', '<br />';            #替换<br>、</br>、<br/>
  12.         $s = $s -replace '</?(?!br|h3|[^a-z])[^>]*>', '';     #删除其它标签,保留换行标签和h3标签
  13.         $s =[regex]::Replace($s, '&[^&;]+;',{param($a); [Web.HttpUtility]::HtmlDecode($a.Value)}); #替换html转义字符
  14.         $s = $s -replace '^\s+';
  15.         $s = $s -replace '(?:<br />\s*){2,}', '<br /><br />';
  16.         $s = $s -replace '\s+', ' ';
  17.         $name = ($file -split '\\')[-2] + '.Log';
  18.         [IO.File]::AppendAllText($name, $s + "`r`n", [Text.Encoding]::UTF8);
  19.     }
  20. }
复制代码

作者: lxh623    时间: 2018-12-14 15:07

本帖最后由 lxh623 于 2018-12-14 15:18 编辑

回复 57# WHY

http://www.zgshige.com/c/2018-12-13/7714634.shtml
http://www.zgshige.com/c/2015-06-10/504779.shtml
有些倒退。分节不见了。哎。确实复杂。
作者: xczxczxcz    时间: 2018-12-14 17:52

回复 42# lxh623

如果网站不限制下载的话,把同时下载开大些,单个文件的线程小点。百兆宽带。限制最大下载速度不超过10M。留点宽带给其它程序用。PS调用:
  1. &Aria2c -c -x2 -j1500 --max-overall-download-limit=10M -i $SaveTxt -d $SaveDir
复制代码
这样1500个网页同时下载。再把aria2c 写到系统环境变量里。再集成到鼠标右键。CMD\POWERSHELL 都可以随意调用。
作者: 523066680    时间: 2018-12-14 17:54

这种情况通常要去找一些HTML2TEXT之类的模块,
否则就得自己写 Parser 去实现浏览器做的一些事情。人生苦短,先找模块
作者: WHY    时间: 2018-12-14 19:12

回复  WHY



有些倒退。分节不见了。哎。确实复杂。
lxh623 发表于 2018-12-14 15:07



    什么呀,44楼就是这样子的,为啥不一开始就说清楚啊?我至今任然搞不懂你到底需要什么样的格式。
作者: WHY    时间: 2018-12-14 19:16

57#改一下,如果还有问题本贴我放弃。
作者: lxh623    时间: 2018-12-14 19:27

不好意思,有些让您不舒服了。
网站有不同的代码。我也不明白,究竟多少变化。
顶楼,我写的是“正文保持原来网页转行与隔行,就好了。”
这个网站比别的诗歌网有个好处,没有一行一个空行。外行看外观基本是一样的,但是,内行看代码,就有许多不一样。
谢谢了。我会自己在脚本和TextForever_chn之间来尝试。
作者: lxh623    时间: 2018-12-15 09:12

回复  lxh623

如果网站不限制下载的话,把同时下载开大些,单个文件的线程小点。百兆宽带。限制最大下载 ...
xczxczxcz 发表于 2018-12-14 17:52

麻烦写的详细一些。比如,链接写入一个文本,是不是可以自己保存网页为文本?保存地址?
作者: lxh623    时间: 2018-12-15 10:13

有个批处理。
  1. @grep -c "</div><div>" *.html>"%~dp0统计.txt"
复制代码
怎样把它用于所有子文件夹?合并统计或者分别统计。
谢谢!
作者: WHY    时间: 2018-12-16 00:43

回复 63# lxh623


    顶楼的描述可能你认为清楚,但我相信绝大多数人不清楚。
1.我只是在 html 中的“作者”前面加上 TTT 就完全满足了你的要求;
2.我要是把 html 完整地转换成 txt 文本,而不抠出诗词部分,也完全满足你的要求;
3.我要是只截取 html 的诗词部分,不经任何处理另存为 html 也完全满足你的要求。
作者: hlzj88    时间: 2018-12-16 23:04

凑热闹贴,没有进一步优化。
  1. rem 从诗文txt就可知已经下载的进度
  2. for /l %%g in (1,1,20) do (
  3.     wget --user-agent="Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.3) Gecko/2008092416 Firefox/3.0.3" --no-check-certificate -e robots=off -c -N -t 0 -T 10 -O index.html "http://www.52shici.com/original.php?type=%%g"
  4.      sed -n '/text-dashed/,/pages/'{p} index.html>>teste.ini
  5.      findstr /iv "works-info" teste.ini>>dizhi.ini
  6.      del teste.ini
  7.      sed -i "s/\"/\n\"\nhttp:\/\/www.52shici.com\//g" dizhi.ini
  8.      findstr /i "php" dizhi.ini>>dizhi.inf
  9. for /f "delims=*" %%i in (dizhi.inf) do (
  10.   wget --user-agent="Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.3) Gecko/2008092416 Firefox/3.0.3" --no-check-certificate -e robots=off -c -N -t 0 -T 10 -O wz.ini "%%i"
  11.      iconv -c -f utf-8 -t GBK "wz.ini" >wz1.ini
  12.      findstr /i "author" 235253.html|findstr /i "nbsp">>wz1.ini
  13.      sed -n '/works-content/,/works-info/'{p} wz1.ini>>testw.ini
  14.      findstr /iv "works-info" testw.ini>>zw.html
  15.      del teste.ini
  16.      htox32c /IP /O0 zw.html>nul 2>nul
  17.      type zw.txt>>诗文%%g.txt
  18.      del zw.txt
  19.      del *.ini
  20. )
  21. del *.inf
  22. )
  23. pause
复制代码

作者: lxh623    时间: 2018-12-17 09:22

回复 67# hlzj88

下载了index ,就不动了。
作者: lxh623    时间: 2018-12-17 09:25

本帖最后由 lxh623 于 2018-12-17 09:30 编辑

回复 66# WHY

真的麻烦你多次,不好意思。
44楼的脚本,把正文的空格删了,希望能保留。
另外,标题有<>,标题就可能提取不到。脚本和textforever一样,真是复杂。http://www.zgshige.com/c/2016-09-01/1735356.shtml
能不能最后改一改?谢谢!
作者: lxh623    时间: 2018-12-17 10:03

本帖最后由 lxh623 于 2018-12-17 10:29 编辑

回复 5# flashercs

分节的空行希望保留,还有题记、注释、发布时间也保留。浏览数不要(我自己可以批量删除)。
题记http://www.zgshige.com/c/2018-12-15/7967119.shtml
注释http://www.zgshige.com/c/2018-12-15/7967226.shtml

这个标题保存得到,无论是否含有单书名号。

您的提取脚本不会用。我的文件在M:\zgshige子文件夹。要求跟下载一样。
谢谢!
作者: WHY    时间: 2018-12-17 18:36

回复 69# lxh623


    66楼你真没明白啥意思,还是有意回避?
以这个网址 http://www.zgshige.com/c/2016-09-01/1735356.shtml 为例,你希望得到的结果到底是什么?
44楼有问题,我更新到 57 楼了。其结果用记事本打开是这样子的:
  1. <h3>TTT<感怀李时珍></h3> 作者: 人生入梦 2016年09月01日13:03 浏览:190 <br /><br />风起 雨落如若几十个春秋<br />心头的蓝叩响烛火 月白<br />枕垫下的青梦 在逆流里一点点修长<br />一剂剂茫然 反复斟酌<br />穿针引线 高山流水结满命运的纯白<br />斑驳的岁月 星辰向北<br />丢了酒中的暖<br />只为离经叛道的一个清晨<br />洗涤书籍中的暗疾<br /><br />荡起来 一汪**的光芒<br />漫下船舶 芦苇 云烟的眸子<br />一杆秤有雪 有远方<br />雨湖一层层的白 掀起<br />历史的绯红<br />点点萤火打开浅浅的咸<br />隔着天涯扎进尘世<br />身轻如草 剃去满山的琉璃<br />一声轻咳<br />便顺从了五角落叶的指向<br /><br />把今生搁置华发横生<br />摘取水的一个意外 盈盈如桃花<br />波光的对岸 手捧一簇月光<br />抵过一阵阵苍凉<br />大锣鼓 唱大戏<br />杯中的涩 反复折磨已醉的人<br />一点点落空 聚集 月色里往返<br />放逐夜的媚<br />
复制代码
看看与你希望的结果差别在哪里,然后把你希望的结果贴出来。
作者: lxh623    时间: 2018-12-17 18:58

回复 71# WHY

这样的结果 就非常好了。
前一次,删除了空格。得不到单书名号的标题。
我以为66楼是牢骚,不好意思。现在这样就好。

标题是昨天发现的,别的网站也有过类似问题。空格是今天发现的。

谢谢!祝您开心!
作者: hlzj88    时间: 2018-12-17 19:49

回复 68# lxh623
代码中同时使用了  wget sed htox32c 三个软件,都可在http://bcn.bathome.net/s/tool/index.html中下载到。
作者: flashercs    时间: 2018-12-18 06:26

本帖最后由 flashercs 于 2018-12-18 06:36 编辑

回复 70# lxh623

你表面是提取txt文本,实际上是用来当作html使用,对吧?这样每个子文件夹提取为一个txt文件,其实是个没有<head><body>的html文本,例如提取出的"2018-12-17.txt",将其重命名为"2018-12-17.txt.html"后用浏览器打开,就是个完整的html文档,浏览器自动添加<html><head><body>;我猜这应该是你的需求!
请保存为 "提取zgshige.bat"
  1. @echo off
  2. REM 设置htmlRoot = zgshige的html文件根目录
  3. set "htmlRoot=M:\zgshige"
  4. for /f "tokens=1 delims=:" %%A in ('findstr /n "#######*" %0') do more +%%A %0 >"%~dpn0.ps1"
  5. powershell.exe -ExecutionPolicy Bypass -File "%~dpn0.ps1" "%htmlRoot%"
  6. pause
  7. exit /b
  8. ################################################################
  9. # 保留html node
  10. param([string]$htmlRoot)
  11. [string]$scriptPath = [System.IO.Path]::GetDirectoryName($MyInvocation.MyCommand.Definition)
  12. $htmldoc = New-Object -ComObject htmlfile
  13. [void]$htmldoc.IHTMLDocument2_open()
  14. $htmldoc.IHTMLDocument2_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>')
  15. $htmldoc.IHTMLDocument2_close()
  16. [System.IO.Directory]::GetDirectories($htmlRoot, '*', [System.IO.SearchOption]::AllDirectories)|ForEach-Object {
  17.   $sw = [System.IO.StreamWriter]::new([System.IO.Path]::Combine($scriptPath, [System.IO.Path]::GetFileName($_) + '.txt'), $true, [System.Text.Encoding]::UTF8)
  18.   $sw.AutoFlush = $true
  19.   [System.IO.Directory]::GetFiles($_, '*.html')|ForEach-Object {
  20.     $m = [System.IO.File]::ReadAllText($_, [System.Text.Encoding]::UTF8) -match '<div class="text-center b-b b-2x b-lt">[\S\s]+?(?=<div class="p-sm">)'
  21.     if ($m) {
  22.       Write-Host "提取$_" -ForegroundColor Green
  23.       try {
  24.         $htmldoc.body.innerHTML = $Matches[0]
  25.         $div = $htmldoc.createElement('div');
  26.         # title
  27.         [void]$div.appendChild($htmldoc.body.getElementsByTagName('h3')[0])
  28.         # author
  29.         $divAuthor = $htmldoc.createElement('div')
  30.         [void]$divAuthor.appendChild($htmldoc.body.children[1].children[0].children[0])
  31.         $span = $divAuthor.appendChild($htmldoc.body.children[1].children[0].children[0])
  32.         [void]$span.removeAttributeNode($span.getAttributeNode('class'))
  33.         [void]$div.appendChild($divAuthor)
  34.         # signatureDiv
  35.         $divSignature = $htmldoc.createElement('div')
  36.         $nodeSig = $htmldoc.body.getElementsByClassName('signature')[0]
  37.         if ($null -ne $nodeSig) {
  38.           $span = $htmldoc.createElement('span')
  39.           [void]$span.appendChild($htmldoc.createTextNode($nodeSig.textContent))
  40.           [void]$divSignature.appendChild($span)
  41.         }
  42.         $nodeSigbox = $htmldoc.body.getElementsByClassName('signatureBox')[0]
  43.         if ($null -ne $nodeSigbox) {
  44.           $span = $htmldoc.createElement('span')
  45.           [void]$span.appendChild($htmldoc.createTextNode($nodeSigbox.textContent))
  46.           [void]$divSignature.appendChild($span)
  47.         }
  48.         [void]$div.appendChild($divSignature)
  49.         # content
  50.         $divContent = $htmldoc.body.getElementsByClassName('m-lg font14')[0]
  51.         [void]$divContent.attributes.removeNamedItem('class')
  52.         [void]$div.appendChild($divContent)
  53.         $sw.WriteLine($div.outerHTML)
  54.         Remove-Variable -Name div
  55.       }
  56.       catch {}
  57.     }
  58.   }
  59.   $sw.Close()
  60. }
  61. Remove-Variable -Name htmldoc
复制代码

作者: lxh623    时间: 2018-12-19 08:18

回复 74# flashercs
不知道你做个试验没有,就是做一个文件夹,放入一两个文件。
我这里不行。谢谢!
作者: flashercs    时间: 2018-12-19 17:24

回复 75# lxh623

请把html文件放到M:\zgshige\test\目录下.
作者: 523066680    时间: 2018-12-19 17:32

已经第六页了,凑个热闹……




欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2