开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 211|回复: 3
收起左侧

[其它源码] Python调用BtChromeFormBot64位DLL进行爬取XHS图文标题

[复制链接]
结帖率:100% (20/20)
发表于 3 天前 | 显示全部楼层 |阅读模式   安徽省亳州市
分享源码
界面截图: -
是否带模块: -
备注说明: -
本帖最后由 小房同学 于 2025-9-9 14:24 编辑

BtChromeFormBot介绍:
                                 BtChromeFormBot_64.dll  是基于go语言开发的dll动态链接库,目前支持32位,64位,支持C/C++,Python,Java,火山编程,C#,易语言(32位DLL)等主流编程语言调用,之前封装了一个比特填表模块,更新到1.3版本,是基于E2EE支持库 纯易语言封装,因此必须要安装E2EE支持库才可以使用模块,好巧不巧的是,模块使用了守护,而模块的源码让我存到了U盘里,U盘丢失,所以比特填表模块就放弃了~~~ 于是就开启了go语言封装dll动态链接库模式~
第一个版本1.0 dll动态链接库封装了 224个命令,其中包含 编码转换,Json解析,网页访问,谷歌CDP相关的操作命令
BtChromeFormBot DLL动态链接库网址:http://chrome.bitecloud.cn/    函数文档:http://chrome.bitecloud.cn/api.html


实际上爬取用python库还是比较方便的快速的,只是为了整活,是如何用Python调用BtChromeFormBotdll动态链接库进行网页填表的。希望能帮助大家

交流群:1033315995


效果演示图:



Pytyhon调用示例代码:
[Python] 纯文本查看 复制代码
import ctypes
import time
import json



def PointerToText(dll_path, ptr, length=65535):
    """
    调用DLL中的指针到文本转换功能
    :param dll_path: DLL文件路径
    :param ptr: 内存指针(整数地址或ctypes指针对象)
    :param length: 可选,指定字节长度(用于非字符串指针)
    :return: 转换后的文本或None
    """
    try:
        # 加载DLL
        dll = ctypes.WinDLL(dll_path)

        # 定义DLL函数接口(假设DLL提供了PointerToText函数)
        dll.PointerToText.argtypes = [ctypes.c_void_p, ctypes.c_int]  # 接受指针地址和长度
        dll.PointerToText.restype = ctypes.c_char_p  # 返回char*类型

        # 调用DLL函数
        if isinstance(ptr, ctypes._Pointer):
            ptr = ctypes.addressof(ptr.contents)  # 提取指针地址
        text_ptr = dll.PointerToText(ptr, length)

        if text_ptr:
            return text_ptr.decode('utf-8')
        else:
            print("DLL返回空指针")
            return None
    except Exception as e:
        print(f"调用DLL指针转换失败: {e}")
        return None

def StartBrowser(dll_path, browser_path, port, cache_dir, clear_cache, launch_args, browser_info):

    try:
        # 加载DLL
        dll = ctypes.WinDLL(dll_path)
        
        # 定义函数参数类型
        dll.StartBrowser.argtypes = [
            ctypes.c_char_p,  # 浏览器路径
            ctypes.c_int,     # 端口
            ctypes.c_char_p,  # 缓存目录
            ctypes.c_int,     # 清空缓存
            ctypes.c_char_p,  # 启动参数
            ctypes.c_int      # 浏览器信息
        ]
        dll.StartBrowser.restype = ctypes.c_int
        
        # 调用函数
        result = dll.StartBrowser(
            browser_path.encode('utf-8'),
            port,
            cache_dir.encode('utf-8'),
            clear_cache,
            launch_args.encode('utf-8'),
            browser_info
        )
        
        if result == 0:
            print("浏览器启动成功")
        else:
            print(f"浏览器启动失败,错误码: {result}")
    except Exception as e:
        print(f"调用DLL时发生错误: {e}")

def GetActiveTabID(dll_path, port):
    """
    获取激活标签页ID
    :param dll_path: DLL文件路径
    :param port: 端口
    :return: 激活标签页ID
    """
    try:
        # 加载DLL
        dll = ctypes.WinDLL(dll_path)
        
        # 定义函数参数类型
        dll.GetActiveTabID.argtypes = [
            ctypes.c_int      # 端口
        ]
        dll.GetActiveTabID.restype = ctypes.c_char_p
        
        # 调用函数
        tab_id = dll.GetActiveTabID(port)
        
        if tab_id:
            return tab_id.decode('utf-8')
        else:
            print("获取标签页ID失败")
            return None
    except Exception as e:
        print(f"调用DLL时发生错误: {e}")
        return None

def scrapeAttributesByClass(dll_path, port, tab_id, class_name, attribute_value, context_id):

    try:
        # 加载DLL
        dll = ctypes.WinDLL(dll_path)
        
        # 定义函数参数类型
        dll.scrapeAttributesByClass.argtypes = [
            ctypes.c_int,     # 端口
            ctypes.c_char_p,  # 标签页ID
            ctypes.c_char_p,  # Class名称
            ctypes.c_char_p,  # 属性值
            ctypes.c_int      # 上下文ID
        ]
        dll.scrapeAttributesByClass.restype = ctypes.c_int64
        
        # 调用函数
        result_ptr = dll.scrapeAttributesByClass(
            port,
            tab_id.encode('utf-8'),
            class_name.encode('utf-8'),
            attribute_value.encode('utf-8'),
            context_id
        )
        if result_ptr == 0:
            print("失败");
        else:
            return result_ptr
    except Exception as e:
        print(f"失败: {e}")


if __name__ == "__main__":
    dll_path = "F:\\Python\\jb\\Bt_ChromeFormBot_64.dll"  #dll文件完整的路径
    browser_path = "C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe"
    port = 9200
    cache_dir = "C:\\Temp\\BrowserCache"
    clear_cache = 1
    launch_args = "  https://www.xiaohongshu.com  --no-first-run"
    browser_info = 0
    # 启动浏览器
    StartBrowser(dll_path, browser_path, port, cache_dir, clear_cache, launch_args, browser_info)
    time.sleep(2)
    # 取激活标签页ID
    tab_id = GetActiveTabID(dll_path, port)
    print(tab_id)
    time.sleep(2)
    class_name = "footer"
    attribute_value = "innerText"
    context_id = 0
    if tab_id:
        #调用元素爬虫函数
     int64_ptr =  scrapeAttributesByClass(dll_path, port, tab_id, class_name, attribute_value, context_id)
     text = PointerToText(dll_path,int64_ptr)

     data = json.loads(json.loads(text)["result"]["result"]["value"])
     for idx, item in enumerate(data, start=1):
         print(f"{idx}. {item['textContent']}")








64位dll动态链接库以及Python示例代码下载:
python调用64位Dll爬虫例子.rar (2.52 MB, 下载次数: 1)

签到天数: 11 天

发表于 昨天 09:36 | 显示全部楼层   浙江省宁波市
感谢分享,支持开源!!!
回复 支持 反对

使用道具 举报

签到天数: 10 天

发表于 前天 13:43 | 显示全部楼层   安徽省合肥市
66666666666666666666666666666666666
回复 支持 反对

使用道具 举报

签到天数: 12 天

发表于 前天 09:27 | 显示全部楼层   湖北省鄂州市
感谢分享
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报QQ: 793400750,邮箱:wp@125.la
网站简介:精易论坛成立于2009年,是一个程序设计学习交流技术论坛,隶属于揭阳市揭东区精易科技有限公司所有。
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备2025452707号) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表