сохранение html целиком (с картинками)

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
moshkin
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 108
Зарегистрирован: 03.12.2002 (Вт) 15:01
Откуда: Russia

сохранение html целиком (с картинками)

Сообщение moshkin » 19.05.2004 (Ср) 13:19

Надо средствами VB сохранить на диск html с картинками. Так же как браузер это делает (похоже хотя бы). Пробовал так: стягиваю сам html и потом ищу теги "img scr" и стягиваю картинки которые указаны, а html переписываю чтоб ссылки были на локальный путь. Но!: Все это открывается браузером очень долго - как я понимаю там еще куча ссылок на *.css, *.htm и он пытается достучаться до сайта, это плохо; а еще там баннеры содеражат сслыки на картинки в скриптах. Короче - запутался. Ни кто не подскажет что делать или может где есть готовый пример?
Спасибо.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 19.05.2004 (Ср) 15:01

Готовое есть навряд-ли.
Когда страница оформлена по уму (т.е. все линки относительные, а не абсолютные), то исправлять их не надо, достаточно стянуть все картинки и разместить из в тех же подкаталогах, как и в оригинале (на сайте). А если все-же ссылка задана абсолютной, то преобразовать ее.
Что касается банеров - резать. Не нужны они совершенно.
А с CSS поступать также, как и с картинками.

Ну а то, на какие тэги обращать внимание (<A HREF>, <IMG> и т.п.) можно указать в INI-файле и загружать этот список при запуске.
Lasciate ogni speranza, voi ch'entrate.

moshkin
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 108
Зарегистрирован: 03.12.2002 (Вт) 15:01
Откуда: Russia

Сообщение moshkin » 19.05.2004 (Ср) 15:11

А на какие тэги надо обращать внимание:
тот же "<a href" нужно ли обрабатывать? он же ведь срабатывает только при нажатии и значит не может тормозить загрузку страницы. Я прав?
И еще: баннеры прописаны в скриптах - можно ли вообще удалять скрипты нафиг? (я понимаю, что могу и сам разобраться - проковырявшись с денек, но, если не трудно, ответьте)
Пока знаю только тег "img src" Как выглядит ссылка на css еще не понял, но этот файл найду и стяну потому что понял что он нужен.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 19.05.2004 (Ср) 15:27

Да, но если ты хочешь сгрузить не одну страницу, а какую-то часть сайта, то надо бы обрабатывать и ссылки.
Вот пример подключения стиля:
<link rel="stylesheet" href="/style1.css" type="text/css">

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

Скрипты конечно можно удалять совсем, но возможно они участвуют в формировании страницы, лучше стараться их перенести.

Как еще один способ, можешь смотреть все строки, которые находятся внутри угловых скобок <> и начинаются с http://, это скорее всего будут абсолютные ссылки, которые надо будет преобразовать.
Lasciate ogni speranza, voi ch'entrate.

moshkin
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 108
Зарегистрирован: 03.12.2002 (Вт) 15:01
Откуда: Russia

Сообщение moshkin » 19.05.2004 (Ср) 15:39

- сайт грузить не собираюсь, мне бы хоть страницу загрузить :)
- со стилем понял, спасибо.
- "В принципе, можно проверять даже не тэги, а их параметры (с именами src, href), только проверяй, чтобы эти параметры были внутри тэгов. " - не понял - что за параметры? Пока знаю что <img src - это начало тэга указывающего на картинку. А где у него параметры?
- что значит перенести скрипты? Куда перенести? То что их удалять не совсем правильно я понял, может просто забить в них все ссылки пустыми?

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 19.05.2004 (Ср) 15:53

Я имею ввиду, не отслеживать теги <IMG SRC...>, <LINK HREF...>, а искать строки SRC, HREF (независимо от того, находятся они в теге IMG или каком другом) и подменять адрес уже в них.
А со скриптами я имел ввиду примерно следующее.
Самим скриптам по барабану, где они выполняются. Но часто скрипты используются для формирования самой страницы. Вот пример из стартовой страницы mail.ru:
Код: Выделить всё
<SCRIPT LANGUAGE=JavaScript>
<!--
//----------------------------------
// Во флэше использовать переменную "rb_link" (без кавычек) !!!
//----------------------------------
var rb_counter = "34386";
var rb_href = "www.photocenter.ru/myphoto/?mr";
var banner_width = "600";
var banner_height = "90";
var banner_src = "http://r.mail.ru/b417316.swf";
var gif_src = "http://r.mail.ru/b417317.gif";
//----------------------------------
// Дальше не трогать.....
//----------------------------------
var rb_random = Math.round(Math.random() * 1000);
var rb_link = "http://r.mail.ru/clb"+rb_counter+"/"+rb_href;
var UseFlash = 0;
if (navigator.mimeTypes && navigator.mimeTypes["application/x-shockwave-flash"] ) {
var plugin = navigator.mimeTypes["application/x-shockwave-flash"].enabledPlugin;
if (plugin && parseInt(plugin.description.substring(plugin.description.indexOf(".")-1))>=4)
UseFlash = 1;
} else if (navigator.appName && navigator.appName.indexOf("Microsoft") != -1 &&
navigator.userAgent.indexOf("Windows") != -1 && navigator.userAgent.indexOf("Windows 3.1")

== -1) {
UseFlash = 1;
}
if ( UseFlash ) {
document.write('<OBJECT classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"');
document.write('codebase="http://active.macromedia.com/flash2/cabs/swflash.cab#version=4,0,0,0"');
document.write(' ID=getmov'+rb_random+' WIDTH='+banner_width+' HEIGHT='+banner_height+'>');
document.write('<PARAM NAME=movie VALUE="'+banner_src+'"><PARAM NAME=quality VALUE=high>');
document.write('<EMBED name=getmov'+rb_random+' src="'+banner_src+'" quality=high ');
document.write(' swLiveConnect=FALSE WIDTH='+banner_width+' HEIGHT='+banner_height);
document.write(' TYPE="application/x-shockwave-flash" PLUGINSPAGE="http://www.macromedia.com/shockwave/download/index.cgiP1_Prod_Version=ShockwaveFlash">');
document.write('</EMBED>');
document.write('</OBJECT>');
eval("document.getmov"+rb_random+".SetVariable(\"rb_link\",\""+rb_link+"\");");
} else if (!(navigator.appName && navigator.appName.indexOf("Netscape")>=0 &&

navigator.appVersion.indexOf("2.")>=0)) {
document.write('<a href='+rb_link+' target=_blank><IMG SRC="'+gif_src+'" WIDTH='+banner_width+' HEIGHT='+banner_height+' BORDER=0></a>');
}

document.write('<NOEMBED><IMG SRC=http://img.mail.ru/r/dumb.gif WIDTH=0 HEIGHT=0 BORDER=0></NOEMBED>');
//-->
</SCRIPT>


Здесь в переменной rb_link указывается база для дальнейшего создания банера. Если ты хочешь обрабатывать такие скрипты, тебе надо будет парсить код (хотя бы JavaScript и VBScript), искать строки, которые учавствуют в формировании ссылок (можно упростить задачу и искать только те строки, которые начинаются с "http://") и подменять адреса в них.
Lasciate ogni speranza, voi ch'entrate.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 19.05.2004 (Ср) 15:57

Если рассматривать в качестве примера
<link rel="stylesheet" href="/style1.css" type="text/css">

то здесь будет следующее:
LINK - тэг
REL, HREF, TYPE - параметры тэга
"stylesheet", "/style1.css", "text/css" - значения параметров
Lasciate ogni speranza, voi ch'entrate.

moshkin
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 108
Зарегистрирован: 03.12.2002 (Вт) 15:01
Откуда: Russia

Сообщение moshkin » 20.05.2004 (Чт) 10:30

Пока вырисовывается такой алгоритм:
cсылку на css обрабатываю отдельно- ищу в тексте ссылку на него и стягиваю, а потом переправляю на локальную ссылку
Ищу "http" в тексте, потом выясняю, если слева тег img src то это явно картинка и ее тяну и исправляю ссылку.
А вот в скриптах надо будет тоже искать img src и эту ссылку забивать на пустую. Вроде пока так понимаю.
Легче всего с явными сслыками img src = " ... "
И вот еще вопрос - толбко ли ссылки на картинки тормозят открытие странцы? То есть что еще может искать браузер при открытии кроме картинок и файла css?

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 20.05.2004 (Чт) 11:41

Я имел ввиду не так.
Вот набросок кода:
Код: Выделить всё
Const vbSpace As String = " ", TagOpen As String = "<", TagClose As String = ">", Quote As String = """", Eq As String = "="
Const Base As String = "http://mysite.com/"
'HTML - переменная с кодом страницы
Dim I As Long, I0 As Long, IP As Long, IL As Long, P As Long, C As Long, S As String, S0 As String
Dim P1 As Long, P2 As Long
Dim P() As String
ReDim P(1 To 2)
P(1) = "SRC"
P(2) = "HREF"
I0 = 1
Do
  'Найти очередной параметр (SRC, HREF)
  I = 0
  For C = LBound(P) To UBound(P)
    S = vbSpace & P(C)
    P = InStr(I0, HTML, vbSpace & P(C), vbTextCompare)
    If P > 0 Then
      If I = 0 Then
        I = P
        S = vbSpace & P(C)
      Else
        If P < I Then
          I = P
          S = vbSpace & P(C)
        End If
      End If
    End If
  Next C
  If I = 0 Then Exit Do
  I0 = I + Len(S)
  'Проверить, что параметр находится внутри тэга <>
  P = InStrRev(HTML, TagOpen, I, vbTextCompare)
  If P > 0 Then
    P1 = P 'открывающийся тэг
    P = InStr(P1, HTML, TagClose, vbTextCompare)
    If P > 0 Then
      P2 = P 'закрывающийся тэг
    End If
  End If
  If I > P1 And I < P2 Then 'параметр внутри тэга
    P = InStr(I, HTML, Eq, vbTextCompare)
    If P > 0 Then 'параметр имеет значение
      'Пропустить первые пробелы
      I = P + 1
      Do
        If Mid$(HTML, I, 1) <> vbSpace Then Exit Do
        If I > P2 Then
          I = 0
          Exit Do
        End If
      Loop
      If I > 0 Then
        'Определить позицию значения параметра
        If Mid$(HTML, I, 1) = Quote Then 'если параметр в кавычках, искать вторую кавычку
          P = InStr(I+1, HTML, Quote, vbTextCompare)
          If P > 0 And P < P2 Then 'если результат находится внутри тэга
            P1 = I
            P2 = P
          End If
        Else 'иначе до первого пробела
          P = InStr(I+1, HTML, vbSpace, vbTextCompare)
          If P > 0 And P < P2 Then 'если результат находится внутри тэга
            P1 = I
            P2 = P
          End If
        End If
        If P > 0 Then 'удалось выделить значение параметра
          S = Mid$(HTML, P1, P2-P1+1) 'значение параметра
          If UCase$(Base) = UCase$(Left$(S, Len(Base))) Then 'если путь идет от базы (ссылается в Internet
            S0 = ".\" & Mid$(S, Len(Base)+1) 'исправленный путь
            If Len(S) = Len(S0) Then 'если длина не изменилась
              Mid$(HTML, P1, P2-P1+1) = S0 'исправить значение параметра
            Else
              'Переформировать строку, внеся новое значение параметра
              HTML = Left$(HTML, P1-1) & S0 & Mid$(HTML, P2+1)
              'Сместить текущую позицию, с которой будет продолжаться обработка
              I0 = I0 + (Len(S0) - Len(S))
            End If
          End If
        End If
      End If
    End If
  End If
Loop


Код вбивал прям в форуме, возможны очепятки и ошибки, но общая идея такова.
Lasciate ogni speranza, voi ch'entrate.

moshkin
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 108
Зарегистрирован: 03.12.2002 (Вт) 15:01
Откуда: Russia

Сообщение moshkin » 20.05.2004 (Чт) 12:36

в таком куске сразу не разберусь. Да и отвлекают. :(
Спасибо. Буду пробовать.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 20.05.2004 (Чт) 12:58

Уже вижу, что IP и IL не нужны, а P() As String конфликтует с P As Long :)
Но "суть" кода заключается в строке "HTML = Left$(HTML, P1-1) & S0 & Mid$(HTML, P2+1)"
Lasciate ogni speranza, voi ch'entrate.

moshkin
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 108
Зарегистрирован: 03.12.2002 (Вт) 15:01
Откуда: Russia

Сообщение moshkin » 20.05.2004 (Чт) 13:43

Уже вижу много интересного, приятно почитать специалиста.
Если не трудно - а что делает кусок:
'Найти очередной параметр (SRC, HREF)
I = 0
For C = LBound(P) To UBound(P)
...
Next C
Там вроде добавляются пробелы, но пока не разобрался зачем?
Остальное пока на первый взгляд понятно.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 20.05.2004 (Чт) 13:45

Этот фрагмент находит _любое_ из вхождений, перечисленных в P(). Вернее, не любое, а то, которое встретится раньше.
А пробел добавляется только при поиске, чтобы находились "<IMG SRC...", но не "IMGSRC"
Lasciate ogni speranza, voi ch'entrate.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 20.05.2004 (Чт) 13:51

Да, и еще.
Целесообразно было бы заменить это:
Код: Выделить всё
            If Len(S) = Len(S0) Then 'если длина не изменилась
              Mid$(HTML, P1, P2-P1+1) = S0 'исправить значение параметра
            Else
              'Переформировать строку, внеся новое значение параметра
              HTML = Left$(HTML, P1-1) & S0 & Mid$(HTML, P2+1)
              'Сместить текущую позицию, с которой будет продолжаться обработка
              I0 = I0 + (Len(S0) - Len(S))
            End If

на это:
Код: Выделить всё
            I0 = P2 + 1
            If Len(S) = Len(S0) Then 'если длина не изменилась
              Mid$(HTML, P1, P2-P1+1) = S0 'исправить значение параметра
            Else
              'Переформировать строку, внеся новое значение параметра
              HTML = Left$(HTML, P1-1) & S0 & Mid$(HTML, P2+1)
              'Сместить текущую позицию, с которой будет продолжаться обработка
              I0 = I0 + (Len(S0) - Len(S))
            End If
Lasciate ogni speranza, voi ch'entrate.


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Google-бот и гости: 2

    TopList