yarkov
@yarkov
Помог ответ? Отметь решением.

Где я ошибся при написании кода?

В общем пишу прогу, которая будет сохранять страницу по ссылке со всеми файлами: css, js, img и т.п. Встал на этапе загрузки файлов. Во-первых скачивает не все которые нашел, во-вторых в текстовое поле не пишутся заголовки ответа сервера. Выстреливает ошибку "Ссылка не указывает на экземпляр объекта". Ошибка в блоке catch в методе Save_File.
Код класса парсера ниже.
/*
 * Сделано в SharpDevelop.
 * Пользователь: Admin
 * Дата: 22.09.2014
 * Время: 20:42
 * 
 * Для изменения этого шаблона используйте Сервис | Настройка | Кодирование | Правка стандартных заголовков.
 */
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using HtmlAgilityPack;
using System.Web;
using System.IO;
using System.Net;
 
namespace ParserPlus
{
    /// <summary>
    /// Description of Parser.
    /// </summary>
    public class Parser
    {   
        
        
 
        public Parser()
        {
            
        }
 
        
        public string getRequest(string url)
        {
            try
            {
                var httpWebRequest = (HttpWebRequest) WebRequest.Create(url);
                HttpWebResponse myHttpWebResponse = (HttpWebResponse)httpWebRequest.GetResponse();
                httpWebRequest.AllowAutoRedirect = false;       //Запрещаем автоматический редирект
                httpWebRequest.Method = "GET";              //Можно не указывать, по умолчанию используется GET.
                httpWebRequest.Referer = url; // Реферер. Тут можно указать любой URL
                httpWebRequest.UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.124 Safari/537.36";
                httpWebRequest.Accept = "*/*";
                using (var httpWebResponse = (HttpWebResponse) httpWebRequest.GetResponse())
                {
                    using (var stream = httpWebResponse.GetResponseStream())
                    {
                        using (var reader = new StreamReader(stream, Encoding.GetEncoding(httpWebResponse.CharacterSet)))
                        {
                            return reader.ReadToEnd();
                        }
                    }
                }
            }
            catch
            {
                return String.Empty;
            }
        }
        
        
        public void Save_File(string url, string folderName, string rootfolder, TextBox box)
        {
            string sf = Path.Combine(rootfolder, folderName);
            WebClient webClient = new WebClient();
            webClient.Headers.Add("AllowAutoRedirect", "false");
            webClient.Headers.Add("Referer", url);
            webClient.Headers.Add("UserAgent","Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.124 Safari/537.36");
            webClient.Headers.Add("Accept", "*/*");
            webClient.Headers.Add("Method", "GET");
            //webClient.Headers.Add();
            try
            {
                webClient.DownloadFile(new Uri(url), sf+"\\"+Path.GetFileName(url));
 
                string[] keys = webClient.ResponseHeaders.AllKeys;
                foreach(var key in keys)
                {
                    box.Text += webClient.ResponseHeaders.GetValues(key).ToString() + "\r\n";
                }
            }
            catch
            {
                box.Text += "Ошибка загрузки " + url + "\r\n";
                box.Text +=  webClient.ResponseHeaders.ToString()+ "\r\n";
            }
        }
 
 
        public void Get_Elements(string Host, HtmlNodeCollection type, string attr, string name, string folder, TextBox box)
        {
            string u;
            foreach (HtmlNode lnk in type) {
                
                if (lnk.Attributes[attr] != null){
                    string href = lnk.GetAttributeValue(attr, "");
                    
                    if (href.IndexOf("http", 0) == -1) {
                        u = "http://"+Host+href;
                    }else{
                        u = href;
                    }
 
                    string n = u.Split("?".ToCharArray())[0];
                    box.Text += n + "\r\n";
                    MainForm f = new MainForm();
                    Save_File(n, name, folder, f.textBoxDebug);
                }
            }
            
        }
        
        public void Get_Page(string PageUrl, TextBox box, string RootFolder)
        {
            Uri uri = new Uri(PageUrl);
            string siteFolder = Path.Combine(RootFolder, uri.Host);
            string u;
 
            // создаем необходимые папки для работы
            if (!File.Exists(RootFolder)){
                Directory.CreateDirectory(RootFolder);
            }
            if (!File.Exists(siteFolder)){
                Directory.CreateDirectory(siteFolder);
            }
            Directory.CreateDirectory(Path.Combine(siteFolder, "images"));
            Directory.CreateDirectory(Path.Combine(siteFolder, "js"));
            Directory.CreateDirectory(Path.Combine(siteFolder, "css"));
            /**************************************/
                        
            var content = getRequest(PageUrl);
            HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
            doc.LoadHtml(content);
            HtmlNodeCollection css = doc.DocumentNode.SelectNodes("//link");
            HtmlNodeCollection script = doc.DocumentNode.SelectNodes("//script");
            HtmlNodeCollection img = doc.DocumentNode.SelectNodes("//img");
 
            if (css != null) {
                box.Text += "Загружаем список стилей ("+css.Count+"):\r\n";
                Get_Elements(uri.Host, css, "href", "css", siteFolder, box);
            }else{
                 box.Text += "Не найдено таблиц CSS (((\r\n"+content+"";
            }
            
            if (script != null) {
                box.Text += "Загружаем список подключенных JavaScript ("+script.Count+"):\r\n";
                Get_Elements(uri.Host, script, "src", "js", siteFolder, box);
            }else{
                 box.Text += "Не найдено подключенных JavaScript (((\r\n"+content+"";
            }
            
            
            if (img != null) {
                box.Text += "Загружаем список изображений ("+img.Count+"):\r\n";
                Get_Elements(uri.Host, img, "src", "images", siteFolder, box);
            }else{
                 box.Text += "Не найдено изображений (((\r\n"+content+"";
            }
 
        }
        
 
        public void Replace_Links(string htmlContent)
        {
            
        }
 
    }
}
  • Вопрос задан
  • 2549 просмотров
Пригласить эксперта
Ответы на вопрос 2
vipuhoff
@vipuhoff
Стоит посмотреть в сторону textBoxDebug, возможно эта переменная не заполнена корректно на момент выполнения программы
Ответ написан
Комментировать
enkryptor
@enkryptor
software developer (TS/JS, C#), Agile enthusiast
Есть версия, что падает в box.Text += webClient.ResponseHeaders.ToString()+ "\r\n";

Если ответа не было получено, то ResponseHeaders будет null.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы