智能,轻量,高效的爬虫工具 (爬虫宝第一代), HSpider

news/2024/7/19 9:24:17 标签: 爬虫, python, 人工智能

场景

之前玩爬虫宝一时爽,但是我很快发现了一个致命的问题。就是chat3.5 有时候误判,Claude2 是遇到大一点的html就无法解析,chat4 Api没有申请下来,chat3.5 误判这个可以纠正,但是每次爬取花费的钱都是2刀以上,我定义了一个任务,结果一晚上跑了我好几十刀(忘记设置限额了,被自己蠢哭了),心疼,所以我要把部分功能剥离出来,先提供一个先行版,做成HSpider(后续可能要改名)以供使用。

HSpider

语言: python
涉及: 自动化 + html解析
原理: 自动化 + html解析

HSpider是一个基于Python的工具,简单,强大,智能,易用,用于在HTML文档中查找并分析特定文本的出现。它利用了BeautifulSoup库的功能来解析HTML内容,并结合正则表达式来定位特定的文本。以下是这个类实现的大致原理,详细解释其工作方式和各个组件的角色:

BeautifulSoup和HTML解析

BeautifulSoup是一个流行的Python库,用于解析HTML和XML文档。它能够将复杂的HTML文档转换成一个易于操作的Python对象结构。每个HTML标签都被转换为BeautifulSoup的Tag对象,这些对象可以用来访问标签的名称、属性和内容。此外,BeautifulSoup还提供了丰富的方法和属性来遍历和搜索文档树。

正则表达式与文本搜索

正则表达式是一种强大的文本匹配工具,它允许定义复杂的搜索模式。在TextFinder类中,正则表达式用于创建一个模式,该模式能够匹配用户指定的文本。通过将用户的文本转换为一个正则表达式模式,类能够在HTML内容中查找完全或部分匹配的文本字符串。

查找包含特定文本的元素

TextFinder类的核心功能之一是找到包含用户指定文本的最小HTML元素。为此,它遍历文档中的每个元素,并使用之前构建的正则表达式模式来检查元素的文本内容。如果一个元素的文本内容与模式匹配,类会进一步检查该元素的所有子元素,以确保找到的元素是包含指定文本的最小单位。

获取元素的层级结构

类中的另一个重要功能是能够提供指定元素在HTML文档中的层级结构。这是通过从目标元素开始,逐级向上遍历其父元素来实现的。在这个过程中,每个元素的标签名和属性都被记录下来。这样可以得到一个从根元素到目标元素的路径,这对于理解元素在整个文档中的上下文非常有帮助。

日志记录

使用Python的内置日志模块来记录关键的信息和警告。这对于调试和追踪类的行为非常有用。日志记录可以帮助开发者理解类的工作流程,以及在处理特定HTML文档时遇到的任何问题。

用户友好的接口

提供了一个简单易用的接口,使得用户可以轻松地将其集成到自己的项目中。通过几个简单的方法调用,用户可以执行复杂的HTML解析和文本搜索任务。这使得类不仅对有经验的开发者有用,对那些不太熟悉HTML解析或正则表达式的用户也同样有用。

示例用法

记录规则,例如:你要爬取所有的亚马逊产品的标题和售价,search_text 就是标题名 / 售价名,而test.html则是 页面的html,element_hierarchy 就是生成的规则,你需要保存下来.。

python">if __name__ == "__main__":
    # 读取HTML内容
    with open('/test.html', 'r', encoding='utf-8') as file:
        html_content = file.read()
    # 实例化TextFinder
    finder = TextFinder(html_content)
    # 搜索文本
    search_text = "Material"
    # 找到包含该文本的元素
    element = finder.find_element_with_text(search_text)
    element_hierarchy = finder.get_element_hierarchy(element)
	element_hierarchy 

规则的使用

python"># 示例用法
if __name__ == "__main__":
    # ... (之前的代码保持不变)

    # 层级关系的JSON数据
    json_hierarchy = '''
    [
        {"tag": "div", "attributes": {"id": "centerCol"}},
        {"tag": "div", "attributes": {"id": "productOverview_feature_div"}},
        {"tag": "div", "attributes": {"class": ["a-section", "a-spacing-small", "a-spacing-top-small"]}},
        {"tag": "table", "attributes": {"class": ["a-normal", "a-spacing-micro"]}},
        {"tag": "tr", "attributes": {"class": ["a-spacing-small", "po-material"]}},
        {"tag": "td", "attributes": {"class": ["a-span3"]}},
        {"tag": "span", "attributes": {"class": ["a-size-base", "a-text-bold"]}}
    ]
    '''

    # 根据层级关系找到元素
    found_element = finder.find_element_by_hierarchy(json_hierarchy)
    if found_element:
        print("Found Element:", finder.get_element_details(found_element))
    else:
        print("Element not found.")

这样你就可以根据规则拿到别的页面的元素了。使用自动化工具(针对反爬网址)或者 请求(没有1设置反爬的网站) 拿到html 然后去匹配规则即可。

开源时间

预计在2024-01-08日左右开源。欢迎大家到时候使用!

注: 不需要翻墙和付费(AI付费),届时放心食用。


http://www.niftyadmin.cn/n/5288280.html

相关文章

算法训练第四十八天|198. 打家劫舍、213. 打家劫舍 II、337. 打家劫舍 III

198. 打家劫舍: 题目链接 你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报…

Oracle中null值和空字符串的坑

思考 今天在学习oracle数据库的过程中,发现当对字段进行约束,默认空字符串时,出现报错 --创建employees表 CREATE TABLE employees (id NUMBER,name VARCHAR2(100) ); --对表新增email列,添加约束默认空字符串并且非空 ALTER …

php 不加后缀访问

实现不带后缀访问php文件的方法:首先在htaccess文件中加入内容“RewriteRule ^(api/token) token.php [L]”;然后通过根目录下的“token.php”来接受“api/token”;最后修改配置文件。 考虑的做法有: HTTP重写技术,让…

STM32的DHT11

DHT11基础 DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传 感器。它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有极高 的可靠性与卓越的长期稳定性。传感器包括一个电阻式感湿元件和一个NTC测 温元件,并与一个高性能…

神经网络:模型部署

【一】模型压缩的必要性与可行性? 模型压缩是指对算法模型进行精简,进而得到一个轻量且性能相当的小模型,压缩后的模型具有更小的结构和更少的参数,可以有效降低计算和存储开销,便于部署在端侧设备中。 随着AI技术的…

设计模式之-迭代器模式,快速掌握迭代器模式,通俗易懂的讲解迭代器模式以及它的使用场景

文章目录 一、快速理解迭代器模式二、迭代器模式的使用场景三、示例代码 一、快速理解迭代器模式 迭代器模式是一种行为型设计模式,它用于提供一种顺序访问聚合对象中各个元素的方法,而又不暴露该对象的内部表示。通过使用迭代器模式,我们可…

C++ std::string使用效率优化

字符串操作是任何一个C开发程序无法绕过的点,很多时候针对字符串的操作需要进行优化,从而达到更优的使用效率和内存利用率。一般会采用标准的std::string替代C字符串,一方面是std::string为一个成熟的类对象,其成员操作基本能满足…

MongoDB数字字符串排序问题

问题描述 MongoDB中有一个集合t_test_sort结构如下,其中数值字段value为字符串类型,现想按照value的数值大小进行降序排列。 {"_id" : ObjectId("656c87b36ca8100cd4a60348"),"name" : "麻了","date&quo…