Чтение только заголовка и/или META-тега HTML-файла без загрузки всего HTML-файла.

Сценарий:

Мне нужно разобрать миллионы HTML-файлов/страниц (насколько я могу), а затем прочитать только заголовок или мета-часть и сбросить его в базу данных.

Что я делаю, так это использую System.Net.WebClient Class DownloadString(url_path) для загрузки, а затем сохраняю его в базе данных с помощью LINQ To SQL.

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

Любые идеи, чтобы загрузить только столько контента?


person Pratik    schedule 03.08.2011    source источник


Ответы (3)


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

HttpWebRequest fileToDownload = (HttpWebRequest)HttpWebRequest.Create("YourURL");
            using (WebResponse fileDownloadResponse = fileToDownload.GetResponse())
            {
                using (Stream fileStream = fileDownloadResponse.GetResponseStream())
                {
                    using (StreamReader fileStreamReader = new StreamReader(fileStream))
                    {
                        char[] x = new char[Number];
                        fileStreamReader.Read(x, 0, Number);
                        string data = "";
                        foreach (char item in x)
                        {
                            data += item.ToString();
                        }
                    }
                }
            }
person Samir Adel    schedule 03.08.2011
comment
Можете ли вы предложить мне пример того, как получить Stream и поможет ли он производительности? - person Pratik; 03.08.2011
comment
Я обновил код идеей, о которой пытаюсь вам рассказать. - person Samir Adel; 03.08.2011

Я подозреваю, что WebClient сначала попытается загрузить всю страницу, и в этом случае вам, вероятно, понадобится необработанный клиентский сокет. Отправьте соответствующий HTTP-запрос (вручную, поскольку вы используете необработанные сокеты), начните читать ответ (который не будет сразу) и завершите соединение, когда вы достаточно прочитали. Тем не менее, остальная часть, вероятно, уже будет отправлена ​​​​с сервера и доберется до вашего ПК, хотите вы этого или нет, поэтому вы можете не сэкономить большую часть полосы пропускания.

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

person GeoffM    schedule 03.08.2011

Вы можете использовать глагол «HEAD» в HttpWebRequest, чтобы вернуть заголовки ответа (не элемент). Чтобы получить полный элемент с метаданными, вам нужно загрузить страницу и проанализировать нужные метаданные.

System.Net.WebRequest.Create(uri) { Method = "HEAD" };
person Zachary    schedule 03.08.2011
comment
Поможет ли это в производительности, или в фоновом режиме он может загрузить всю страницу? - person Pratik; 03.08.2011
comment
HEAD возвращает только заголовки ответа; это означает, что метатеги HTML не будут покрыты, если они не являются частью заголовка ответа, поскольку HTML находится в теле ответа. - person BoltClock; 03.08.2011
comment
Это не сработает, поскольку возвращает только заголовки http. Не является головной частью html: w3.org/Protocols /rfc2616/rfc2616-sec9.html#sec9.4 - person Peter; 03.08.2011
comment
BoltClock прав, скорее всего, метатегов там не будет... Просто сделайте быстрый макет, чтобы увидеть, возвращаются ли они для ваших страниц, если нет, то вам нужно загрузить страницу. Скорее всего, вам придется загружать страницу и/или анализировать поток ответов, пока вы не получите элементы ‹head›, содержащие необходимые данные. - person Zachary; 03.08.2011