You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.02 07:01:09