Python武器库开发-武器库篇之链接提取器(六十)

Python武器库开发-武器库篇之链接提取器(六十)

链接提取器介绍

链接提取器(Link Extractor)是一种用于从网页中提取链接的工具。它可以从网页的源代码中识别出所有的链接,并将这些链接提取出来。链接提取器可以用于各种目的,例如抓取网页数据、建立网站地图、搜索引擎优化等。

链接提取器通常使用正则表达式或HTML解析器来识别和提取链接。正则表达式是一种强大的模式匹配工具,它可以根据特定的模式来匹配和提取字符串。HTML解析器可以解析网页的HTML代码,并从中提取出链接。

链接提取器可以提取各种类型的链接,包括文本链接、图片链接、音视频链接等。它可以提取出绝对链接(包含完整的URL)和相对链接(相对于当前网页的URL)。

使用链接提取器可以简化从网页中提取链接的过程,并提高提取链接的效率。它可以帮助我们快速获取所需的链接,并进行后续的处理和分析。

链接提取器代码实现

接下来我们就用python开发一段 链接提取器,代码内容如下:

#!/usr/bin/env python

from functools import total_ordering
import requests
from bs4 import BeautifulSoup
from urllib.parse import urljoin, urlparse
import logging

# 内链
internal_urls = set()
# 外链
external_urls = set()
total_urls_visited = 0


def is_valid(url):
    # 检查url
    # 协议(scheme) 网络位置(netloc) 路径(path)查询参数(query)
    parsed = urlparse(url)
    loc = bool(parsed.netloc)
    sche = bool(parsed.scheme)
    return loc and sche


def get_all_website_links(url):
    urls = set()
    # 提取域名,用来判断是外链还是内链
    domain_name = urlparse(url).netloc
    soup = BeautifulSoup(requests.get(url).content, "lxml")
    # 获取所有的a标签
    for a_tag in soup.find_all("a"):
        href = a_tag.attrs.get("href")
        if not href or href == "":
            continue
        href = urljoin(url, href)
        # 剔除get请求后面的参数
        parsed_href = urlparse(href)
        href = parsed_href.scheme + "://" + parsed_href.netloc + parsed_href.path  # 后面的get参数给过滤掉了
        if not is_valid(href) or href in internal_urls:
            continue
        # 判断是否为外链
        if domain_name not in href:
            print(f"外部链接:{href}")
            external_urls.add(href)
            continue
        print(f"内部链接:{href}")
        urls.add(href)
        internal_urls.add(href)
    return urls


# 递归
def crawl(url, max_url=15):
    global total_urls_visited
    total_urls_visited += 1
    print(f"正在爬取:{url}")
    links = get_all_website_links(url)
    for link in links:
        if total_urls_visited > max_url:
            break
        crawl(link, max_url=max_url)


if __name__ == "__main__":
    url = "https://www.baidu.com/"
    crawl(url=url, max_url=30)
    domain_name = urlparse(url).netloc
    print("总内部连接数为:", len(internal_urls))
    print("总外部连接数为:", len(external_urls))

    with open(f"{domain_name}的内部链接.txt", "w") as f:
        for internal_url in internal_urls:
            print(internal_url.strip(), file=f)

    with open(f"{domain_name}的外部链接.txt", "w") as f:
        for external_url in external_urls:
            print(external_url.strip(), file=f)

代码逻辑分析

这段代码是一个简单的网页爬虫,用于爬取指定网页的内部链接和外部链接。

首先,在代码中导入了一些必要的模块,包括functoolsrequestsbs4urllib.parselogging

然后,定义了一些全局变量,包括内链集合internal_urls、外链集合external_urls和已访问的链接总数total_urls_visited

接下来,定义了一个is_valid函数,用于检查一个链接是否合法。函数中使用urlparse对链接进行解析,判断是否具有有效的网络位置(netloc)和协议(scheme)。

然后,定义了一个get_all_website_links函数,用于获取指定网页的所有链接。函数中使用urlparse获取域名,然后使用requests.get获取网页内容,再使用BeautifulSoup对网页进行解析。然后,遍历所有的<a>标签,提取href属性,并进行一系列处理,包括合并相对链接为绝对链接、剔除链接中的查询参数等。最后,判断链接是否合法,以及是内链还是外链,将链接分别添加到内链集合和外链集合中,并返回所有的链接。

接下来,定义了一个递归函数crawl,用于递归爬取链接。函数中先增加已访问的链接总数,并打印正在爬取的链接。然后,调用get_all_website_links函数获取链接,并遍历链接,递归调用crawl函数。当已访问的链接总数超过指定的最大链接数时,跳出循环。

最后,在main函数中,指定要爬取的初始链接和最大链接数,并调用crawl函数进行爬取。最后,输出总内部链接数和总外部链接数,并将内链集合和外链集合分别写入文件中。

运行效果图

如下是我们这串代码的实际运行效果图:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/719997.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

如何设置透明加密保护系统呢

设置透明加密保护系统通常涉及多个步骤&#xff0c;以下是一个基于参考文章信息和一般实践经验的清晰设置流程&#xff0c;包括分点表示和归纳&#xff1a; www.weaem.com 1. 需求分析 确定加密目标&#xff1a;明确需要加密的文件类型、存储位置和使用环境。评估安全风险&…

SQL Server 触发器

触发器是一种存储数据库过程&#xff0c;当数据库中发生特定事件&#xff08;如插入、更新或删除操作&#xff09;时&#xff0c;会自动调用该触发器。审核SQL Server实例的方法有很多&#xff0c;其中一种方法是使用审核触发器&#xff0c;触发器在SQL Server数据库中扮演着关…

AI发展面临的问题? —— AI对创造的重新定义

一、AI的问题描述 AI与数据安全问题&#xff1a;随着AI技术的发展和应用&#xff0c;数据安全问题日益突出。AI模型训练依赖于大量数据&#xff0c;而这些数据中可能包含个人隐私、商业秘密等敏感信息。如果数据在采集、存储、使用过程中处理不当&#xff0c;可能导致数据泄露或…

Vulnhub——AI: WEB: 2

渗透复现 &#xff08;1&#xff09;平台框架存在目录穿越漏洞&#xff0c;利用该漏洞读取敏感信息 &#xff08;2&#xff09;Ping功能点绕过&#xff0c;进行命令执行操作&#xff0c;反弹shell无果后&#xff0c;利用目录穿越漏洞遍历敏感API&#xff0c;读取到用户SSH登录…

自动统计一个学科领域中总共有多少研究者

问题&#xff1a;怎么知道一个学科领域中总共有多少研究者&#xff1f; 方法&#xff1a;学者的谷歌学术主页中会有对应的领域&#xff0c;以进化计算为例&#xff0c;进入一位进化计算学者的谷歌主页&#xff0c;然后进入标签“Evolutionary Computation”&#xff0c;只要知…

JavaScript日期处理:常见问题与解决方案

JavaScript中的日期处理是一个常见但有时又令人头疼的任务。在这篇博客文章中&#xff0c;我将分享一些在JavaScript中处理日期时遇到的常见问题以及它们的解决方法。 日期格式化 1.1 日期格式&#xff1a;yyyy-MM-dd formatDate() {var value new Date()var year value.g…

【系统架构设计师】二、操作系统知识(操作系统概述|进程管理)

目录 一、操作系统概述 1.1 操作系统定义 1.2 操作系统的功能 1.3 操作系统的分类 1.4 嵌入式操作系统主要特点 二、进程管理 2.1 进程的组成与状态 2.2 前趋图 2.3 进程资源图 2.4 进程调度 2.5进程调度算法 2.6 死锁 2.7 进程与线程 2.7.1 进程 2.7.2 线程 2…

RabbitMQ 相关概念

引言 什么是消息中间件 消息是指在应用间传送的数据&#xff0c;包含文本字符串、JSON等。消息队列中间件&#xff08;MQ&#xff09;指利用高效可靠的消息传递机制进行平台无关的数据交流&#xff0c;并基于数据通信来进行分布式系统的集成。通过提供消息传递和消息排队模型…

Part 4.4 树形动态规划

树形动态规划&#xff0c;即在树上进行的动态规划。 因为树的递归性质&#xff0c;树形动态规划一般都是递归求解的。 没有上司的舞会 题目描述 某大学有 n n n 个职员&#xff0c;编号为 1 … n 1\ldots n 1…n。 他们之间有从属关系&#xff0c;也就是说他们的关系就像…

swagger手动添加cookies信息、浏览器中手动添加cookies信息

在实际项目使用中&#xff0c;我们可能需要把登录token放到cookies中&#xff0c;请求时从cookies中获取token值&#xff0c;以此校验用户登录信息&#xff0c;以下整理一下怎么在cookies中手动添加数据。 操作步骤如下&#xff1a; (1)&#xff1a;F12打开调试工具&#xff…

CP AUTOSAR标准之LargeDataCOM(AUTOSAR_CP_SWS_LargeDataCOM)

1 简介和功能概述 该规范描述了AUTOSAR基础软件模块LdCom的功能、API和配置。   在AUTOSAR分层架构中,AUTOSAR LdCom模块位于RTE/SwCluC_LdComProxy和PDU路由之间,参见[1,EXP LayeredSoftwareArchitecture]。   AUTOSAR LdCom模块提供了一种替代的交互层机制。通过专注于…

Python函数与模块知识点

函数 变量作用域 匿名函数 内置函数 递归函数 思维导图 global关键字 在 Python 中&#xff0c;如果你在函数内部想要修改一个全局变量的值&#xff0c;你需要使用 global 关键字来声明这个变量。 python x 10 # 全局变量def change_x(): global x # 声明 x 是全局变量 x 20 …

算法课程笔记——单调栈单调队列

算法课程笔记——单调栈&单调队列

解锁应用新技能:Xinstall助力快速获取H5信息,轻松提升用户体验

在移动互联网时代&#xff0c;数据是驱动应用发展的关键。对于许多开发者来说&#xff0c;如何高效、准确地获取H5信息成为了一个不小的挑战。今天&#xff0c;我们为大家介绍一款强大的工具——Xinstall&#xff0c;它将帮助你轻松解决这一难题&#xff0c;让你的应用数据获取…

Jacob调用Windows桌面软件(Adobe系列,CAD,ABBYY FineReader 等)

参考资料 jacob调用adobe动态库https://blog.csdn.net/love_5209/article/details/19162185 python查看查看 COM 组件的 ProgID 或 CLSID 对应的字符串参数https://blog.51cto.com/u_16175517/10484354加载动态库示例https://baijiahao.baidu.com/s?id=1777971964908285215&…

在Spring Boot中使用Sa-Token实现路径拦截和特定接口放行

在Spring Boot中使用Sa-Token实现路径拦截和特定接口放行 很喜欢的一段话&#xff1a;别想太多&#xff0c;好好生活&#xff0c;也许日子过着过着就会有答案&#xff0c;努力走着走着就会有温柔的着落。 春在路上&#xff0c;花在枝上&#xff0c;所有的美好都在路上&#xff…

【STM32】使用标准库创建一个工程

创建工程 本系列文章中使用的硬件和软件版本如下&#xff1a; CPU型号&#xff1a;STM32F407ZGT6 Keil版本&#xff1a;V5.38.0.0 ARM编译器版本&#xff1a;V5.06 标准库版本&#xff1a;V1.8.0 1.下载标准库 官网链接&#xff1a;STSW-STM32065 - STM32F4 DSP和标准外…

AI金融投资:批量下载巨潮资讯基金招募说明书

打开巨潮资讯的基金招募说明书页面&#xff1a; http://www.cninfo.com.cn/new/fulltextSearch/full?searchkey%E5%B0%81%E9%97%AD%E5%BC%8F%E5%9F%BA%E7%A1%80%E8%AE%BE%E6%96%BD%E8%AF%81%E5%88%B8%E6%8A%95%E8%B5%84%E5%9F%BA%E9%87%91%E6%8B%9B%E5%8B%9F%E8%AF%B4%E6%98%…

智慧校园综合解决方案:提供全方位的学校管理支持

在当今数字化时代&#xff0c;学校管理面临着越来越多的挑战&#xff0c;包括学生管理、教职员工管理、校园安全等。为了应对这些挑战&#xff0c;智慧校园综合解决方案应运而生。智慧校园综合解决方案融入了先进的信息技术&#xff0c;为学校带来了一场管理与教育模式的革新。…

主流电商平台API接口【京东商品详情按关键字搜索商品按图搜索京东商品(拍立淘)获得店铺的所有商品】

主流电商平台商品接口在电商企业中的应用可以帮助企业实现信息同步、库存管理、订单处理、数据分析和营销推广等多重功能&#xff0c;提升运营效率、优化用户体验&#xff0c;进而推动业务增长。 jd API 接入说明 API地址:申请调用KEY地址 调用示例&#xff1a; 参数说明 通用…