Python嵌套URL爬取公园信息及联系电话代码问题排查
公园信息爬虫问题修复
需求说明:第一阶段爬虫已实现公园名称、详情页链接的抓取,现需从公园详情页中提取联系电话,整合所有字段后统一输出,对现有代码的问题排查和修复如下:
现存代码问题清单
- 详情页请求参数错误:
requests.get(link)直接传入BeautifulSoup定位到的Tag对象,未提取href属性值作为请求URL,且未调用.text获取响应源码,会直接触发请求报错 - 解析对象混用:查找详情页联系电话模块时,误用了列表页的
soup对象,没有使用详情页对应的soup2,根本无法定位到详情页的电话元素 - 字段提取不完整:
state字段仅获取到标签对象,没有提取标签内的文本内容,输出时会显示标签结构而非实际州名 - 电话匹配规则无效:匹配电话链接的正则表达式为空,无法精准识别
tel:开头的电话链接;且循环内反复覆盖phone_number变量,无匹配值时会触发变量未定义报错 - 缺少异常兼容:定位元素时没有做空值判断,遇到页面结构缺失的条目会直接触发AttributeError导致整个爬虫中断
修复后完整代码
from bs4 import BeautifulSoup import requests import re def get_parknames(): # 添加请求头模拟浏览器访问,降低被反爬拦截概率 headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36" } html_text = requests.get('http://www.jump-parks.com/en/trampoline-parks/usa/', headers=headers).text soup = BeautifulSoup(html_text, 'lxml') parks = soup.find_all('div', class_='grid__item') for park in parks: # 提取基础字段,增加空值判断避免解析报错 park_name_tag = park.find('h3', class_='card__title') park_name = park_name_tag.text.strip() if park_name_tag else "未获取到名称" state_tag = park.find('span', class_="address__country_long") state = state_tag.text.strip() if state_tag else "未获取到州信息" country_tag = park.find('span', {'itemprop': 'addressCountry'}) country = country_tag.text.strip() if country_tag else "未获取到国家信息" link_tag = park.find('a', attrs={'href': re.compile("^https://")}) if not link_tag: print(f"公园{park_name}无有效详情页链接,跳过") continue park_link = link_tag['href'] # 请求详情页提取电话,增加异常捕获 phone_number = "未获取到联系电话" try: html_text2 = requests.get(park_link, headers=headers, timeout=10).text soup2 = BeautifulSoup(html_text2, 'lxml') # 修正解析对象为详情页soup2,匹配tel协议的电话链接 phones = soup2.find_all('div', class_='single-meta') for phone in phones: phone_tag = phone.find('a', attrs={'href': re.compile("^tel:")}) if phone_tag: phone_number = phone_tag.text.strip() break except Exception as e: phone_number = f"详情页请求失败" # 统一格式化输出 print(f''' Park Name: {park_name} State: {state} Country: {country} Link: {park_link} Phone: {phone_number} ''') if __name__ == '__main__': get_parknames()
修复要点
- 所有字段提取环节增加空值判断,单条条目解析失败不会中断整个爬虫任务
- 修正了详情页请求、解析的对象错误,电话匹配规则调整为匹配
tel:协议的链接,精准提取联系电话 - 增加请求超时和异常捕获,避免网络波动、页面结构异常导致程序崩溃
- 新增浏览器请求头,降低被站点反爬策略拦截的概率
内容的提问来源于stack exchange,提问作者NeoEm
相关产品推荐
相关产品推荐

