connection closed gracefully

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by ImLucky, 17 Oct 2010.

  1. ImLucky

    ImLucky New Member

    Joined:
    26 Sep 2010
    Messages:
    72
    Likes Received:
    3
    Reputations:
    0
    Дорогие форумчане, уже несколько месяцев пытаюсь написать что-то вроде граббера мыльников с одного сайта, но все мои попытки проваливаются.
    Суть в том, что мне нужно сделать программу, которая бы брала исходный код страницы от сюда
    Code:
    http://jd.mail.ru/user/4
    . Из самого кода выдирала сам email, а если быть точнее то ссылку на "мой мир"
    Code:
    <div><a href='http://my.mail.ru/inbox/falcon83/'><img src='http://avt.foto.mail.ru/inbox/falcon83/_avatar180'></a></div><div><center><a href='http://my.mail.ru/inbox/falcon83/'>Мой Мир</a></center></div
    И записывала это например в memo1, и после записы переходила на следующую страницу, то есть с 4-ой на 5-ую, и повторяла предыдущие действия до тех пор, пока не закончаться страницы. В идеале хотелось бы конечно что бы из вида inbox/falcon83 , прога конвертировала бы в falcon83(пёс)mail.ru , но пока это не самое главное.

    Но проблемы возникают уже на первом же шаге, в получении исходного кода, и его отображении.


    Code:
    unit Unit1;
    
    interface
    
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient, IdHTTP,
      StdCtrls, ComCtrls;
    
    type
      TForm1 = class(TForm)
        Button1: TButton;
        RichEdit1: TRichEdit;
        IdHTTP1: TIdHTTP;
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;
    
    var
      Form1: TForm1;
    
    implementation
    
    {$R *.dfm}
    
    procedure TForm1.Button1Click(Sender: TObject);
    begin
    RichEdit1.Text:=idhttp1.Get('http://jd.mail.ru/user/1');
    end;
    
    end.
    
    При нажатии на кнопку, вылетает мессага "connection closed gracefully" , и html код соответственно не появляется в richedit. Если я например меняю адресс на яндекс.ру , то всё нормально. Долгие и упорные изучения гугла мне помогли понять что "connection closed gracefully" не является ошибкой, что мол коннект прошел успешно, и потом серв меня отрубил, что-то вроде этого, но от этого мне не ставится легче =) Помогите пожалуйста, что не так. И что самое главное, уже очень долго пытаюсь написать хотя бы элементарный парсер, но тоже не получается, напишите код, как мне можно спарсить ссылки на мой мир, заранее, огромнейшее спасибо.
     
  2. Евгений М.

    Евгений М. New Member

    Joined:
    10 Oct 2010
    Messages:
    7
    Likes Received:
    3
    Reputations:
    0
    ImLucky, вообщем сделайте так, чтобы запрос на сервер был примерно такой:
    Code:
    GET /user/4 HTTP/1.1
    Host: jd.mail.ru
    Connection: keep-alive
    Cache-Control: max-age=0
    Accept: application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
    User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/534.3 (KHTML, like Gecko) Chrome/6.0.472.63 Safari/534.3
    Accept-Encoding: deflate
    Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4
    Accept-Charset: windows-1251,utf-8;q=0.7,*;q=0.3
    Для этого исправите свойства idHttp1.Request....

    Можете попробовать обойтись без некоторых параметров. Но это сами.
     
  3. ImLucky

    ImLucky New Member

    Joined:
    26 Sep 2010
    Messages:
    72
    Likes Received:
    3
    Reputations:
    0
    Спасибо, прийду с работы, попробую.
     
  4. ImLucky

    ImLucky New Member

    Joined:
    26 Sep 2010
    Messages:
    72
    Likes Received:
    3
    Reputations:
    0
    Проблема решилась, но только от части....

    По непонятным для меня причинам, иногда удаётся получить код, а иногда нет. В самой программе, при нажатии на кнопку вылетает алерт "HTTP/1.1 403 Forbidden" . То есть тут 50 на 50, либо код получается, либо вылетает эта ошибка. Как пофиксить ?

    Code:
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      idhttp1.Request.Host:='jd.mail.ru';
      idhttp1.Request.Accept:='application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5';
      idhttp1.Request.AcceptCharSet:='windows-1251,utf-8;q=0.7,*;q=0.3';
      idhttp1.Request.AcceptLanguage:='ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4';
      idhttp1.Request.UserAgent:='Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/534.3 (KHTML, like Gecko) Chrome/6.0.472.63 Safari/534.3';
      idhttp1.Request.Connection:='keep-alive';
      RichEdit1.Text:=idhttp1.Get('http://jd.mail.ru/user/4');
    end;
    
     
  5. Kandi

    Kandi Member

    Joined:
    18 Nov 2009
    Messages:
    344
    Likes Received:
    17
    Reputations:
    0
    Работает на ура просто :) не знаю что у тебя там)
    Code:
    procedure TForm1.Button1Click(Sender: TObject);
    var
      HTTP : TIDHTTP;
      Tmp : TStringList;
      i : Integer;
      Ssilka : String;
    begin
      Tmp := TStringList.Create;
      HTTP := TIdHTTP.Create(nil);
      HTTP.AllowCookies := True;
      HTTP.HandleRedirects := True;
      HTTP.Request.Host:='jd.mail.ru';
      HTTP.Request.Accept:='application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5';
      HTTP.Request.AcceptCharSet:='windows-1251,utf-8;q=0.7,*;q=0.3';
      HTTP.Request.AcceptLanguage:='ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4';
      HTTP.Request.UserAgent:='Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/534.3 (KHTML, like Gecko) Chrome/6.0.472.63 Safari/534.3';
      HTTP.Request.Connection:='keep-alive';
    
      TMP.Text := HTTP.Get('http://jd.mail.ru/user/56');
    
      for I:=0 to Tmp.Count-1 do
        begin
          if Pos('my.mail.ru', Tmp[i])<>0 then
            begin
              Ssilka := Copy(Tmp[i], Pos('href='#39, Tmp[i])+6, Length(Tmp[i]));
              Ssilka := Copy(Ssilka, 0, Pos(#39'>', Ssilka)-2);
              memo1.Lines.Clear;
              memo1.Lines.Append(Ssilka);
            end;
        end;
    
    end;
    
    Я пользуюсь, RAD Studio 2010, Indy 10++
     
    #5 Kandi, 19 Oct 2010
    Last edited: 19 Oct 2010
  6. ImLucky

    ImLucky New Member

    Joined:
    26 Sep 2010
    Messages:
    72
    Likes Received:
    3
    Reputations:
    0
    Сейчас попробую
     
  7. ImLucky

    ImLucky New Member

    Joined:
    26 Sep 2010
    Messages:
    72
    Likes Received:
    3
    Reputations:
    0
    Большое спасибо за код, работает действительно отлично. Но проблема со 2-ой ошибкой по прежнему сохранилась. Посмотри скрин.
    _http://i021.radikal.ru/1010/5d/a36fed09c6f7.jpg

    Я не знаю, может мне обновить чего-то надо ?) У меня стоит Delphi 7, как установил, так ничего в ней не обновлял и не менял.

    Сейчас буду думать, как сделать что бы он чекал ссылки с 1-ой по 300к+ и записывал =)
     
  8. ImLucky

    ImLucky New Member

    Joined:
    26 Sep 2010
    Messages:
    72
    Likes Received:
    3
    Reputations:
    0
    C ошибкой разобрался, осталось понять как сделать что бы прога автоматом перебирала цифры в ссылке. Я так понимаю тут что-то связанно с циклами ?
     
  9. ImLucky

    ImLucky New Member

    Joined:
    26 Sep 2010
    Messages:
    72
    Likes Received:
    3
    Reputations:
    0
    В общем я сделал так, вроде бы всё работает, но не знаю как сделать, что бы ссылки не заменяли друг друга, а писались в столбик. Может кто-то подсказать ?

    И проблема с ошибкой сохранилась, помогите пожалуйста. Скрин ошибки. _http://i021.radikal.ru/1010/5d/a36fed09c6f7.jpg


    Code:
    var
      HTTP : TIDHTTP;
      Tmp : TStringList;
      i : Integer;
      Ssilka : String;
      num: integer;
    begin
      Tmp := TStringList.Create;
      HTTP := TIdHTTP.Create(nil);
      for num:=1 to 35000 do
      begin
      HTTP.AllowCookies := True;
      HTTP.HandleRedirects := True;
      HTTP.Request.Host:='jd.mail.ru';
      HTTP.Request.Accept:='application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5';
      HTTP.Request.AcceptCharSet:='windows-1251,utf-8;q=0.7,*;q=0.3';
      HTTP.Request.AcceptLanguage:='ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4';
      HTTP.Request.UserAgent:='Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/534.3 (KHTML, like Gecko) Chrome/6.0.472.63 Safari/534.3';
      HTTP.Request.Connection:='keep-alive';
    
      TMP.Text := HTTP.Get('http://jd.mail.ru/user/'+ Inttostr(num));
    
      for I:=0 to Tmp.Count-1 do
        begin
          if Pos('my.mail.ru', Tmp[i])<>0 then
            begin
              Ssilka := Copy(Tmp[i], Pos('href='#39, Tmp[i])+6, Length(Tmp[i]));
              Ssilka := Copy(Ssilka, 0, Pos(#39'>', Ssilka)-2);
              memo1.Lines.Clear;
              memo1.Lines.Append(Ssilka);
            end;
        end;
      end;
    end;
     
  10. ImLucky

    ImLucky New Member

    Joined:
    26 Sep 2010
    Messages:
    72
    Likes Received:
    3
    Reputations:
    0
    Со списком тоже разобрался =)
    В общем ребят, пожалуйста, кто знает, помогите как решить проблему с этой ошибкой, очень очень сильно прошу )
    _http://i021.radikal.ru/1010/5d/a36fed09c6f7.jpg
     
  11. ImLucky

    ImLucky New Member

    Joined:
    26 Sep 2010
    Messages:
    72
    Likes Received:
    3
    Reputations:
    0
    Судя по всему ошибка идёт из-за отсутствия авторизации.
    может кто-то дополнить код, и написать форму авторизации ? Пожалуйста, буду очень благодарен.
    Валидный акк [email protected] test317
    Думаю проблема с ошибкой из-за этого...
     
  12. RedFern.89

    RedFern.89 Member

    Joined:
    20 Jan 2010
    Messages:
    575
    Likes Received:
    48
    Reputations:
    0
    а можно и на сцокетах сделать)) там не будет зловредных эксепшенов, которым весь инди кишит
     
  13. ImLucky

    ImLucky New Member

    Joined:
    26 Sep 2010
    Messages:
    72
    Likes Received:
    3
    Reputations:
    0
    Спасибо, но прога уже дописана, и исправно работает ) Тему можно закрывать )