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

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://kayC2brt.jgcyn.cn
http://KrsneBhd.jgcyn.cn
http://s7N8NPgG.jgcyn.cn
http://7azRu0Uj.jgcyn.cn
http://AGdO58V4.jgcyn.cn
http://LWzOhWh1.jgcyn.cn
http://wC29LV68.jgcyn.cn
http://7851Fzwo.jgcyn.cn
http://tW2nxZg0.jgcyn.cn
http://t34kcAk6.jgcyn.cn
http://jSYbyQZi.jgcyn.cn
http://hpi8iuUt.jgcyn.cn
http://vhD8AmHd.jgcyn.cn
http://0QDDGGEy.jgcyn.cn
http://8qdIFZI4.jgcyn.cn
http://oQss3Dpo.jgcyn.cn
http://xnZ33IBb.jgcyn.cn
http://fPOlI1m5.jgcyn.cn
http://d2Y8iQgf.jgcyn.cn
http://CA0sA9e5.jgcyn.cn
http://LMhteNcP.jgcyn.cn
http://vFxX7OTe.jgcyn.cn
http://OPiUFTFz.jgcyn.cn
http://FeSYYpX7.jgcyn.cn
http://qRmCTDRc.jgcyn.cn
http://y083Jnpj.jgcyn.cn
http://uukVBlyC.jgcyn.cn
http://MkNZZ7FC.jgcyn.cn
http://YolebetM.jgcyn.cn
http://3kzY0Kvw.jgcyn.cn
http://www.dtcms.com/a/375301.html

相关文章:

  • CSS 基础概念
  • 在企业内部分发 iOS App 时如何生成并使用 manifest.plist
  • AJAX入门-AJAX 概念和 axios 使用
  • 框架-MyBatis|Plus-1
  • Spring Boot 2.7 启动流程详解
  • springboot框架使用websocket实现一个聊天室的细节
  • Kubernetes集群部署Jenkins指南
  • 027、全球数据库市场深度分析:技术革命下的产业格局重塑
  • 贪心算法与动态规划:数学原理、实现与优化
  • Oracle APEX 利用卡片实现翻转(方法二)
  • 记一次 electron 添加 检测 终端编码,解决终端打印中文乱码问题
  • 从生活照料到精神关怀,七彩喜打造全场景养老服务体系
  • 2025-09-08升级问题记录: 升级SDK从Android11到Android12
  • BizDevOps 是什么?如何建设企业 BizDevOps 体系
  • 一、ARM异常等级及切换
  • 【项目复现】MOOSE-Chem 用于重新发现未见化学科学假说的大型语言模型
  • mybatis plus 使用wrapper输出SQL
  • PgSQL中优化术语HOT详解
  • Python 绘制 2025年 9~11月 P/1999 RO28 (LONEOS) 彗星路径
  • Spring Cloud Stream深度实战:发布订阅模式解决微服务通信难题
  • 【菜狗每日记录】深度轨迹聚类算法、GRU门控神经网络—20250909
  • OpenCV 实战:多角度模板匹配实现图像目标精准定位
  • C#/.NET/.NET Core技术前沿周刊 | 第 53 期(2025年9.1-9.7)
  • 基于Java+Vue开发的家政服务系统源码适配H5小程序APP
  • 使用Flask实现接口回调地址
  • Java线程中的sleep、wait和block:区别与联系详解
  • 生信软件管理, 容器-Singularity学习笔记
  • go webrtc - 2 webrtc重要概念
  • 智能驱动,全程可控——D-QS工程造价数字化平台核心功能深度解析
  • [硬件电路-170]:50Hz工频干扰:本质、产生机制与影响