如何自动从站点下载文件?

blo*_*004 4 javascript automation download

我想从此URL下载几个数据文件:https : //pselookup.vrymel.com/

该站点包含一个日期字段和一个下载按钮。我想下载数据多年(这将意味着很多请求),并且我想自动进行下载。

我创建了一个Javascript代码段,但是它会不断下载相同的文件。

$dateField = document.getElementsByClassName('csv_download_input__Input-encwx-1 dDiqPH')[2]

$dlButton = document.getElementsByClassName('csv_download_input__Button-encwx-0 KLfyv')[2]

var now = new Date();
var daysOfYear = [];
for (var d = new Date(2016, 0, 1); d <= now; d.setDate(d.getDate() + 1)) {
    daysOfYear.push(new Date(d).toISOString().substring(0,10));
}

(function theLoop (i) {
  setTimeout(function () {
    $dlButton.click()
    $dateField.value = daysOfYear[i]
    if (--i) {          // If i > 0, keep going
      theLoop(i);       // Call the loop again, and pass it the current value of i
    }
  }, 3000);
})(daysOfYear.length-1);
Run Code Online (Sandbox Code Playgroud)

如何自动下载所有文件?

Ale*_*les 6

首先,客户端中的javascript可能不是执行此操作的最佳语言,也不是实现此目标的最佳方法。它可能会起作用,但是最好选择哪种方法来解决问题最好。同样,它将避免您在接受下载的弹出窗口中单击〜800次。

您可以通过编程的方式来获取文件,只需学习浏览器为获取文件所做的工作并尝试将其批量复制即可。

检查完呼叫后,您可以看到它正在呼叫一个端点,并且该端点正在返回一个包含可下载文件的链接。

好了,这很容易,所以现在您只需要用任何语言制作脚本就可以检索它们。

我选择的javascript不是客户端,但这nodejs意味着它必须在您的计算机上运行。

你就可以用相同的bashpython或任何其他语言。

要运行此操作,请执行以下操作:

  • 转到新的空目录
  • npm install axios
  • 用我粘贴的代码创建一个文件,我们称之为 crawler.js
  • node crawler.js

这已经通过测试 node v8.15.0

// NOTE: Require this to make a request and save the link as file 20190813:Alevale
const axios = require('axios');
const fs = require('fs');

let now = new Date();
let daysOfYear = [];
const baseUrl = 'https://a4dzytphl9.execute-api.ap-southeast-1.amazonaws.com/prod/eod/'

for (var d = new Date(2016, 0, 1); d <= now; d.setDate(d.getDate() + 1)) {
    daysOfYear.push(new Date(d).toISOString().substring(0,10));
}

const waitFor = (time) => {
    return new Promise((resolve => setTimeout(resolve, time)))
}

const getUrls = async () =>{
    let day
    for (day of daysOfYear) {
        console.log('getting day', baseUrl + day)
        // NOTE: Throttle the calls to not overload the server 20190813:Alevale
        await waitFor(4000)

        await axios.get(baseUrl + day)
            .then(response => {
                console.log(response.data);
                console.log(response);
                if (response.data && response.data.download_url) {
                    return response.data.download_url
                }
                return Promise.reject('Could not retrieve response.data.download_url')
            })
            .then((url) =>{
                axios({
                    method: 'get',
                    url,
                    responseType: 'stream'
                })
                    .then(function (response) {
                        // NOTE: Save the file as 2019-08-13 20190813:Alevale
                        response.data.pipe(fs.createWriteStream(`${day}.csv`))
                    })
                    .catch(console.error)

            })
            .catch(error => {
                console.log(error);
            });
    }
}

getUrls()
Run Code Online (Sandbox Code Playgroud)