请求优化:提取页面链接并校验域名的Python脚本
Python页面链接分类脚本优化指导
原脚本存在的问题
- 文件操作错误:每次循环用
w模式打开文件会清空之前内容,最终仅保留最后一个页面的结果;且未正确关闭文件,易引发资源泄漏。 - 遍历方式冗余:用
range(len(urls))遍历列表,不如直接遍历URL元素简洁。 - 链接校验逻辑错误:正则表达式含多余空格导致匹配失效;未处理
href为空的情况,会触发AttributeError;每个链接都判断并写入文件,导致同一页面被重复写入多次。 - 域名校验不可靠:正则匹配域名不够严谨,无法处理带http/https前缀、相对链接等场景。
优化后的脚本
import requests from bs4 import BeautifulSoup from urllib.parse import urlparse # 指定需要校验的域名集合(保留域名部分,无需协议前缀) ALLOWED_DOMAINS = {'x.com', 'www.x.com', 'y.com', 'www.y.com'} TARGET_URLS = ['https://www.rose.com', 'https://www.pink.com'] # 用with语句自动管理文件,避免资源泄漏 with open('links_good.txt', 'w', encoding='utf-8') as good_file, \ open('links_need_update.txt', 'w', encoding='utf-8') as update_file: for page_url in TARGET_URLS: try: # 添加超时设置,捕获HTTP请求异常 response = requests.get(page_url, timeout=10) response.raise_for_status() except requests.exceptions.RequestException as e: print(f"访问页面 {page_url} 失败: {e}") update_file.write(f"{page_url}\n") continue soup = BeautifulSoup(response.text, 'html.parser') has_valid_link = False for a_tag in soup.find_all('a'): href = a_tag.get('href') if not href: continue # 跳过无href属性的a标签 # 解析链接,处理相对链接与绝对链接 parsed_href = urlparse(href) if not parsed_href.netloc: # 相对链接,用当前页面的域名补充 parsed_page = urlparse(page_url) domain = parsed_page.netloc else: domain = parsed_href.netloc # 检查域名是否在允许集合中 if domain in ALLOWED_DOMAINS: has_valid_link = True break # 找到有效链接后停止遍历 # 按页面状态写入对应文件 if has_valid_link: good_file.write(f"{page_url}\n") else: update_file.write(f"{page_url}\n")
优化关键点说明
- 文件管理:通过
with语句自动处理文件的打开与关闭,避免资源泄漏;提前用w模式打开文件,确保每次运行清空旧数据,写入新结果。 - 请求健壮性:添加超时设置和异常捕获,处理页面访问失败的情况,防止脚本崩溃。
- 链接解析:用
urlparse专业解析链接,正确提取相对链接、绝对链接的域名,比正则匹配更可靠。 - 逻辑修正:对每个页面仅做一次状态判断,只要存在一个指定域名的链接就标记为有效,避免同一页面重复写入。
- 可读性提升:用变量名替代魔法值,便于后续修改域名或目标URL列表。
内容的提问来源于stack exchange,提问作者rangynj
相关产品推荐
相关产品推荐

