当前位置: 首页 > news >正文

Python4Delphi: Delphi 程序使用 Python 抓取网页

想用程序去抓取一个网页的内容,Delphi 有自己的 HTTP 库。比如 Indy 的 TIdHTTP,或者 TNetHTTPClient。

这里测试一下使用 Python 的 HTTP 库抓取网页,然后把抓取的内容给 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;
上述控件的主要设置:

1. PythonEngine1.IO := PythonGUIInputOutput1;

2. PythonGUIInputOutput1.Output := Memo1;  //用 Memo1 来显示 Python 代码打印出来的网页内容。

3. PythonDelphiVar1.Engine := PythonEngine1;

4. PythonDelphiVar1.VarName := 'MyHTML'; //这个变量名称,会在 Python 代码里面使用。

5. 在 Memo2.Lines 里面放 Python 代码。

6. EdgeBrowser1 用于显示由 Python 抓回来的页面内容。

Delphi 的主要代码如下:
procedure TForm3.Button1Click(Sender: TObject);
vari: Integer;
beginEdgeBrowser1.Navigate('D:\test.html');//循环等待 EdgeBrowser1 打开完成。否则当 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. 当前目录下有 WebView2Loader.dll2. 必须先 Navigate 打开后,才能 NavigateToString
--------------------------------------------------------------------------}EdgeBrowser1.NavigateToString(s);end;

Python 代码如下:

import http.client# 页面的路径:blog.csdn.net/pcplayerconn = http.client.HTTPSConnection("blog.csdn.net")  # 工作正常,这里只能填写站点名称。子路径在 request 里面填写。conn.request("GET", "/pcplayer")
response = conn.getresponse()
print(response.status, response.reason)
data = response.read()
print(data.decode())  # 这里是输出的网页内容# MyHTML 是 Delphi 的控件对应的变量,它被赋值时会在 Delphi 代码里触发 OnSetData 事件。
# Delphi 程序在这个 OnSetData 事件里面拿到页面内容,写到浏览器里面去,让浏览器显示。
MyHTML.value = data.decode()# print 把页面内容输出,这个输出在 Delphi 程序里面会显示到 Memo1 里面。
print(response.url)
conn.close()

简单解释:

1. Delphi 程序里面的 EdgeBrowser 加载一个 test.html 页面。加载这个页面是为了打开这个 Browser 方便后继写入抓取的页面内容。

2. PythonEngine1 执行 Memo2 里面的 Python 代码;

3. PythonGUIInputOutput1 将 Python 代码执行后的 print 语句的内容输出到 Memo1 里面。这里是程序抓取到的网页内容。

4. PythonDelphiVar1 获取到 Python 代码里面的 MyHTML.Value 的值,也就是页面内容。并将这个内容写入 EdgeBrowser 浏览器显示。

运行效果图

上面这个图显示了 Memo1 里面呈现的网页内容

下面这个图显示了抓取的网页用浏览器显示的样子

总结:

在 Delphi 里面通过使用 Python4Delphi 控件,可以在 Delphi 程序里面调用 Python 的代码去执行 HTTP 访问。

http://www.lryc.cn/news/299950.html

相关文章:

  • 编辑器Zed
  • Java的接口
  • 【计算机网络】计算机软件工程人工智能研究生复试资料整理
  • 【Network Management】AUTOSAR架构下CanNm User Data详解
  • 量子算法入门——2.线性代数与复数
  • 分别通过select、多进程、多线程实现一个并发服务器
  • 如何在 emacs 上开始使用 Tree-Sitter (archlinux)
  • FL Studio2024最新中文版有哪些其新功能特点?
  • Oracle的学习心得和知识总结(三十二)|Oracle数据库数据库回放功能之论文四翻译及学习
  • 系统架构27 - 软件架构设计(6)
  • STM32 cubemx配置DMA+空闲中断接收不定长数据
  • Pycharm配置运行selenium教程
  • 银河麒麟V10开机后黑屏解决方法
  • 【Git版本控制 02】分支管理
  • 基金分类
  • kali系统概述、nmap扫描应用、john破解密码、抓包概述、以太网帧结构、抓包应用、wireshark应用、nginx安全加固、Linux系统加固
  • Spring Cloud 路由和消息传递 (HTTP 路由)
  • 【PyQt】12-滑块、计数控件
  • 【牛客面试必刷TOP101】Day21.BM11 链表相加(二)和BM12 单链表的排序
  • 疑似针对安全研究人员的窃密与勒索
  • Mamba-UNet:用于医学图像分割的类似UNet的纯视觉Mamba网络
  • 2024/2/14
  • 跟廖雪峰老师学习Git(持续更新)
  • 2024,欢迎来到性价比时代
  • 【国产MCU】-CH32V307-通用定时器(GPTM)-输入捕获模式测量脉冲
  • sqlserver char,nchar varchar nvarchar的区别
  • FT2232调试记录(2)
  • 网络学习:数据链路层VLAN原理和配置
  • Docker的常见命令以及命令别名
  • 2024.02.14作业