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