python网络爬取个人学习指南-(五)

**************************************************************************************************************

author:keyinfo

date:2025-09-09 23:50

title:网络信息爬取之多联级标题内容点击

**************************************************************************************************************

(到此已经完成可以初步对页面多级链接进行爬取并且写入到文件里面了,接下来可以对防爬措施的绕过和内容再精细化筛选)

对AI的提问:

问:TypeError: 'dict' object is not callable错误
场景 1:误用圆括号 () 访问字典(最常见)
场景 2:变量名与字典类型 dict 重名
场景 3:字典方法调用错误(少了括号或多了括号)
场景 4:函数/变量名与字典混淆
总结:如何避免此错误?
访问字典键时用 [],而非 ():my_dict[key] 或 my_dict.get(key) 。
不要用 dict 作为变量名:避免覆盖内置类型。
区分对象和方法调用:方法调用需加 ()(如 my_dict.keys() ),而对象本身(如字典、列表)不能加 ()。
检查变量类型:如果不确定变量类型,可用 print(type(my_var)) 确认,避免将非函数对象当作函数调用。

源代码经由AI进行调优、添加上注释

核心代码:

代码段1:

        # 提取所有 <a> 标签中的 href 链接 for link in soup.find_all("a"): href = link.get("href") # 过滤无效链接if not href or href.startswith(("#",  "javascript:", "mailto:")):continue # 拼接完整 URL full_url = f"{url.rstrip('/')}/{href.lstrip('/')}" collected_links.append(full_url) 

代码段2:

def save_links_to_file(links, file_path, buffer_size=1000):seen = set()buffer = []# 读取已有链接,防止重复写入try:with open(file_path, "r", encoding="utf-8") as f:seen.update(line.strip()  for line in f)except FileNotFoundError:pass# 处理每个链接for link in links:if link in seen:continueseen.add(link) buffer.append(f"{link}\n") # 缓存满则写入文件if len(buffer) >= buffer_size:with open(file_path, "a", encoding="utf-8") as f:f.writelines(buffer) buffer = []# 写入剩余链接 if buffer:with open(file_path, "a", encoding="utf-8") as f:f.writelines(buffer) 

完整代码:

import time
from urllib.request  import urlopen, Request
from urllib.parse  import urlparse 
from bs4 import BeautifulSoup
from urllib.error  import URLError, HTTPError# 记录程序开始时间
start_time = time.perf_counter() def fetch_url(url, headers, collected_links):try:# 构建请求对象 req = Request(url, headers=headers)# 发起请求并读取响应内容with urlopen(req) as response:content = response.read() status_code = response.getcode() # 使用 BeautifulSoup 解析 HTMLsoup = BeautifulSoup(content, "lxml")# 提取所有 <a> 标签中的 href 链接 for link in soup.find_all("a"): href = link.get("href") # 过滤无效链接if not href or href.startswith(("#",  "javascript:", "mailto:")):continue # 拼接完整 URL full_url = f"{url.rstrip('/')}/{href.lstrip('/')}" collected_links.append(full_url) # 打印成功信息print(f"URL: {url}")print(f"Status: {status_code}")print(f"描述: {'成功' if status_code == 200 else '未知'}")except HTTPError as e:print(f"HTTP 错误: URL={url}, 状态码={e.code},  原因={e.reason}") except URLError as e:print(f"URL 错误: URL={url}, 原因={e.reason}") except Exception as e:print(f"请求失败: {e}")return collected_linksdef extract_base_url(url):parsed = urlparse(url)base_url = f"{parsed.scheme}://{parsed.netloc}" return base_urldef save_links_to_file(links, file_path, buffer_size=1000):seen = set()buffer = []# 读取已有链接,防止重复写入try:with open(file_path, "r", encoding="utf-8") as f:seen.update(line.strip()  for line in f)except FileNotFoundError:pass# 处理每个链接for link in links:if link in seen:continueseen.add(link) buffer.append(f"{link}\n") # 缓存满则写入文件if len(buffer) >= buffer_size:with open(file_path, "a", encoding="utf-8") as f:f.writelines(buffer) buffer = []# 写入剩余链接 if buffer:with open(file_path, "a", encoding="utf-8") as f:f.writelines(buffer) if __name__ == "__main__":# 用户输入input_url = input("请输入网址:")output_path = input("请输入保存路径(例如:./links.txt ):")# 提取基础 URLbase_url = extract_base_url(input_url)# 设置请求头headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36","Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6","Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8","Referer": base_url,"Host": base_url[8:] if base_url.startswith("https://")  else base_url[7:],}# 存储所有链接all_links = [base_url]# 获取页面链接fetch_url(base_url, headers, all_links)# 保存链接到文件save_links_to_file(all_links, output_path)# 打印运行时间end_time = time.perf_counter() print(f"程序共计运行:{end_time - start_time:.4f}秒")

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

RAG - 检索增强生成

第一部分&#xff1a;RAG 详解一、RAG 是什么&#xff1f;RAG&#xff08;Retrieval-Augmented Generation&#xff0c;检索增强生成&#xff09;是一种将信息检索&#xff08;或知识检索&#xff09;与大语言模型&#xff08;LLM&#xff09;的生成能力相结合的技术框架。它的…

大数据毕业设计选题推荐-基于大数据的分化型甲状腺癌复发数据可视化分析系统-Spark-Hadoop-Bigdata

✨作者主页&#xff1a;IT研究室✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Python…

Spring Bean扫描

好的&#xff0c;没有问题。基于我们之前讨论的内容&#xff0c;这是一篇关于 Spring Bean 扫描问题的深度解析博客。Spring Bean扫描作者&#xff1a;Gz | 发布时间&#xff1a;2025年9月9日&#x1f3af; Spring如何找到你的Bean&#xff1f; 首先要理解原理。Spring的组件扫…

【 运维相关】-- HTTP 压测/负载发生器之新秀 oha

目录 oha 项目分析&#xff08;hatoo/oha&#xff09; 一、概述 二、安装 三、快速上手 三、常用参数&#xff08;摘选&#xff09; 四、输出解读&#xff08;终端 TUI&#xff09; 五、与其它工具对比 六、最佳实践 七、注意事项 八、参考 oha 项目分析&#xff08;h…

淘宝闪购基于FlinkPaimon的Lakehouse生产实践:从实时数仓到湖仓一体化的演进之路

摘要&#xff1a;本文整理自淘宝闪购(饿了么)大数据架构师王沛斌老师在 Flink Forward Asia 2025 城市巡回上海站的分享。引言在数字化转型的浪潮中&#xff0c;企业对实时数据处理的需求日益增长。传统的实时数仓架构在面对业务快速变化和数据规模爆炸性增长时&#xff0c;逐渐…

Android应用添加日历提醒功能

功能 在安卓应用里调用系统日历&#xff0c;直接创建一个带提醒的日历事件&#xff0c;甚至不需要跳转到日历界面&#xff0c;只需要获取系统日历的读取权限即可。 需要的权限 在AndroidManifest.xml里添加 <uses-permission android:name"android.permission.READ_CAL…

‌Git Bisect 二分查找定位错误总结

# Git Bisect 二分查找指南## 1. 基本原理&#xff08;ASCII示意图&#xff09; 假设提交历史是一条时间线&#xff0c;Ggood&#xff08;正常&#xff09;&#xff0c;Bbad&#xff08;异常&#xff09;&#xff1a;提交顺序: G --- G --- G --- B --- B --- B | | | 初始正常…

ThingsKit物联网平台 v2.0.0 发布|前端UI重构、底层架构升级

v2.0.0 Release发布日期&#xff1a;2025/08/25 代码标签&#xff1a;v2.0.0_Release&#x1f947; 新增功能国标级联&#xff08;支持上级、下级国标级联&#xff09;视频回放、录像计划&#xff08;用户可以通过录像计划生成对应的视频回放并查看&#xff09;Modbus_TCP协…

Lua > Mac Mini M4安装openresty

Mac Mini M4安装openresty 主要参考 https://www.cnblogs.com/helios-fz/p/15703260.html brew uninstall nginxbrew update brew install pcre openssl #brew install geoip# brew tap openresty/brew # brew install openresty # brew install openresty/brew/openresty# VER…

【多线程案例】:单例模式

多线程案例8.1 单例模式饿汉模式懒汉模式懒汉模式-单线程版懒汉模式-多线程版懒汉模式-多线程版(改进)8.1 单例模式 单个实例. 在一个 java 进程中, 要求指定的类,只能有唯–个实例。&#xff08;尝试 new 多个实例的时候, 就会直接编译报错&#xff09; 单例模式是校招中最常…

【Python/Pytorch】-- 贝叶斯定理

文章目录 文章目录01 贝叶斯定理的理解02 在MRI重建领域应用01 贝叶斯定理的理解 贝叶斯定理的基本公式&#xff1a;P(A|B)P(B|A)*P(A) / P(B) 首先是如何理解这个公式&#xff1f; 在B事件发生的条件下&#xff0c;A发生的概率 P(A|B) 在B事件发生的条件下&#xff0c;A和B同…

子网掩码的隐形陷阱:为何能ping通却无法HTTPS访问

问题现象深度解析在近期企业网络维护中&#xff0c;运维团队发现一个具有教学意义的典型案例&#xff1a;某台部署在10.165.111.0/24网段的业务服务器&#xff08;10.165.111.71&#xff09;可以成功ping通目标中间件主机(10.165.110.11)&#xff0c;但通过HTTPS协议访问https:…

【ArcGIS】如何编辑图层的属性表

GIS按属性选择后删除所选项呈现灰色_arcgis删除字段灰色-CSDN博客

大数据各组件flume,datax,presto,DolphinScheduler,findBI在大数据数仓架构中的作用和功能。

一、数据仓库核心价值铺垫在讲具体技术前&#xff0c;先明确数据仓库&#xff08;Data Warehouse&#xff0c;简称数仓&#xff09; 的核心作用&#xff1a; 数据仓库是 “整合企业多源数据、按业务主题组织、支持决策分析” 的结构化数据存储体系&#xff0c;核心价值是打破数…

React From表单使用Formik和yup进行校验

一、Formik的使用 官方文档地址&#xff1a;https://formik.org/docs/tutorial#validation 首先安装依赖 yarn add formik2.导入并初始化 import { useFormik } from formik; initialValues&#xff1a;初始化 输入框的密码和账号 onSubmit&#xff1a;当点击提交按钮时&am…

netty-scoket.io路径配置

1、服务端代码 package com.yh.service.socket;import com.corundumstudio.socketio.SocketIOServer; import com.corundumstudio.socketio.store.RedissonStoreFactory; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory…

20250910荣品RD-RK3588-MID开发板在Android13系统下解决点卡迪的屏闪屏的问题

20250910荣品RD-RK3588-MID开发板在Android13系统下解决点卡迪的屏闪屏的问题 2025/9/5 15:44缘起&#xff1a;荣品RD-RK3588-MID开发板在Android13系统下解决点卡迪的屏。 按 POWER按键 关机之后&#xff0c;2s之内再次短按 POWER按键&#xff0c;开机之后屏会抖动。 2s后短按…

正态分布 - 计算 Z-Score 的 无偏估计

正态分布 - 计算 Z-Score 的 无偏估计 flyfish Z-Score公式与计算步骤 1 公式&#xff08;样本Z-Score&#xff09; 实际应用中&#xff0c;我们几乎不知道“总体均值/标准差”&#xff0c;所以常用样本数据计算&#xff1a; zixi−xˉsz_i \frac{x_i - \bar{x}}{s}zi​sxi​−…

ai生成文章,流式传输(uniapp,微信小程序)

1.环境nutui-uniappvue3tsunocss2.功能源码包含ai生成逻辑&#xff0c;内容生成实时打字机功能&#xff0c;ai数据处理等<script setup lang"ts"> import {queryAIParams, } from /api/pagesA import { submitFn } from /api/aiimport Navbar from /component…

Linux设备内存不足如何处理

[rootlocalhost ~]# free -mtotal used free shared buff/cache available Mem: 31208 14317 1280 1551 15610 14657 Swap: 15927 2781 13146 [rootlocalhost ~]#从 free -m 输出来看&…