2012-02-11 24 views
7

Tôi không quan tâm đó là chuỗi, danh sách chuỗi, bản ghi nhớ, v.v ... không phải là tệp đĩaLàm thế nào để tải một trang web thành một biến?

Làm cách nào để tải xuống trang web cạnh tranh thành biến? Cảm ơn

+1

có thể trùng lặp với [Làm cách nào để tìm nạp nguồn của trang Web?] (Http : //stackoverflow.com/questions/7800026/how-can-i-fetch-the-source-of-a-web-page) –

Trả lời

17

Sử dụng Indy:

const 
    HTTP_RESPONSE_OK = 200; 

function GetPage(aURL: string): string; 
var 
    Response: TStringStream; 
    HTTP: TIdHTTP; 
begin 
    Result := ''; 
    Response := TStringStream.Create(''); 
    try 
    HTTP := TIdHTTP.Create(nil); 
    try 
     HTTP.Get(aURL, Response); 
     if HTTP.ResponseCode = HTTP_RESPONSE_OK then begin 
     Result := Response.DataString; 
     end else begin 
     // TODO -cLogging: add some logging 
     end; 
    finally 
     HTTP.Free; 
    end; 
    finally 
    Response.Free; 
    end; 
end; 
+1

+1, để câu trả lời của bạn ở trên cùng! –

+0

@AndreasRejbrand: cảm ơn :) –

+0

+1 NHƯNG, tôi cần gì trong "sử dụng" để truy cập HTTP_RESPONSE_OK? – Mawg

14

Sử dụng bản Microsoft Windows WinInet API:

function WebGetData(const UserAgent: string; const URL: string): string; 
var 
    hInet: HINTERNET; 
    hURL: HINTERNET; 
    Buffer: array[0..1023] of AnsiChar; 
    BufferLen: cardinal; 
begin 
    result := ''; 
    hInet := InternetOpen(PChar(UserAgent), INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0); 
    if hInet = nil then RaiseLastOSError; 
    try 
    hURL := InternetOpenUrl(hInet, PChar(URL), nil, 0, 0, 0); 
    if hURL = nil then RaiseLastOSError; 
    try 
     repeat 
     if not InternetReadFile(hURL, @Buffer, SizeOf(Buffer), BufferLen) then 
      RaiseLastOSError; 
     result := result + UTF8Decode(Copy(Buffer, 1, BufferLen)) 
     until BufferLen = 0; 
    finally 
     InternetCloseHandle(hURL); 
    end; 
    finally 
    InternetCloseHandle(hInet); 
    end; 
end; 

Thử:

procedure TForm1.Button1Click(Sender: TObject); 
begin 
    Memo1.Text := WebGetData('My Own Client', 'http://www.bbc.co.uk') 
end; 

Nhưng này chỉ hoạt động nếu mã hóa là UTF- số 8. Vì vậy, để làm cho nó hoạt động trong các trường hợp khác, bạn phải xử lý các trường hợp này một cách riêng biệt hoặc bạn có thể sử dụng trình bao bọc cấp cao Indy, theo đề xuất của Marjan. Tôi thừa nhận chúng vượt trội trong trường hợp này, nhưng tôi vẫn muốn quảng bá API cơ bản, nếu không có lý do nào khác ngoài giáo dục ...

+0

+1 để sử dụng công cụ có sẵn cho OS. –

+0

LOL, xin lỗi, đã sửa. Não của tôi đang bị sương mù. Phải là vì tôi đã qua 50 thứ Năm tuần trước. –

+0

+1 cho "giáo dục" :-) – Mawg

Các vấn đề liên quan