HtmlAgilityPack。错误远程服务器返回错误:(403)禁止

时间:2018-09-29 19:31:47

标签: c# html-agility-pack

我正在根据示例尝试实现Google Translator和C#。
我收到错误消息:“远程服务器返回错误消息:(403)禁止。”
错误出现在行中:

using (var responseStream = request.GetResponse().GetResponseStream())

问题 如何解决错误?

本文介绍了在线服务“ Google Translate(https://translate.google.com/)的用法,该查询形成了带有翻译所需文本的查询,并对使用“ HtmlAgilityPack”库获得的结果进行语法分析。

enter image description here

// 
// using HtmlAgilityPack;

namespace _359._01._01
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            button1.PerformClick();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            //Вызываем метод отправки текста для перевода с указанием 
            //исходного языка и языка перевода.
            //И получаем в ответ HTML код страницы ответа.
            string result = translate(richTextBox1.Text, "en", "ru");

            //Создаем объект класса HtmlDocument.
            HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
            //Загружаем в doc полученный HTML.
            doc.LoadHtml(result);

            //У созданного объекта doc есть свойство DocumentNode (указывает на верхний узел документа). 
            //У него же в свою очередь есть методы SelectNodes и SelectSingleNode. 
            //Первый выбирает коллекцию элементов, а второй — только один. Нам нужен первый метод.
            HtmlAgilityPack.HtmlNodeCollection translateNode = doc.DocumentNode.SelectNodes("//span[@id='result_box']");
            //Проверяем количество найденных элементов.
            if (translateNode.Count != 0)
            {
                //Элементы найдены, получаем текст между начальным и конечным тегами объекта.
                richTextBox2.Text = translateNode[0].InnerText;
            }
            else
            {
                //Необходимые нам элементы, отсутствуют на странице.
                richTextBox2.Text = "Проблема с переводом";
            }


        }

        //word - фраза для перевода, SL -исходный язык, DL - язык перевода.
        public string translate(string word, string SL, string DL)
        {
            //Инициализируем новый экземпляр класса System.Net.CookieContainer.
            var cookies = new System.Net.CookieContainer();
            string result;

            //Задаем значение System.Boolean, которое определяет, используется
            //ли поведение 100-Continue.
            System.Net.ServicePointManager.Expect100Continue = false;
            //Формируем строку запроса на перевод.
            string zapros = "http://translate.google.ru/?sl=" + SL + "&tl=" + DL + "&q=" + word;


            //Инициализируем новый экземпляр System.Net.WebRequest для заданной схемы URI.
            var request = (System.Net.HttpWebRequest)System.Net.WebRequest.Create(zapros);

            request.CookieContainer = cookies;
            //Указываем системные учетные данные приложения.
            request.Credentials = System.Net.CredentialCache.DefaultCredentials;
            //Указываем сетевые учетные данные текущего контекста безопасности. 
            request.Proxy.Credentials = System.Net.CredentialCache.DefaultCredentials;

            //Задаем метод для запроса.
            request.Method = "POST";
            //Задаем значение HTTP-заголовка Content-type.
            request.ContentType = "application/x-www-form-urlencoded"; // Исх
            // request.ContentType = "application/json; charset=UTF-8"; // НР
            // request.ContentType = "application/json;"; // НР

            //Задаем значение HTTP-заголовка User-agent.
            request.UserAgent = @"Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.0.4) Gecko/20060508 Firefox/1.5.0.4"; // Исходный


            request.UseDefaultCredentials = true;

            //Получаем объект System.IO.Stream, используемый для записи данных запроса.
            using (var requestStream = request.GetRequestStream())

            //При переопределении во вложенном классе получаем поток данных из
            //интернет-ресурса.
            using (var responseStream = request.GetResponse().GetResponseStream()) // ОШИБКА

            //Инициализируем новый экземпляр класса System.IO.StreamReader для указанного
            //потока с заданной кодировкой символов.
            using (var reader = new System.IO.StreamReader(responseStream, Encoding.GetEncoding("UTF-8")))
            {
                //Считываем поток от текущего положения до конца.
                result = reader.ReadToEnd();
            }
            //Возвращаем полученную строку с HTML кодом страницы.
            return result;
        }


    }
}

0 个答案:

没有答案