Как я могу загрузить изображения с сайта на свой жесткий диск?

#c# #html-agility-pack

#c# #html-agility-pack

Вопрос:

Вместо этого я пытаюсь загрузить изображения, извлекая только время и даты каждого изображения. Код работает, но только для времени и дат.

 using System;
using System.Linq;
using System.IO;
using System.Xml;
using System.Net;
using HtmlAgilityPack;
                    
public class Program
{
    public static void Main()
    {
        var wc = new WebClient();
        wc.BaseAddress = "https://something.com";
        HtmlDocument doc = new HtmlDocument();
        
        var temp = wc.DownloadData("/en");
        doc.Load(new MemoryStream(temp));       
        
        var secTokenScript = doc.DocumentNode.Descendants()
            .Where(e =>
                   String.Compare(e.Name, "script", true) == 0 amp;amp;
                   String.Compare(e.ParentNode.Name, "div", true) == 0 amp;amp;
                   e.InnerText.Length > 0 amp;amp;
                   e.InnerText.Trim().StartsWith("var region")
                  ).FirstOrDefault().InnerText;
        var securityToken = secTokenScript;
        securityToken = securityToken.Substring(0, securityToken.IndexOf("arrayImageTimes.push"));  
        securityToken = secTokenScript.Substring(securityToken.Length).Replace("arrayImageTimes.push('", "").Replace("')", "");
        var dates = securityToken.Trim().Split(new string[] { ";"}, StringSplitOptions.RemoveEmptyEntries);
        var scriptDates = dates.Select(x => new ScriptDate { DateString = x });
        foreach(var date in scriptDates) 
        {
            Console.WriteLine("Date String: '"   date.DateString   "'tYear: '"   date.Year   "'t Month: '"   date.Month   "'t Day: '"   date.Day   "'t Hours: '"   date.Hours   "'t Minutes: '"   date.Minutes   "'");
        }
        
    }
    
    
    public class ScriptDate
    {
        public string DateString {get;set;}
        public int Year 
        {
            get
            {
                return Convert.ToInt32(this.DateString.Substring(0, 4));
            }
        }
        public int Month
        {
            get
            {
                return Convert.ToInt32(this.DateString.Substring(4, 2));
            }
        }
        public int Day
        {
            get
            {
                return Convert.ToInt32(this.DateString.Substring(6, 2));
            }
        }
        public int Hours
        {
            get
            {
                return Convert.ToInt32(this.DateString.Substring(8, 2));
            }
        }
        public int Minutes
        {
            get
            {
                return Convert.ToInt32(this.DateString.Substring(10, 2));
            }
        }                       
    }
}
 

но как я могу использовать тот же код для загрузки и сохранения изображений?

Пробовал это, но получаю исключение :

 private void Download()
        {
            using (WebClient client = new WebClient()) // WebClient class inherits IDisposable
            {
                client.DownloadFile("https://something.com", @"C:templocalfile.html");
            }
        }
 

System.Net.WebException: «Удаленный сервер вернул ошибку: (500) Внутренняя ошибка сервера».

Я могу получить даты и часы, но я не могу получить источник для извлечения ссылок на изображения.

Пример ссылки на одно из изображений, как оно должно быть построено, например :

https://something.com/image?type=infraPolairamp;region=tuamp;timestamp=202012150230

но я хочу автоматически извлекать даты и часы со страницы для всех изображений, а затем автоматически создавать ссылки, а затем загружать изображения.

В первом коде я могу получить даты и часы каждого изображения, но я не могу загрузить исходный код страницы, поэтому я не могу извлекать и создавать ссылки для изображений.

Вот почему я подумал как-то использовать первый код также для создания ссылок на изображения, а затем загрузки изображений.

Комментарии:

1. вы должны попробовать загрузить в цикле foreach. у вас уже есть все необходимые данные. попробуйте изменить тип загружаемого файла на jpeg вместо html

Ответ №1:

Не совсем уверен, чего вы пытаетесь достичь с помощью datetimes, но с помощью HAP вы можете сделать что-то вроде этого:

 
HtmlElementCollection elements = doc.DocumentNode.SelectNodes("//img");
foreach (HtmlElement imageElement in elements)
{
   var imageSrc = imageElement.Attributes["src"].Value
   Download(imageSrc);
}
 


 
private void Download(src)
        {
            using (WebClient client = new WebClient()) // WebClient class inherits IDisposable
            {
                client.DownloadFile(src, @"C:temp"   uniqueNameForFile   ".jpg");
            }
        }
 

Это не идеальный ответ, но он должен помочь вам. Src может быть относительным, поэтому вам, возможно, придется добавить базовый адрес.