Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Работа с сетью в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.02.2012, 23:31   #1
Pein95
Форумчанин
 
Регистрация: 25.04.2010
Сообщений: 881
По умолчанию скачивание картинок с demotivators.ru

Код:
   for k := 0 to List_jpg.Count - 1 do
   begin
     idhttp1.Get(list_jpg.Strings[k],stream);
     randomize;
     x:=random(100000000);
     stream.SaveToFile(edit2.text+inttostr(x)+'.jpg');
     stream.Free;
   end;
вот код с помощю которого я скачиваю картинки... Но проблема в том, что возникает вот такая ошибка:
First chance exception at $7524B727. Exception class EAccessViolation with message 'Access violation at address 00000000. Read of address 00000000'. Process Project1.exe (2384).
как её можна исправить?
Pein95 вне форума Ответить с цитированием
Старый 03.02.2012, 23:45   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

А stream создавать не надо? При чем вне цикла и убивать вне цикла. И randomize один раз делается, а не в цикле
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 03.02.2012, 23:53   #3
Pein95
Форумчанин
 
Регистрация: 25.04.2010
Сообщений: 881
По умолчанию

стрим создан. если вынести Stream.free из цикла, то скачиваютса одно изображения несколько раз.
Pein95 вне форума Ответить с цитированием
Старый 04.02.2012, 00:10   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Даже если он создан вы его убиваете после считывания первой же картинки
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 04.02.2012, 00:59   #5
Pein95
Форумчанин
 
Регистрация: 25.04.2010
Сообщений: 881
По умолчанию

ясн) понял) сделал.. уже скачивает норм, но если я хочу отпарсить более одной страницы возникает такая ошибка:
Exception class EIdSocketError with message 'Socket Error # 10054 Connection reset by peer.'.
вот весь исходник:
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient, IdHTTP,
  StdCtrls, ComCtrls;

type
  TForm1 = class(TForm)
    IdHTTP1: TIdHTTP;
    GroupBox1: TGroupBox;
    Edit1: TEdit;
    Label1: TLabel;
    UpDown1: TUpDown;
    Edit3: TEdit;
    Label2: TLabel;
    UpDown2: TUpDown;
    Edit2: TEdit;
    Label3: TLabel;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    procedure UpDown1Click(Sender: TObject; Button: TUDBtnType);
    procedure UpDown2Click(Sender: TObject; Button: TUDBtnType);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}


const link='http://demotivators.ru/?page=';

function get_link(text:string; b_str:string; e_str:string ):tstringlist;
var
bg,en,i:integer;
res:string;

begin
  //b_str= 'href="/posters/'
  //e_str=  '.htm"><img'
  result:=tstringlist.Create;
  for I := 1 to 12 do
  begin
    bg:=pos(b_str,text);
    en:=pos(e_str,text);
    res:='http://demotivators.ru'+copy(text,bg+6,en-bg-2);
    result.Add(res);
    delete(text,1,en+10);
    delete(text,1,pos(b_str,text)+15);
  end;

end;




function get_jpg(text:string; b_str:string; e_str:string):string;
var
bg,en:integer;
begin
  //b_str= 'id="poster" src="/media/posters/'
  //e_str=  '.jpg" alt'
  bg:=pos(b_str,text);
  en:=pos(e_str,text);
  result:=copy(text,bg+17,en-bg-13);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
i,j,k:integer;
x:int64;
s,res,name:string;
list_link:tstringlist;
list_jpg:tstringlist;
stream:tmemorystream;
begin
list_link:=tstringlist.Create;
list_jpg:=tstringlist.Create;
stream:=tmemorystream.Create;
randomize;
for I := strtoint(edit1.Text) to strtoint(edit3.Text) do
begin
   s:=idhttp1.Get(link+inttostr(i));
   list_link:=get_link(s, 'href="/posters/', '.htm"><img' );
   for j := 0 to List_link.Count - 1 do
     begin
       s:=idhttp1.Get(list_link.Strings[j]);
       list_jpg.Add('http://demotivators.ru'+get_jpg(s, 'id="poster" src="/media/posters/', '.jpg" alt'));
     end;
   for k := 0 to List_jpg.Count - 1 do
   begin

     idhttp1.Get(list_jpg.Strings[k],stream);

     x:=random(100000000);
     stream.SaveToFile(edit2.text+inttostr(x)+'.jpg');
     stream.clear;



   end;
   list_jpg.Clear;
   list_link.Clear;

end;
stream.Free;
list_jpg.Free;
list_link.Free;



end;

procedure TForm1.UpDown1Click(Sender: TObject; Button: TUDBtnType);
begin
edit1.Text:=inttostr(updown1.Position);
end;

procedure TForm1.UpDown2Click(Sender: TObject; Button: TUDBtnType);
begin
edit3.Text:=inttostr(updown2.Position);
end;

end.
Pein95 вне форума Ответить с цитированием
Старый 05.02.2012, 01:59   #6
Pein95
Форумчанин
 
Регистрация: 25.04.2010
Сообщений: 881
По умолчанию

Что ни у кого идей нет(?
Pein95 вне форума Ответить с цитированием
Старый 05.02.2012, 02:23   #7
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Исчерпывающий ответ
Человек_Борща вне форума Ответить с цитированием
Старый 05.02.2012, 02:50   #8
Pein95
Форумчанин
 
Регистрация: 25.04.2010
Сообщений: 881
По умолчанию

к сожелению полностю не помогло... теперь работает токо на первых двух страницах, но если парсим 3 и 4 опять та же ошибка, если парсим в промежутке от 1 до 5 работает только на первих двух
Pein95 вне форума Ответить с цитированием
Старый 05.02.2012, 03:52   #9
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Делайте задержку. Вы создаёте нагрузку на сервер, вот вас и посылают "лесом"....
Человек_Борща вне форума Ответить с цитированием
Старый 05.02.2012, 14:16   #10
Pein95
Форумчанин
 
Регистрация: 25.04.2010
Сообщений: 881
По умолчанию

думал также... пробовал задержку после скачивания в 3 секунды, и между переходами страниц в 50 сек. не помогло..
Pein95 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
парсинг картинок demotivators.ru Pein95 Работа с сетью в Delphi 5 14.01.2012 01:54
Скачивание с авторизацией nXs Работа с сетью в Delphi 4 07.10.2010 15:54
Скачивание с редиректом alexprey Работа с сетью в Delphi 7 18.09.2010 17:18
скачивание сайта Лубышев Софт 2 09.03.2008 20:43