有没有办法从不仅仅是HTML链接的网站上抓取下载文件?

时间:2019-05-30 03:10:01

标签: file screen-scraping downloading

因此,我要逐个浏览每个链接,以下载用于Photoshop预设的文件,至少可以说有点累。我一直在研究实际抓取文件的方法,而不仅是HTML链接,还是某种从页面一次获取所有文件的方法,但是我没有运气。我并不精通python,因此对我来说没有任何意义,并且为我安装的为此安装的程序没有下载我想要的内容。

我已经尝试了chrome扩展程序,网络抓取软件,但是它并没有按照我想要的方式工作。

https://www.brusheezy.com/brushes/22482-star-glow-brushes

这只是一页上的链接之一

我希望找到一些可以从页面链接上实际下载zip文件的东西。

1 个答案:

答案 0 :(得分:0)

注意:我尚未使此方法起作用,但认为该方法可能值得考虑。我将尝试返回并对其进行改进或删除。

您也许可以在浏览器的开发工具中按照以下方式进行操作。您必须为此禁用弹出窗口阻止程序。这对我来说不太有效,因为下载按钮开始引发帐户注册对话框。我怀疑他们可能会在下载一定次数后执行此操作,但是如果您有帐户并登录,那么可能会更好。

导航到上传者页面,打开浏览器的开发人员工具,粘贴以下代码,然后按Enter。

function go () {
    // get all the links from the grid on the current page
    const hrefs = Array.from(document.querySelectorAll('.ez-resource-grid a[href]')).map(a => a.href);

    // start the loading
    next(hrefs);
}

function next ([current, ...remaining]) {
    // open a new tab/window with the current href;
    const w = window.open(current, '_blank');

    // function to find the download button and "click" it.
    function triggerDownload () {
        try {
            w.querySelector('#download-button').click();
        }
        catch (e) {
            // something went wrong.
        }

        // if we haven't consumed all the links yet, start the next one.
        if (remaining.length) {
            next(remaining);

            // I tried adding a delay here thinking the account signup dialog
            // might be triggered by too many rapid requests, but it didn't
            // seem to matter.
            // setTimeout(() => next(remaining), 6000);
        }
    }

    // give the page a few seconds to load before attempting
    // to trigger the download. This should be replaced with
    // a ready event listener instead of a fixed delay, something
    // like:
    // w.document.addEventListener('readystatechange', triggerDownload)
    // but i'm tired and my first attempt didn't appear to work so i'm
    // throwing in this static delay hack instead.
    setTimeout(triggerDownload, 5000);
}

// kick it off
go();