Дорогие форумчане, уже несколько месяцев пытаюсь написать что-то вроде граббера мыльников с одного сайта, но все мои попытки проваливаются. Суть в том, что мне нужно сделать программу, которая бы брала исходный код страницы от сюда 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" не является ошибкой, что мол коннект прошел успешно, и потом серв меня отрубил, что-то вроде этого, но от этого мне не ставится легче =) Помогите пожалуйста, что не так. И что самое главное, уже очень долго пытаюсь написать хотя бы элементарный парсер, но тоже не получается, напишите код, как мне можно спарсить ссылки на мой мир, заранее, огромнейшее спасибо.
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.... Можете попробовать обойтись без некоторых параметров. Но это сами.
Проблема решилась, но только от части.... По непонятным для меня причинам, иногда удаётся получить код, а иногда нет. В самой программе, при нажатии на кнопку вылетает алерт "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;
Работает на ура просто не знаю что у тебя там) 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++
Большое спасибо за код, работает действительно отлично. Но проблема со 2-ой ошибкой по прежнему сохранилась. Посмотри скрин. _http://i021.radikal.ru/1010/5d/a36fed09c6f7.jpg Я не знаю, может мне обновить чего-то надо ?) У меня стоит Delphi 7, как установил, так ничего в ней не обновлял и не менял. Сейчас буду думать, как сделать что бы он чекал ссылки с 1-ой по 300к+ и записывал =)
C ошибкой разобрался, осталось понять как сделать что бы прога автоматом перебирала цифры в ссылке. Я так понимаю тут что-то связанно с циклами ?
В общем я сделал так, вроде бы всё работает, но не знаю как сделать, что бы ссылки не заменяли друг друга, а писались в столбик. Может кто-то подсказать ? И проблема с ошибкой сохранилась, помогите пожалуйста. Скрин ошибки. _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;
Со списком тоже разобрался =) В общем ребят, пожалуйста, кто знает, помогите как решить проблему с этой ошибкой, очень очень сильно прошу ) _http://i021.radikal.ru/1010/5d/a36fed09c6f7.jpg
Судя по всему ошибка идёт из-за отсутствия авторизации. может кто-то дополнить код, и написать форму авторизации ? Пожалуйста, буду очень благодарен. Валидный акк [email protected] test317 Думаю проблема с ошибкой из-за этого...