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

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

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

链接提取器介绍

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

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

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

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

链接提取器代码实现

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

#!/usr/bin/env pythonfrom 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 = 0def is_valid(url):# 检查url# 协议(scheme) 网络位置(netloc) 路径(path)查询参数(query)parsed = urlparse(url)loc = bool(parsed.netloc)sche = bool(parsed.scheme)return loc and schedef get_all_website_links(url):urls = set()# 提取域名,用来判断是外链还是内链domain_name = urlparse(url).netlocsoup = 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 == "":continuehref = 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)continueprint(f"内部链接:{href}")urls.add(href)internal_urls.add(href)return urls# 递归
def crawl(url, max_url=15):global total_urls_visitedtotal_urls_visited += 1print(f"正在爬取:{url}")links = get_all_website_links(url)for link in links:if total_urls_visited > max_url:breakcrawl(link, max_url=max_url)if __name__ == "__main__":url = "https://www.baidu.com/"crawl(url=url, max_url=30)domain_name = urlparse(url).netlocprint("总内部连接数为:", 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函数进行爬取。最后,输出总内部链接数和总外部链接数,并将内链集合和外链集合分别写入文件中。

运行效果图

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

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

相关文章:

  • 【跟我学RISC-V】(三)openEuler特别篇
  • 园区无线网新架构:无CAPWAP的集中式转发
  • 一文详解:什么是小程序SDK?
  • java1.8运行arthas-boot.jar运行报错解决
  • 编程属于什么类学科门类:深入探索与解析
  • PDM 测试
  • idea自定义注释模板
  • Github 2024-06-15Rust开源项目日报Top10
  • 77道经典的软件测试面试题(答案+文档)
  • Windows Server 远程桌面显示登录界面而不是直接登录进入的问题
  • [Cloud Networking] Layer3 (Continue)
  • CCAA质量管理【学习笔记】​​ 备考知识点笔记(五)质量设计方法与工具
  • Tomcat Websocket应用实例研究
  • 使用高斯混合模型(GMM)进行猫狗音频聚类(Kaggle Audio Cats and Dogs)
  • requests post json/data;requests response 接收不同数据
  • 【RocksDB】TransactionDB源码分析
  • express.js的介绍及使用
  • Java到底能干嘛?
  • leetcode378. Kth Smallest Element in a Sorted Matrix
  • magento2项目上线注意事项
  • React+TypeScript入门
  • 从 Android Sample ApiDemos 中学习 android.animation API 的用法
  • 关于extract.autodesk.io的一些说明
  • 如何优雅的使用vue+Dcloud(Hbuild)开发混合app
  • 使用阿里云发布分布式网站,开发时候应该注意什么?
  • 文本多行溢出显示...之最后一行不到行尾的解决
  • 【云吞铺子】性能抖动剖析(二)
  • Unity3D - 异步加载游戏场景与异步加载游戏资源进度条 ...
  • ​第20课 在Android Native开发中加入新的C++类
  • ​如何在iOS手机上查看应用日志
  • #565. 查找之大编号
  • (10)工业界推荐系统-小红书推荐场景及内部实践【排序模型的特征】
  • (2/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序
  • (3)选择元素——(14)接触DOM元素(Accessing DOM elements)
  • (Spark3.2.0)Spark SQL 初探: 使用大数据分析2000万KF数据
  • (动态规划)5. 最长回文子串 java解决
  • (二)PySpark3:SparkSQL编程
  • (附源码)node.js知识分享网站 毕业设计 202038
  • (函数)颠倒字符串顺序(C语言)
  • (剑指Offer)面试题41:和为s的连续正数序列
  • (四)docker:为mysql和java jar运行环境创建同一网络,容器互联
  • (五) 一起学 Unix 环境高级编程 (APUE) 之 进程环境
  • (一)C语言之入门:使用Visual Studio Community 2022运行hello world
  • (一)为什么要选择C++
  • (原創) 如何優化ThinkPad X61開機速度? (NB) (ThinkPad) (X61) (OS) (Windows)
  • (转)scrum常见工具列表
  • .360、.halo勒索病毒的最新威胁:如何恢复您的数据?
  • .bat批处理(二):%0 %1——给批处理脚本传递参数
  • .htaccess配置重写url引擎
  • .NET 8 中引入新的 IHostedLifecycleService 接口 实现定时任务
  • .Net Core缓存组件(MemoryCache)源码解析
  • .NET 的静态构造函数是否线程安全?答案是肯定的!
  • .net 获取某一天 在当月是 第几周 函数
  • .Net 执行Linux下多行shell命令方法
  • .Net中的设计模式——Factory Method模式