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

分别合成一个文本。谢谢!
还没有下载完。

TOP

本帖最后由 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 。谢谢!

TOP

文本提取还有几天,之后,再来了结。谢谢!

TOP

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


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

TOP

回复 19# lxh623


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

TOP

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

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

TOP

回复 21# lxh623


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

TOP

回复 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;
    }
}COPY
1

评分人数

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

TOP

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


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

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

TOP

回复 24# lxh623

已修改了

TOP

回复  lxh623

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

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

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

TOP

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

好像没有作者。谢谢!

TOP

本帖最后由 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);COPY
1

评分人数

TOP

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

TOP

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

回复 29# lxh623


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

TOP

返回列表