Перейдите к каждой ссылке, найдите тип файла и загрузите - PullRequest
2 голосов
/ 09 ноября 2019

Мне интересно, есть ли какое-либо решение для загрузки файлов с веб-сайта с помощью VBscript?

Я знаю, как загрузить один файл с веб-сайта, но как я могу превратить его в цикл? Кроме того, как я могу выполнить поиск на определенной странице с определенным расширением файла и загрузить файлы, если они есть?

For each pdf in website
  xhr.open "GET", pdf.src, False
  xhr.send
  set stream = CreateObject("Adodb.Stream")
  with stream
    .type = 1
    .Open
    .Write xhr.responsebody
    .SaveToFile "C:\temp\" + CStr(index) + ".pdf", 2
  end with 
  stream.Close
  set stream = nothing
  index = index + 1 
Next

Допустим, у нас есть веб-сайт https://website.com/productpage/, тогда есть ссылки, которые имеют одинаковыеструктура https://website.com/products/xx-x-xx-x/, поэтому все необходимые ссылки начинаются с https://website.com/products/. Похоже, 33 ссылки такого рода в соответствии с исходным кодом.

Затем после перехода на какую-то страницу появляются PDF-файлы. Иногда один, иногда 3 или 4. Однако ссылка на файл PDF выглядит примерно так: https://website.com/wp-content/uploads/2016/12/xxxx.pdf, где xxxx.pdf на самом деле может быть именем файла.

Вот что мне удалось получить для одного файла:

dim xHttp: Set xHttp = createobject("Microsoft.XMLHTTP")
dim bStrm: Set bStrm = createobject("Adodb.Stream")
xHttp.Open "GET", "https://website.com/wp-content/uploads/2016/12/xxxx.pdf", False
xHttp.Send

with bStrm
    .type = 1 '//binary
    .open
    .write xHttp.responseBody
    .savetofile "c:\temp\xxxx.pdf", 2 '//overwrite
end with

РЕДАКТИРОВАТЬ:

Если это будет выглядеть так:

  1. Получить все необходимые ссылки
  2. Перейти к каждой ссылке
  3. Искать ссылки, заканчивающиеся на ".pdf"
  4. Загрузить файлы на C: \ temp \

Структура сайта:

https://website.com/productpage/
        https://website.com/products/xx-x/
              https://website.com/wp-content/uploads/2016/12/xx-xx.pdf
        https://website.com/products/xxxxx-xsx/
              https://website.com/wp-content/uploads/2018/12/x-xx-x.pdf
              https://website.com/wp-content/uploads/2015/12/x-x-xx.pdf
              https://website.com/wp-content/uploads/2019/12/xxx-x.pdf
        https://website.com/products/x-xx-xsx/
              https://website.com/wp-content/uploads/2014/12/x-xxx.pdf
              https://website.com/wp-content/uploads/2013/12/x-x-x-x.pdf
        https://website.com/products/xx-x-xsx/
              https://website.com/wp-content/uploads/2012/12/x-xxxx.pdf

1 Ответ

2 голосов
/ 09 ноября 2019

Поскольку у вас есть код для сохранения ссылки, вы можете заключить его в подпрограмму для повторного использования:

Sub GetFile(p_sRemoteFile, p_sLocalFile)

    Dim xHttp: Set xHttp = CreateObject("Microsoft.XMLHTTP")
    Dim bStrm: Set bStrm = CreateObject("Adodb.Stream")
    xHttp.open "GET", p_sRemoteFile, False
    xHttp.Send

    With bStrm
        .Type = 1 '//binary
        .open
        .write xHttp.responseBody
        .SaveToFile p_sLocalFile, 2 '//overwrite
    End With

End Sub

Затем вы можете использовать объект InternetExplorer, чтобы получить коллекцию ссылок встраница:

Sub GetPageLinks(p_sURL)
    Dim objIE
    Dim objLinks
    Dim objLink
    Dim iCounter

    Set objIE = CreateObject("InternetExplorer.Application")
    objIE.Visible = True
    objIE.Navigate p_sURL

    Do Until objIE.ReadyState = 4
        Wscript.Sleep 100
    Loop

    Set objLinks = objIE.Document.All.Tags("a")
    For iCounter = 1 To objLinks.Length
        Set objLink = objLinks(iCounter - 1)
        With objLink
            If StrComp(Right(.href, 3), "pdf", 1) = 0 Then
                ' Get file
                GetFile .href, "C:\temp\downloads\" & GetFileNameFromURL(.href)
            Else
                ' Process page
                GetPageLinks .href
            End If
        End With
    Next

End Sub

Вот функция, которая извлекает имя файла из URL:

Function GetFileNameFromURL(p_sURL)
    Dim arrFields

    arrFields = Split(p_sURL, "/")

    GetFileNameFromURL = arrFields(UBound(arrFields))

End Function

Эта функция вернет xxxx.pdf с учетом https://website.com/wp-content/uploads/2016/12/xxxx.pdf.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...