做網(wǎng)站圖片多大企業(yè)網(wǎng)絡(luò)營銷策略分析案例
想用程序去抓取一個網(wǎng)頁的內(nèi)容,Delphi 有自己的 HTTP 庫。比如 Indy 的 TIdHTTP,或者 TNetHTTPClient。
這里測試一下使用 Python 的 HTTP 庫抓取網(wǎng)頁,然后把抓取的內(nèi)容給 Delphi 的程序。
Delphi 程序,界面上拖控件如下:
Panel1: TPanel;Button1: TButton;PageControl1: TPageControl;TabSheet1: TTabSheet;TabSheet2: TTabSheet;Memo1: TMemo;Splitter1: TSplitter;Memo2: TMemo;PythonEngine1: TPythonEngine;PythonDelphiVar1: TPythonDelphiVar;EdgeBrowser1: TEdgeBrowser;Button2: TButton;PythonGUIInputOutput1: TPythonGUIInputOutput;
上述控件的主要設(shè)置:
1. PythonEngine1.IO := PythonGUIInputOutput1;
2. PythonGUIInputOutput1.Output := Memo1;? //用 Memo1 來顯示 Python 代碼打印出來的網(wǎng)頁內(nèi)容。
3.?PythonDelphiVar1.Engine := PythonEngine1;
4.?PythonDelphiVar1.VarName := 'MyHTML'; //這個變量名稱,會在 Python 代碼里面使用。
5. 在 Memo2.Lines 里面放 Python 代碼。
6. EdgeBrowser1 用于顯示由 Python 抓回來的頁面內(nèi)容。
Delphi 的主要代碼如下:
procedure TForm3.Button1Click(Sender: TObject);
vari: Integer;
beginEdgeBrowser1.Navigate('D:\test.html');//循環(huán)等待 EdgeBrowser1 打開完成。否則當(dāng) Python 抓取到頁面后寫入 EdgeBrowser 會失敗。i := 0;while True dobeginSleep(100);Inc(i);Application.ProcessMessages;if i > 10 then Break;end;PythonEngine1.ExecStrings(Memo2.Lines);
end;procedure TForm3.Button2Click(Sender: TObject);
varS: string;
begin
// S := '<html><head></head><body>abc 12333 <p> hello world!!!</body></html>';S := VarToStr(PythonDelphiVar1.Value);ShowHTML(S);
end;procedure TForm3.PythonDelphiVar1SetData(Sender: TObject; Data: Variant);
varS: string;
begin//ShowMessage('寫頁面');S := VarToStr(Data);ShowHTML(S);
end;procedure TForm3.ShowHTML(const S: string);
begin
{--------------------------------------------------------------------------使用 EdgeBrowse 必須:1. 當(dāng)前目錄下有 WebView2Loader.dll2. 必須先 Navigate 打開后,才能 NavigateToString
--------------------------------------------------------------------------}EdgeBrowser1.NavigateToString(s);end;
Python 代碼如下:
import http.client# 頁面的路徑:blog.csdn.net/pcplayerconn = http.client.HTTPSConnection("blog.csdn.net") # 工作正常,這里只能填寫站點(diǎn)名稱。子路徑在 request 里面填寫。conn.request("GET", "/pcplayer")
response = conn.getresponse()
print(response.status, response.reason)
data = response.read()
print(data.decode()) # 這里是輸出的網(wǎng)頁內(nèi)容# MyHTML 是 Delphi 的控件對應(yīng)的變量,它被賦值時會在 Delphi 代碼里觸發(fā) OnSetData 事件。
# Delphi 程序在這個 OnSetData 事件里面拿到頁面內(nèi)容,寫到瀏覽器里面去,讓瀏覽器顯示。
MyHTML.value = data.decode()# print 把頁面內(nèi)容輸出,這個輸出在 Delphi 程序里面會顯示到 Memo1 里面。
print(response.url)
conn.close()
簡單解釋:
1. Delphi 程序里面的 EdgeBrowser 加載一個 test.html 頁面。加載這個頁面是為了打開這個 Browser 方便后繼寫入抓取的頁面內(nèi)容。
2. PythonEngine1 執(zhí)行 Memo2 里面的 Python 代碼;
3.?PythonGUIInputOutput1 將 Python 代碼執(zhí)行后的 print 語句的內(nèi)容輸出到 Memo1 里面。這里是程序抓取到的網(wǎng)頁內(nèi)容。
4.?PythonDelphiVar1 獲取到 Python 代碼里面的 MyHTML.Value 的值,也就是頁面內(nèi)容。并將這個內(nèi)容寫入 EdgeBrowser 瀏覽器顯示。
運(yùn)行效果圖
上面這個圖顯示了 Memo1 里面呈現(xiàn)的網(wǎng)頁內(nèi)容
下面這個圖顯示了抓取的網(wǎng)頁用瀏覽器顯示的樣子
總結(jié):
在 Delphi 里面通過使用 Python4Delphi 控件,可以在 Delphi 程序里面調(diào)用 Python 的代碼去執(zhí)行 HTTP 訪問。