Напомню, в посте про загрузку страниц и парсинг я столкнулся с проблемой всплывающего окна, которое настойчиво предлагало сохранить “куки”. Выглядело оно так…
Ни о какой автоматической обработке 100 страниц не могло идти речи с этим окном! Посидев с проблемой пару вечеров, нашел 2 решения.
“Железный способ”
Самый “железный” способ – снизить безопасность в Internet Explorer до нуля! Как это сделать? Заходим в свойства браузера и выставляем ползунок в нулевое положение.
Программный способ избавиться от окна.
Если допустим мы пишем софт для машины клиента, а не для своей, и чтобы потом ему 33 раза не объяснять где что нажать, чтобы заработало, то программный способ просто необходим!!!
Исследование с помощью программы Process Monitor дало информацию о том, что при изменении ползунка значение переменной 1A10 меняется.
1 |
HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings\Zones\3\1A10 |
Соответственно при нулевом значении ползунка окна не появляется. Задача свелась к тому, чтобы поправлять это значение в реестре.
Правильным алгоритмом было бы – ставить значение 1A10 в ноль только на время участка кода скачивания страниц, иначе может возникнуть “дыра” в безопасности.
Ниже я привожу код, который меняет значение 1A10 в реестре в те моменты, когда это необходимо – а именно перед загрузкой страницы, а в момент “парсинга” (кнопка ShowAllTags) – значение 1A10 возвращаем в исходное состояние.
На форме 3 кнопки, label, edit… Обработку привожу только для 2 кнопок, Set1A10 – вспомогательная.
Итак, поехали.
В uses добавляем
1 |
Registry,Winapi.Windows |
Заведем глобальную переменную
1 |
var Original1A10:integer; IDoc: IHTMLDocument2; |
Далее напишем 2 вспомогательных метода
Чтение 1A10 из реестра
1 2 3 4 5 6 7 8 9 10 11 |
function TForm2.Read1A10:integer; var reg:TRegistry; begin reg:=TRegistry.Create; reg.RootKey:=HKEY_CURRENT_USER; reg.OpenKey('Software\Microsoft\Windows\CurrentVersion\Internet Settings\Zones\3\', false); Result:=(reg.ReadInteger('1A10')); reg.CloseKey; reg.Free; end; |
Запись 1A10 в реестр
1 2 3 4 5 6 7 8 9 |
procedure TForm2.Write1A10(const Value: integer); var reg:TRegistry; begin reg:=TRegistry.Create; reg.RootKey:=HKEY_CURRENT_USER; reg.OpenKey('Software\Microsoft\Windows\CurrentVersion\Internet Settings\Zones\3\', false); reg.WriteInteger('1A10',Value); reg.Free; end; |
При создании формы
1 2 3 4 5 |
procedure TForm2.FormCreate(Sender: TObject); begin Original1A10:=Self.Read1A10; // << Запоминаем, что было в реестре, чтобы потом вернуть Label1.Text:=Label1.Text+inttostr(Self.Read1A10); end; |
Загрузка страницы с IHTMLDocument2
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
procedure TForm2.LoadPageClick(Sender: TObject); var V: OleVariant; HTML: String; begin try Self.Write1A10(0); // << Пишем нулевое значение Label1.Text:='1A10 in Registry='+inttostr(Self.Read1A10); memo1.Lines.Clear; //Загрузка страницы в htmldoc idhttp1.HandleRedirects:=true; html:=idhttp1.Get('http://www.vesti.ru/'); //iDoc:=CreateComObject(Class_HTMLDOcument) as IHTMLDocument2; v:=VarArrayCreate([0,0],VarVariant); v[0]:= HTML; idoc:=coHTMLDocument.Create as IHTMLDocument2; idoc.write(PSafeArray(System.TVarData(v).VArray)); //загрузили в htmldoc finally end; end; |
“Парсинг” страницы (чтение всех тегов)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
procedure TForm2.ShowAllTagsClick(Sender: TObject); var i:integer; s:string; idisp:IDispatch; iElement : IHTMLElement; begin for i := 1 to idoc.all.length do begin idisp:=idoc.all.item(pred(i),0); idisp.QueryInterface(IHTMLElement,iElement); str(pred(i),s); s:=s+' '; if assigned(ielement) then begin S:=S+' tag '+iElement.tagName+' '; end; memo1.Lines.Add(s); end; Self.Write1A10(Original1A10); // << Восстанавливаем оригинальное значение label1.Text:='1A10 in Registry ='+inttostr(Self.Read1A10); end; |