标题: [已解决]各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- 0<1/*,:
- @echo off
- %windir%\system32\CScript.exe -nologo -e:jscript %0
- pause
- exit /b
- */;
- (function () {
- var xhr = (function () {
- var aXMLHttpVers = ['MSXML2.XMLHTTP.6.0', 'MSXML2.XMLHTTP.3.0', 'MSXML2.XMLHTTP', 'Microsoft.XMLHTTP'];
- for (var i = 0; i < aXMLHttpVers.length; i++) {
- try {
- return new ActiveXObject(aXMLHttpVers[i]);
- } catch (error) { }
- }
- showError('Can\'t build XMLHTTP automation object.');
- WScript.Quit(1);
- })(),
- fso = new ActiveXObject('Scripting.FileSystemObject'),
- htmldoc = new ActiveXObject('htmlfile'),
- oADO = new ActiveXObject('ADODB.Stream'),
- domain = "http://www.zgshige.com",
- outFile = "shige.txt",
- cacheFile = "cache.txt",
- tsOut,
- tsCache,
- oCache = {},
- url,
- aIndex = [],
- nextPage,
- nodes,
- reScriptNode = /<script[^>]*>[\s\S]*?<\/script>(?!['"'])/g,
- i,
- l;
- oADO.Mode = 3;
- new ActiveXObject('WScript.Shell').CurrentDirectory = fso.GetParentFolderName(WScript.ScriptFullName);
- try {
- tsCache = fso.OpenTextFile(cacheFile, 1, true);
- } catch (e) {
- WScript.Echo('can not read cache file ' + cacheFile);
- WScript.Quit(1);
- }
- while (!tsCache.AtEndOfStream) {
- oCache[tsCache.ReadLine()] = true;
- }
- tsCache.Close();
- try {
- tsCache = fso.OpenTextFile(cacheFile, 8, true);
- } catch (e) {
- showError(e, 'can not write cache file ' + cacheFile);
- WScript.Quit(2);
- }
- try {
- tsOut = fso.OpenTextFile(outFile, 8, true, -1);//unicode encoding
- } catch (e) {
- showError(e, 'can not write file ' + outFile);
- WScript.Quit(3);
- }
- // url可以自己设置起始下载位置;例如 url = 'http://www.zgshige.com/zcms/catalog/15112/pc/index_29937.shtml';
- url = 'http://www.zgshige.com/sg/index.shtml';
- while (url) {
- if (!getHTML(url)) break;
- aIndex.length = 0;
- nodes = htmldoc.documentElement.getElementsByClassName('fc-green text-uppercase');
- for (i = 0, l = nodes.length; i < l; ++i) {
- aIndex.push(parseURL(nodes[i].getAttribute('href'), url));
- }
- nodes = htmldoc.documentElement.getElementsByClassName('fc_ch1');
- for (nextPage = null, i = 0, l = nodes.length; i < l; ++i) {
- if (nodes[i].firstChild.nodeValue === '下一页') {
- nextPage = parseURL(nodes[i].parentNode.getAttribute('href'), url);
- break;
- }
- }
- // WScript.StdOut.WriteLine('aIndex.length=' + aIndex.length);
- // WScript.StdOut.WriteLine('innerHTML=' + htmldoc.documentElement.childNodes[0].innerHTML);
- for (i = 0, l = aIndex.length; i < l; ++i) {
- url = aIndex[i];
- if (oCache[url] || !getHTML(url)) continue;
- try {
- 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'));
- tsCache.WriteLine(url);
- } catch (e) {
-
- }
- }
- url = nextPage;
- }
- tsOut.close();
- tsCache.close();
- WScript.Quit();
-
- function parseURL(href, url) {
- var $path = href.replace(/^[^:]*:/, '');
- if (/^\/\/.*/.test($path)) {
- return href;
- } else if (/^\/.*/.test($path)) {
- return domain + $path;
- } else {
- return url.replace(/[^\/]+$/, '') + $path;
- }
- }
- function showError(err, source) {
- WScript.StdOut.WriteLine('[object Error]' === Object.prototype.toString.call(err) ?
- [
- err.name,
- 'source: ' + (undefined === source ? '' : source),
- 'number: ' + (err.number >>> 0).toString(16),
- 'Information: ' + err.message
- ].join('\r\n')
- :
- err);
- }
- function getHTML(url) {
- WScript.StdOut.Write('fetching ' + url + '...')
- xhr.open('GET', url, false);
- xhr.setRequestHeader('Accept', 'text/html, application/xhtml+xml, application/xml; q=0.9, */*; q=0.8');
- xhr.setRequestHeader('Accept-Language', 'en-US, en; q=0.8, zh-Hans-CN; q=0.5, zh-Hans; q=0.3');
- xhr.setRequestHeader('Accept-Encoding', 'gzip, deflate');
- xhr.setRequestHeader('TE', 'gzip, deflate');
- xhr.setRequestHeader('Cache-Control', 'no-cache');
- 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');
- try {
- xhr.send();
- if (200 === xhr.status) {
- oADO.Type = 1;
- oADO.Open();
- oADO.Write(xhr.responseBody);
- oADO.Position = 0;
- oADO.Type = 2;
- oADO.Charset = 'utf-8';
- htmldoc.open();
- htmldoc.write(oADO.ReadText(-1).replace(reScriptNode, ''));
- } else {
- WScript.StdOut.WriteLine('failed')
- return false
- }
- } catch (e) {
- WScript.StdOut.WriteLine('failed')
- return false;
- } finally {
- htmldoc.close();
- oADO.Close();
- }
- WScript.StdOut.WriteLine('success')
- return true;
- }
- })();
复制代码
作者: 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- @echo off
- echo;Wait ...
- PowerShell -exec ByPass -f "startScript.ps1"
- echo;Done
- pause
复制代码
startScript.ps1
修改 startScript.ps1 第11行变量 $i 的取值范围,这里是从第一页到第100页- $SessionState = [System.Management.Automation.Runspaces.InitialSessionState]::CreateDefault();
- $Pool = [RunspaceFactory]::CreateRunspacePool(1, 5, $SessionState, $Host);
- $Pool.Open();
-
- $ScriptBlock = {
- param([int]$StartIndex, [int]$EndIndex)
- PowerShell -exec ByPass -f "DownLoadURL.ps1" -StartIndex $StartIndex -EndIndex $EndIndex;
- }
-
- $Jobs = @(); $Step = 4;
- for ($i = 1; $i -le 100; $i+=$Step) {
- $Start = $i;
- $End = $i + $step - 1;
- $PowerShell = [PowerShell]::Create().AddScript($ScriptBlock).AddArgument($Start).AddArgument($End);
- $PowerShell.RunspacePool = $Pool;
- $Jobs += $PowerShell.BeginInvoke();
- }
-
- while (!$ok) {
- $ok = $True;
- ForEach ($Job In $Jobs) { If (!$Job.IsCompleted) {$ok = $False} }
- sleep -Milliseconds 200
- }
复制代码
DownLoadURL.PS1
修改 DownLoadURL.PS1 第 6 行 $type 的值,可以取值从 1~19- param([int]$StartIndex, [int]$EndIndex);
- $path = 'E:\52shici\'; #html文件保存路径
- $web = New-Object System.Net.WebClient;
- $web.Encoding = [Text.Encoding]::UTF8;
-
- $type = 1;
- $fd = $path + $type;
- If (!(Test-Path $fd)) { $null = md $fd; }
-
- for ($i=$StartIndex; $i -le $EndIndex; $i++) {
- $url = 'http://www.52shici.com/original.php?type=' + $type + '&page=' + $i;
- $str = $web.DownloadString($url);
- forEach ($m In [regex]::Matches($str, '<li><span class="l"><a\s+target="_blank" href="([^"]*)"')) {
- $var = 'http://www.52shici.com/' + $m.Groups[1].Value;
- $name = ($var -replace '.*\?');
- $s = $web.DownloadString($var);
- $s = $s -replace '(?<=<span class="author">)(.*?)文/', '$1作者 ';
- sc -Path ($fd + '\' + $name + '.html') -Value $s -Enc UTF8;
- }
- }
复制代码
作者: 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 运行。- param([int]$StartIndex, [int]$EndIndex);
- $path = 'E:\zgshige\'; #html文件保存路径
- $web = New-Object System.Net.WebClient;
- $web.Encoding = [Text.Encoding]::UTF8;
-
- for ($i=$StartIndex; $i -le $EndIndex; $i++) {
- $url = 'http://www.zgshige.com/zcms/catalog/15112/pc/index_' + $i + '.shtml';
- $str = $web.DownloadString($url);
- forEach ($m In [regex]::Matches($str, '(?i)<a class="fc-green text-uppercase" href="(http[^"]*)"')) {
- $var = $m.Groups[1].Value;
- $fd = $path + ($var -replace '.*/([^/]+)/[^/]+$', '$1');
- If (!(Test-Path $fd)) { $null = md $fd; }
- $name = $var -replace '.*/([^/]+)\.s?html$', '$1';
- $s = $web.DownloadString($var);
- $s = $s -replace '<h3>(?!TTT)', '$&TTT';
- sc -Path ($fd + '\' + $name + '.html') -Value $s -Enc UTF8;
- }
- }
复制代码
改一下正则,提高点速度。
作者: lxh623 时间: 2018-11-19 21:59
windows8,下周windows10 。谢谢!
作者: flashercs 时间: 2018-11-20 09:03
52shici还有两个内容 works 和 posts 开始搞错了都......也不知要哪个?都弄上吧.
52shiciWorks.bat- 0<1/*,:
- @echo off
- CScript.exe -nologo -e:jscript %0
- pause
- exit /b
- */;
- (function () {
- var xhr = (function () {
- var aXMLHttpVers = ['MSXML2.XMLHTTP.6.0', 'MSXML2.XMLHTTP.3.0', 'MSXML2.XMLHTTP', 'Microsoft.XMLHTTP'];
- for (var i = 0; i < aXMLHttpVers.length; i++) {
- try {
- return new ActiveXObject(aXMLHttpVers[i]);
- } catch (error) { }
- }
- showError('Can\'t build XMLHTTP automation object.');
- WScript.Quit(1);
- })(),
- fso = new ActiveXObject('Scripting.FileSystemObject'),
- htmldoc = new ActiveXObject('htmlfile'),
- domain = "http://www.52shici.com",
- outFile = "52shici_works.txt",
- cacheFile = "cache_52shici_works.txt",
- tsOut,
- tsCache,
- oCache = {},
- url,
- reCrLfS = /\r?\n */g,
- i,
- l,
- aIndex = [];
- new ActiveXObject('WScript.Shell').CurrentDirectory = fso.GetParentFolderName(WScript.ScriptFullName);
- try {
- tsCache = fso.OpenTextFile(cacheFile, 1, true);
- } catch (e) {
- showError('can not read cache file ' + cacheFile);
- WScript.Quit(1);
- }
- while (!tsCache.AtEndOfStream) {
- oCache[tsCache.ReadLine()] = true;
- }
- tsCache.Close();
- try {
- tsCache = fso.OpenTextFile(cacheFile, 8, true);
- } catch (e) {
- showError(e, 'can not write cache file ' + cacheFile);
- WScript.Quit(2);
- }
- try {
- tsOut = fso.OpenTextFile(outFile, 8, true, -1);//unicode encoding
- } catch (e) {
- showError(e, 'can not write file ' + outFile);
- WScript.Quit(3);
- }
- // main
- for (var type = 0; type <= 19; ++type) {
- var url = 'http://www.52shici.com/original.php?type=' + type + '&page=';
- var totalPages;
- if (!getHTMLindex(url + 1, true)) continue;
- var body = htmldoc.body;
- totalPgs = body.lastChild.innerText.match(/当前\d+\/(\d+)页/)[1];
- WSH.Echo('totalpages=' + totalPgs);
- for (var m = 1; m <= totalPgs; ++m) {
- if (oCache[url + m] || !getHTMLindex(url + m)) continue;
- body = htmldoc.body;
- var aList = body.getElementsByTagName('a');
- aIndex.length = 0;
- for (i = 0, l = aList.length; i < l; ++i) {
- aIndex.push(parseURL(aList[i].getAttribute('href'), url));
- }
- for (i = 0, l = aIndex.length; i < l; ++i) {
- getContent(aIndex[i]);
- }
- tsCache.WriteLine(url + m);
- }
-
- }
- tsOut.close();
- tsCache.close();
- WScript.Quit();
- function getContent(url) {
- if (oCache[url] || !getHTML(url)) return;
- var main = htmldoc.body.children[0];
- var nodes = main.children;
- try {
- for (var i = 0, l = nodes.length; i < l; ++i) {
- var item = nodes[i];
- switch (item.className) {
- case 'works-h1':
- var title = 'TTT ' + item.children[0].innerText;
- // WSH.Echo( 'title: '+title);
- var author = item.children[1].innerText.replace('文/', '作者:');
- // WSH.Echo( 'author: '+author);
- break;
- case 'works-content':
- var content = item.innerText;
- i = l;
- break;
- default:
- break;
- }
- }
- tsOut.WriteLine((title + '\r\n' + author + '\r\n' + content).replace(reCrLfS, '<br/>\r\n'));
- tsCache.WriteLine(url);
- } catch (e) {
- showError(e);
- }
-
- }
-
- function showError(err, source) {
- WScript.StdOut.WriteLine('[object Error]' === Object.prototype.toString.call(err) ?
- [
- err.name,
- 'source: ' + (undefined === source ? '' : source),
- 'number: ' + (err.number >>> 0).toString(16),
- 'Information: ' + err.message
- ].join('\r\n')
- :
- err);
- }
- function getHTMLindex(url, boltotalPages) {
- WScript.StdOut.Write('fetching ' + url + '...')
- xhr.open('GET', url, false);
- xhr.setRequestHeader('Accept', 'text/html, application/xhtml+xml, application/xml; q=0.9, */*; q=0.8');
- xhr.setRequestHeader('Accept-Language', 'en-US, en; q=0.8, zh-Hans-CN; q=0.5, zh-Hans; q=0.3');
- xhr.setRequestHeader('host', 'www.52shici.com/');
- xhr.setRequestHeader('Connection', 'close');
- xhr.setRequestHeader('Cache-Control', 'no-cache');
- 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');
- try {
- xhr.send();
- // WSH.Echo(xhr.responseText.match(/<span[^>]*class=['"]mt['"][^>]*>[^<]*<\/span>/i)[0]);
- // WSH.Quit();
- if (200 === xhr.status) {
- htmldoc.open();
- 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>');
- } else {
- WScript.StdOut.WriteLine('failed. status:' + xhr.status);
- return false
- }
- } catch (e) {
- WScript.StdOut.WriteLine('failed');
- return false;
- } finally {
- htmldoc.close();
- }
- WScript.StdOut.WriteLine('success');
- return true;
- }
- function getHTML(url) {
- WScript.StdOut.Write('fetching ' + url + '...')
- xhr.open('GET', url, false);
- xhr.setRequestHeader('Accept', 'text/html, application/xhtml+xml, application/xml; q=0.9, */*; q=0.8');
- xhr.setRequestHeader('Accept-Language', 'en-US, en; q=0.8, zh-Hans-CN; q=0.5, zh-Hans; q=0.3');
- xhr.setRequestHeader('host', 'www.52shici.com/');
- xhr.setRequestHeader('Connection', 'close');
- xhr.setRequestHeader('Cache-Control', 'no-cache');
- 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');
- try {
- xhr.send();
- if (200 === xhr.status) {
- htmldoc.open();
- var aTxt = xhr.responseText.match(/<div class="main"[\s\S]+(?=<!--main end -->)/i);
- htmldoc.write('<!DOCTYPE html><html><head></head><body>' + aTxt[0] + '</body></html>');
- } else {
- WScript.StdOut.WriteLine('failed. status:' + xhr.status);
- return false
- }
- } catch (e) {
- WScript.StdOut.WriteLine('failed');
- return false;
- } finally {
- htmldoc.close();
- }
- WScript.StdOut.WriteLine('success');
- return true;
- }
- function parseURL(href, url) {
- var $path = href.replace(/^[^:]*:/, '');
- if (/^\/\/.*/.test($path)) {
- return href;
- } else if (/^\/.*/.test($path)) {
- return domain + $path;
- } else {
- return url.replace(/[^\/]+$/, '') + $path;
- }
- }
- })();
复制代码
52shiciPosts.bat- 0<1/*,:
- @echo off
- CScript.exe -nologo -e:jscript %0
- pause
- exit /b
- */;
- (function () {
- var xhr = (function () {
- var aXMLHttpVers = ['MSXML2.XMLHTTP.6.0', 'MSXML2.XMLHTTP.3.0', 'MSXML2.XMLHTTP', 'Microsoft.XMLHTTP'];
- for (var i = 0; i < aXMLHttpVers.length; i++) {
- try {
- return new ActiveXObject(aXMLHttpVers[i]);
- } catch (error) { }
- }
- showError('Can\'t build XMLHTTP automation object.');
- WScript.Quit(1);
- })(),
- fso = new ActiveXObject('Scripting.FileSystemObject'),
- htmldoc = new ActiveXObject('htmlfile'),
- domain = "http://www.52shici.com",
- outFile = "52shici_posts.txt",
- cacheFile = "cache_52shici_posts.txt",
- tsOut,
- tsCache,
- oCache = {},
- url,
- reCrLfS = /\r?\n */g,
- i,
- l = 300000,
- strOut,
- nodeContent,
- sTitle,
- sAuthor,
- sContent;
- new ActiveXObject('WScript.Shell').CurrentDirectory = fso.GetParentFolderName(WScript.ScriptFullName);
- try {
- tsCache = fso.OpenTextFile(cacheFile, 1, true);
- } catch (e) {
- showError('can not read cache file ' + cacheFile);
- WScript.Quit(1);
- }
- while (!tsCache.AtEndOfStream) {
- oCache[tsCache.ReadLine()] = true;
- }
- tsCache.Close();
- try {
- tsCache = fso.OpenTextFile(cacheFile, 8, true);
- } catch (e) {
- showError(e, 'can not write cache file ' + cacheFile);
- WScript.Quit(2);
- }
- try {
- tsOut = fso.OpenTextFile(outFile, 8, true, -1);//unicode encoding
- } catch (e) {
- showError(e, 'can not write file ' + outFile);
- WScript.Quit(3);
- }
- // main
- for (i = 1; i < l; ++i) {
- if (oCache['' + i]) continue;
- url = 'http://www.52shici.com/posts.php?id=' + i;
- if (!getHTML(url)) continue;
- var node = htmldoc.documentElement.childNodes[1].childNodes[0];
- try {
- for (var m = 0, n = node.childNodes.length; m < n; ++m) {
- var item = node.childNodes[m];
- switch (item.className) {
- case 'posts-h1':
- sTitle = 'TTT ' + item.innerText;
- break;
- case 'posts-h2':
- sAuthor = '作者:' + item.firstChild.innerText;
- break;
- case 'posts-content':
- item.removeChild(item.lastChild);
- sContent = item.innerText;
- break;
- default:
- break;
- }
- }
- strOut = sTitle + '\r\n' + sAuthor + '\r\n' + sContent;
- tsOut.WriteLine(strOut.replace(reCrLfS, '<br/>\r\n'));
- tsCache.WriteLine(i);
- } catch (e) {
- continue;
- }
- }
- tsOut.close();
- tsCache.close();
- WScript.Quit();
-
- function showError(err, source) {
- WScript.StdOut.WriteLine('[object Error]' === Object.prototype.toString.call(err) ?
- [
- err.name,
- 'source: ' + (undefined === source ? '' : source),
- 'number: ' + (err.number >>> 0).toString(16),
- 'Information: ' + err.message
- ].join('\r\n')
- :
- err);
- }
- function getHTML(url) {
- WScript.StdOut.Write('fetching ' + url + '...')
- xhr.open('GET', url, false);
- xhr.setRequestHeader('Accept', 'text/html, application/xhtml+xml, application/xml; q=0.9, */*; q=0.8');
- xhr.setRequestHeader('Accept-Language', 'en-US, en; q=0.8, zh-Hans-CN; q=0.5, zh-Hans; q=0.3');
- xhr.setRequestHeader('host', 'www.52shici.com/');
- xhr.setRequestHeader('Connection', 'close');
- xhr.setRequestHeader('Cache-Control', 'no-cache');
- 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');
- try {
- xhr.send();
- if (200 === xhr.status) {
- htmldoc.open();
- var aTxt = xhr.responseText.match(/<div class="sidebar"[\s\S]+(?=<div class="posts-do")/i);
- if (!aTxt) throw false;
- htmldoc.write('<!DOCTYPE html><html><head><meta http-equiv="Content-Type" content="text/html; charset=GB2312" /></head><body>' + aTxt[0] + '</div></body></html>');
- } else {
- WScript.StdOut.WriteLine('failed. status:' + xhr.status);
- return false
- }
- } catch (e) {
- WScript.StdOut.WriteLine('failed');
- return false;
- } finally {
- htmldoc.close();
- }
- WScript.StdOut.WriteLine('success');
- return true;
- }
- })();
复制代码
作者: 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- @echo off
- REM 设置htmlRoot = 52shici的html文件根目录
- set "htmlRoot=E:\PowerShell\WebHttpRequest\52shici\html"
- REM 设置txtFilePath = 提取的文本文件名,放在脚本同目录下
- set "txtFilePath=提取52shici.txt"
- for /f "tokens=1 delims=:" %%A in ('findstr /n "#######*" %0') do more +%%A %0 >"%~dpn0.ps1"
- powershell.exe -ExecutionPolicy Bypass -File "%~dpn0.ps1" "%htmlRoot%" "%~dp0%txtFilePath%"
- pause
- exit /b
- ################################################################
- param([string]$htmlRoot, [string]$txtFilePath)
- $sw = [System.IO.StreamWriter]::new($txtFilePath, $true, [System.Text.Encoding]::Unicode)
- $sw.AutoFlush = $true
- # [string]$scriptPath = [System.IO.Path]::GetDirectoryName($MyInvocation.MyCommand.Defination)
- $htmldoc = New-Object -ComObject htmlfile
- $null = $htmldoc.IHTMLDocument2_open()
- $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>')
- $htmldoc.IHTMLDocument2_close()
- [System.IO.Directory]::GetFiles($htmlRoot, '*.html', [System.IO.SearchOption]::AllDirectories)|ForEach-Object {
- $m = [System.IO.File]::ReadAllText($_, [System.Text.Encoding]::UTF8) -match '<div class="main"[\s\S]+(?=<!--main end -->)'
- if ($m) {
- Write-Host "提取$_" -ForegroundColor Green
- try {
- $htmldoc.body.innerHTML = $Matches[0]
- $div = $htmldoc.body.firstChild
- $nodeh1 = $div.getElementsByClassName('works-h1')[0]
- $title = 'TTT ' + $nodeh1.children[0].innerText
- $author = $nodeh1.children[1].innerText
- $content = $div.getElementsByClassName('works-content')[0].innerText
- $sw.WriteLine((($title + "`r`n" + $author + "`r`n" + $content + "`r`n") -replace "`r?`n\s*", "<br/>`r`n"))
- }
- catch {
-
- }
- }
- }
- Remove-Variable -Name htmldoc
- $sw.Close()
复制代码
作者: flashercs 时间: 2018-11-23 13:42
本帖最后由 flashercs 于 2018-12-6 22:28 编辑
提取zgshige.bat- @echo off
- REM 设置htmlRoot = zgshige的html文件根目录
- set "htmlRoot=E:\PowerShell\WebHttpRequest\zgshige\htmlsrc"
- REM 设置txtFilePath = 提取的文本文件名
- set "txtFilePath=提取zgshige.txt"
- for /f "tokens=1 delims=:" %%A in ('findstr /n "#######*" %0') do more +%%A %0 >"%~dpn0.ps1"
- powershell.exe -ExecutionPolicy Bypass -File "%~dpn0.ps1" "%htmlRoot%" "%~dp0%txtFilePath%"
- pause
- exit /b
- ################################################################
- param([string]$htmlRoot, [string]$txtFilePath)
- $sw = [System.IO.StreamWriter]::new($txtFilePath, $true, [System.Text.Encoding]::Unicode)
- $sw.AutoFlush = $true
- # [string]$scriptPath = [System.IO.Path]::GetDirectoryName($MyInvocation.MyCommand.Defination)
- $htmldoc = New-Object -ComObject htmlfile
- $null = $htmldoc.IHTMLDocument2_open()
- $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>')
- $htmldoc.IHTMLDocument2_close()
- [System.IO.Directory]::GetFiles($htmlRoot, '*.html', [System.IO.SearchOption]::AllDirectories)|ForEach-Object {
- $m = [System.IO.File]::ReadAllText($_, [System.Text.Encoding]::UTF8) -match '(?<=<!-- 诗歌正文开始 -->)[\s\S]+(?=<!-- 诗歌正文结束 -->)'
- if ($m) {
- Write-Host "提取$_" -ForegroundColor Green
- try {
- $htmldoc.body.innerHTML = $Matches[0]
- $title = 'TTT ' + $htmldoc.body.getElementsByTagName('h3')[0].innerText
- $author = $htmldoc.body.children[1].children[0].children[0].innerText
- $content = $htmldoc.body.getElementsByClassName('m-lg font14')[0].innerText
- $sw.WriteLine((($title + "`r`n" + $author + "`r`n" + $content + "`r`n") -replace "\r?\n\s*", "<br/>`r`n"))
- }
- catch {
-
- }
- }
- }
- Remove-Variable -Name htmldoc
- $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- @echo off
- set "htmlPath=E:\zgshige"
- dir /b /s "%htmlPath%\*.html" > List.txt
- PowerShell -exec ByPass -f "zgshige.PS1" List.txt
- del List.txt
- pause
复制代码
zgshige.PS1- param([String]$ListFile);
- $stream = New-Object IO.StreamWriter('zgshige.Log', $True, [Text.Encoding]::UTF8);
-
- forEach ($file In (type $ListFile -ReadCount 0)) {
- $str = [IO.File]::ReadAllText($file, [Text.Encoding]::UTF8);
- $arr = $str -split '<!--\s*诗歌正文(?:开始|结束)\s*-->';
- If ($arr.Count -eq 3) {
- $s = $arr[1] -replace '<h3>(?!TTT)', '$&TTT';
- $s = $s -replace '(?<!\r)\n', "`r`n";
- $s = $s -replace ' |<(?!br)[^>]*>';
- $s = $s -replace '(?m)^\s+';
- $stream.WriteLine($s + "`r`n");
- If (++$n % 6000 -eq 0) { $stream.Flush(); }
- }
- }
- $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- @echo off
- set "htmlPath=E:\52shici"
- dir /b /s "%htmlPath%\*.html" > List.txt
- PowerShell -exec ByPass -f "52shici.PS1" List.txt
- del List.txt
- pause
复制代码
52shici.PS1- param([String]$ListFile);
- $stream = New-Object IO.StreamWriter('52shici.Log', $True, [Text.Encoding]::UTF8);
- $reg1 = [regex]'<em>([^<>]*)</em>\s*<span class="author">([^<>]*)</span>';
- $reg2 = [regex]'<div class="works-content"[\s\S]*被阅读过\s*\d+\s*次';
-
- forEach ($file In (type $ListFile -ReadCount 0)) {
- $str = [IO.File]::ReadAllText($file, [Text.Encoding]::UTF8);
- $m1 = $reg1.Match($str);
- $m2 = $reg2.Match($str);
- If ($m1.Success -and $m2.Success) {
- $s = 'TTT' + $m1.Groups[1].Value + $m1.Groups[2].Value + "`r`n";
- $s += $m2.Groups[0].Value;;
- $s = $s -replace '(?<!\r)\n', '\r\n';
- $s = $s -replace ' |<(?!br)[^>]*>';
- $s = $s -replace '(?m)^\s+';
- $stream.WriteLine($s + "`r`n");
- If (++$n % 6000 -eq 0) { $stream.Flush(); }
- }
- }
- $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- param([int]$StartIndex, [int]$EndIndex);
- $path = 'E:\zgshige\'; #html文件保存路径
- $web = New-Object System.Net.WebClient;
- $web.Encoding = [Text.Encoding]::UTF8;
-
- for ($i=$StartIndex; $i -le $EndIndex; $i++) {
- $url = 'http://www.zgshige.com/zcms/catalog/15112/pc/index_' + $i + '.shtml';
- $str = $web.DownloadString($url);
- forEach ($m In [regex]::Matches($str, '(?i)<a class="fc-green text-uppercase" href="(http[^"]*)"')) {
- $var = $m.Groups[1].Value;
- $fd = $var -replace '.*/([^/]+)/[^/]+$', '$1';
- $name = $var -replace '.*/([^/]+)\.s?html$', '$1';
- If (Test-Path ($path + $fd + '\' + $name + '.html')) { continue; }
- $fd = $path + 'Lost\' + $fd;
- If (!(Test-Path $fd)) { $null = md $fd; }
- $s = $web.DownloadString($var);
- $s = $s -replace '<h3>(?!TTT)', '$&TTT';
- sc -Path ($fd + '\' + $name + '.html') -Value $s -Enc UTF8;
- }
- }
复制代码
作者: 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- 0<1/*,:
- @echo off
- CScript.exe -nologo -e:jscript %0
- pause
- exit /b
- */;
- function makeXHR() {
- for (var i = 0; i < aXMLHttpVers.length; i++) {
- try {
- return new ActiveXObject(aXMLHttpVers[i]);
- } catch (error) { }
- }
- showError('Can\'t build XMLHTTP automation object.');
- WScript.Quit(1);
- }
- function makeHtmldoc() {
- var htmldoc = new ActiveXObject('htmlfile');
- htmldoc.open();
- 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>');
- htmldoc.close();
- return htmldoc;
- }
- function makeADOStream() {
- var oADO = new ActiveXObject('ADODB.Stream');
- oADO.Mode = 3;
- return oADO;
- }
- function byte2str(ado, byteArr, sEncoding) {
- ado.Type = 1;
- ado.Open();
- ado.Write(byteArr);
- ado.Position = 0;
- ado.Type = 2;
- ado.Charset = sEncoding;
- var s = ado.ReadText(-1);
- ado.Close();
- return s;
- }
- function xhrWorkers() {
- var url;
- var xhr_ = makeXHR();
- var htmldoc = makeHtmldoc();
- var oADO = makeADOStream();
- var re = /<!-- 诗歌正文开始 -->[\s\S]+(?=<!-- 诗歌正文结束 -->)/i;
- xhr_.onReadyStateChange = function () {
- if (xhr_.readyState === 4) {
- if (xhr_.status === 200) {
- var str = byte2str(oADO, xhr_.responseBody, 'utf-8');
- var m = str.match(re);
- if (m) {
- try {
- htmldoc.body.innerHTML = m[0];
- var title = 'TTT ' + htmldoc.body.getElementsByTagName('h3')[0].innerText;
- var author = htmldoc.body.children[1].children[0].children[0].innerText;
- var content = htmldoc.body.getElementsByClassName('m-lg font14')[0].innerText;
- tsOut.WriteLine((title + '\r\n' + author + '\r\n' + content + '\r\n').replace(/\r?\n\s*/g, '<br/>\r\n'));
- tsCache.WriteLine(url);
- WScript.StdOut.WriteLine(url);
- } catch (e) {
- // WScript.StdOut.WriteLine(htmldoc.documentElement.getElementsByClassName ? 'className' : htmldoc.documentElement.getElementsByTagName ? 'tagName' : 'nothing');
- }
- }
- } else {
- WScript.StdOut.WriteLine(url + ' status=' + xhr_.status);
- }
- aXhr.push(worker);
- }
- };
- var worker = {
- job: function (method, uri, async) {
- url = uri;
- xhr_.open(method, uri, async);
- // setRequestHeaders(xhr_);
- xhr_.send();
- }
- };
- return worker;
- }
- function setRequestHeaders(xhr_) {
- xhr_.setRequestHeader('Accept', 'text/html, application/xhtml+xml, application/xml; q=0.9, */*; q=0.8');
- xhr_.setRequestHeader('Accept-Language', 'en-US, en; q=0.8, zh-Hans-CN; q=0.5, zh-Hans; q=0.3');
- xhr_.setRequestHeader('Accept-Encoding', 'gzip, deflate');
- xhr_.setRequestHeader('TE', 'gzip, deflate');
- // xhr_.setRequestHeader('Connection', 'close');
- xhr_.setRequestHeader('Cache-Control', 'no-cache');
- 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');
- }
- function parseURL(href, url) {
- var $path = href.replace(/^[^:]*:/, '');
- if (/^\/\/.*/.test($path)) {
- return href;
- } else if (/^\/.*/.test($path)) {
- return domain + $path;
- } else {
- return url.replace(/[^\/]+$/, '') + $path;
- }
- }
- function showError(err, source) {
- WScript.StdOut.WriteLine('[object Error]' === Object.prototype.toString.call(err) ?
- [
- err.name,
- 'source: ' + (undefined === source ? '' : source),
- 'number: ' + (err.number >>> 0).toString(16),
- 'Information: ' + err.message
- ].join('\r\n')
- :
- err);
- }
- var aXMLHttpVers = ['MSXML2.XMLHTTP.6.0', 'MSXML2.XMLHTTP.3.0', 'MSXML2.XMLHTTP', 'Microsoft.XMLHTTP'],
- fso = new ActiveXObject('Scripting.FileSystemObject'),
- domain = "http://www.zgshige.com",
- outFile = "zgshige.txt",
- cacheFile = "cache_zgshige.txt",
- tsOut,
- tsCache,
- oCache = {};
- new ActiveXObject('WScript.Shell').CurrentDirectory = fso.GetParentFolderName(WScript.ScriptFullName);
- try {
- tsCache = fso.OpenTextFile(cacheFile, 1, true);
- } catch (e) {
- WScript.Echo('can not read cache file ' + cacheFile);
- WScript.Quit(1);
- }
- while (!tsCache.AtEndOfStream) {
- oCache[tsCache.ReadLine()] = true;
- }
- tsCache.Close();
- try {
- tsCache = fso.OpenTextFile(cacheFile, 8, true);
- } catch (e) {
- showError(e, 'can not write cache file ' + cacheFile);
- WScript.Quit(2);
- }
- try {
- tsOut = fso.OpenTextFile(outFile, 8, true, -1);//unicode encoding
- } catch (e) {
- showError(e, 'can not write file ' + outFile);
- WScript.Quit(3);
- }
- var oTasks = {
- atEnd: false,
- current: null,
- moveNext: (function () {
- var aIndex = [];
- // var nextPage = 'http://www.zgshige.com/sg/index.shtml'; 可以自定义起始位置
- var nextPage = 'http://www.zgshige.com/zcms/catalog/15112/pc/index_201.shtml';
- var xhr = makeXHR();
- var htmldoc = makeHtmldoc();
- var oADO = makeADOStream();
- var re = /<!-- 主体开始 -->[\S\s]*?(?=<!-- 主体结束 -->)/i;
- var url = nextPage;
- xhr.onReadyStateChange = function () {
- if (xhr.readyState === 4) {
- if (200 === xhr.status) {
- var str = byte2str(oADO, xhr.responseBody, 'utf-8');
- var m = str.match(re);
- if (m) {
- htmldoc.body.innerHTML = m[0];
- var nodes = htmldoc.documentElement.getElementsByClassName('fc_ch1');
- for (nextPage = null, i = 0, l = nodes.length; i < l; ++i) {
- if (nodes[i].firstChild.nodeValue === '下一页') {
- nextPage = parseURL(nodes[i].parentNode.getAttribute('href'), url);
- break;
- }
- }
- if (!oCache[url]) {
- nodes = htmldoc.body.getElementsByClassName('fc-green text-uppercase');
- for (var i = 0, l = nodes.length; i < l; ++i) {
- var item = parseURL(nodes[i].getAttribute('href'), url);
- if (!oCache[item]) {
- aIndex.push(item);
- }
- }
- aIndex.push(url);
- }
- if (url = nextPage) {
- xhr.open('GET', url, true);
- // setRequestHeaders(xhr);
- xhr.send();
- } else {
- oTasks.atEnd = true;
- return false;
- }
-
- } else {
- nextPage = null;
- oTasks.atEnd = true;
- return false;
- }
- } else {
- nextPage = null;
- oTasks.atEnd = true;
- return false;
- }
- }
- };
- xhr.open('GET', url, true);
- setRequestHeaders(xhr);
- xhr.send();
- return function () {
- return aIndex.shift();
- };
- })()
- };
- var maxThreads = 20,
- aXhr = [],
- i, l, task,
- reIndex = /index.*html$/i;
- for (i = 0; i < maxThreads; ++i) {
- aXhr.push(xhrWorkers());
- }
- while (!oTasks.atEnd) {
- while (task = oTasks.moveNext()) {
- if (reIndex.test(task)) {
- tsCache.WriteLine(task);
- WScript.StdOut.WriteLine(task);
- continue;
- }
- while (!aXhr.length) {
- WScript.Sleep(10);
- }
- aXhr.shift().job('GET', task, true);
- }
- WScript.Sleep(100);
- }
- while (task = oTasks.moveNext()) {
- if (reIndex.test(task)) {
- tsCache.WriteLine(task);
- WScript.StdOut.WriteLine(task);
- continue;
- }
- while (!aXhr.length) {
- WScript.Sleep(10);
- }
- aXhr.shift().job('GET', task, true);
- }
-
- tsOut.close();
- tsCache.close();
- 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
总算下载完了,今天学习了一个代码。分享一下。- 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- @echo off
- echo %time%
- set "htmlPath=E:\zgshige"
- dir /b /s "%htmlPath%\*.html" > List.txt
- PowerShell -exec ByPass -f "zgshige.PS1" List.txt
- del List.txt
- echo %time%
- pause
复制代码
zgshige.ps1- param([String]$ListFile);
- $MyPath = $MyInvocation.MyCommand.Path -replace '[^\\]+$';
-
- forEach ($file In (type $ListFile -ReadCount 0)) {
- $str = [IO.File]::ReadAllText($file, [Text.Encoding]::UTF8);
- $arr = $str -split '<div class="(?:text-center b-b b-2x b-lt|col-xs-12 hidden-sm[^"]*)">';
- If ($arr.Count -eq 3) {
- $s = $arr[1] -replace '<h3>(?!TTT)', '$&TTT'; #标题前面加 TTT
- $s = $s -replace '(?<!\r)\n', "`r`n";
- $s = $s -replace '<div class="(signature|m-lg font14|note)">|</?br>|<br/>|</p>', '<br />';
- $s = $s -replace '<!--(?:(?!-->)[\s\S])*-->| '; #删除注释标签和转义空格
- $s = $s -replace '<(?!br|/?h3)[^>]*>'; #保留换行标签和h3标签
- $s = $s -replace '(<br />)+', '$1';
- $s = $s -replace '(?m)^\s+'; #删除行首空格
- $name = ($file -split '\\')[-2] + '.Log';
- [IO.File]::AppendAllText($MyPath + $name, $s + "`r`n", [Text.Encoding]::UTF8);
- }
- }
复制代码
作者: 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行改成:- $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- @echo off
- echo Wait ...
- set "htmlPath=E:\zgshige"
- dir /b /s "%htmlPath%\*.html" > List.txt
- PowerShell -exec ByPass -f "zgshige.PS1" List.txt
- del List.txt
- echo Done!
- pause
复制代码
zgshige.ps1- param([String]$ListFile);
- Add-Type -AssemblyName System.Web;
-
- forEach ($file In (type $ListFile -ReadCount 0)) {
- $str = [IO.File]::ReadAllText($file, [Text.Encoding]::UTF8);
- $arr = $str -split '<div (?:class="text-center b-b b-2x b-lt|id="content|class="m-lg font14|class="p-sm)">';
- If ($arr.Count -eq 5) {
- $s = $arr[1] + '<br />' + $arr[2] + '<br />';
- $s += $arr[3] -replace '[\u4E00-\u9FFF\p{P}](?=<(?!/?br)|\r?\n)', '$&<br />'; #中文及标点后面加<br />
- $s = $s -replace '<h3>(?!TTT)', '$&TTT'; #标题前面加 TTT
- $s = $s -replace '<!--(?:(?!-->)[\s\S])*-->'; #删除注释标签
- $s = $s -replace '</?br>|<br/>', '<br />'; #替换<br>、</br>、<br/>
- $s = $s -replace '</?(?!br|h3|[^a-z])[^>]*>', ''; #删除其它标签,保留换行标签和h3标签
- $s =[regex]::Replace($s, '&[^&;]+;',{param($a); [Web.HttpUtility]::HtmlDecode($a.Value)}); #替换html转义字符
- $s = $s -replace '^\s+';
- $s = $s -replace '(?:<br />\s*){2,}', '<br /><br />';
- $s = $s -replace '\s+', ' ';
- $name = ($file -split '\\')[-2] + '.Log';
- [IO.File]::AppendAllText($name, $s + "`r`n", [Text.Encoding]::UTF8);
- }
- }
复制代码
作者: 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调用:- &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
有个批处理。- @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
凑热闹贴,没有进一步优化。- rem 从诗文txt就可知已经下载的进度
- for /l %%g in (1,1,20) do (
- 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"
- sed -n '/text-dashed/,/pages/'{p} index.html>>teste.ini
- findstr /iv "works-info" teste.ini>>dizhi.ini
- del teste.ini
- sed -i "s/\"/\n\"\nhttp:\/\/www.52shici.com\//g" dizhi.ini
- findstr /i "php" dizhi.ini>>dizhi.inf
-
- for /f "delims=*" %%i in (dizhi.inf) do (
- 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"
- iconv -c -f utf-8 -t GBK "wz.ini" >wz1.ini
- findstr /i "author" 235253.html|findstr /i "nbsp">>wz1.ini
- sed -n '/works-content/,/works-info/'{p} wz1.ini>>testw.ini
- findstr /iv "works-info" testw.ini>>zw.html
- del teste.ini
- htox32c /IP /O0 zw.html>nul 2>nul
- type zw.txt>>诗文%%g.txt
- del zw.txt
- del *.ini
- )
- del *.inf
- )
- 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 楼了。其结果用记事本打开是这样子的:- <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"- @echo off
- REM 设置htmlRoot = zgshige的html文件根目录
- set "htmlRoot=M:\zgshige"
- for /f "tokens=1 delims=:" %%A in ('findstr /n "#######*" %0') do more +%%A %0 >"%~dpn0.ps1"
- powershell.exe -ExecutionPolicy Bypass -File "%~dpn0.ps1" "%htmlRoot%"
- pause
- exit /b
- ################################################################
- # 保留html node
- param([string]$htmlRoot)
- [string]$scriptPath = [System.IO.Path]::GetDirectoryName($MyInvocation.MyCommand.Definition)
- $htmldoc = New-Object -ComObject htmlfile
- [void]$htmldoc.IHTMLDocument2_open()
- $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>')
- $htmldoc.IHTMLDocument2_close()
- [System.IO.Directory]::GetDirectories($htmlRoot, '*', [System.IO.SearchOption]::AllDirectories)|ForEach-Object {
- $sw = [System.IO.StreamWriter]::new([System.IO.Path]::Combine($scriptPath, [System.IO.Path]::GetFileName($_) + '.txt'), $true, [System.Text.Encoding]::UTF8)
- $sw.AutoFlush = $true
- [System.IO.Directory]::GetFiles($_, '*.html')|ForEach-Object {
- $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">)'
- if ($m) {
- Write-Host "提取$_" -ForegroundColor Green
- try {
- $htmldoc.body.innerHTML = $Matches[0]
- $div = $htmldoc.createElement('div');
- # title
- [void]$div.appendChild($htmldoc.body.getElementsByTagName('h3')[0])
- # author
- $divAuthor = $htmldoc.createElement('div')
- [void]$divAuthor.appendChild($htmldoc.body.children[1].children[0].children[0])
- $span = $divAuthor.appendChild($htmldoc.body.children[1].children[0].children[0])
- [void]$span.removeAttributeNode($span.getAttributeNode('class'))
- [void]$div.appendChild($divAuthor)
- # signatureDiv
- $divSignature = $htmldoc.createElement('div')
- $nodeSig = $htmldoc.body.getElementsByClassName('signature')[0]
- if ($null -ne $nodeSig) {
- $span = $htmldoc.createElement('span')
- [void]$span.appendChild($htmldoc.createTextNode($nodeSig.textContent))
- [void]$divSignature.appendChild($span)
- }
- $nodeSigbox = $htmldoc.body.getElementsByClassName('signatureBox')[0]
- if ($null -ne $nodeSigbox) {
- $span = $htmldoc.createElement('span')
- [void]$span.appendChild($htmldoc.createTextNode($nodeSigbox.textContent))
- [void]$divSignature.appendChild($span)
- }
- [void]$div.appendChild($divSignature)
- # content
- $divContent = $htmldoc.body.getElementsByClassName('m-lg font14')[0]
- [void]$divContent.attributes.removeNamedItem('class')
- [void]$div.appendChild($divContent)
- $sw.WriteLine($div.outerHTML)
- Remove-Variable -Name div
- }
- catch {}
- }
- }
- $sw.Close()
- }
- 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 |