office360/weather-crawler 问题修复 & 功能扩展

解决BUG、新增功能、兼容多环境部署,快速响应你的开发需求

邮箱:yvsm@zunyunkeji.com | QQ:316430983 | 微信:yvsm316

office360/weather-crawler

最新稳定版本:1.3.0

Composer 安装命令:

composer require office360/weather-crawler

包简介

A PHP crawler for fetching weather data from China Weather Network

README 文档

README

一个PHP天气数据获取工具,用于学习和研究目的获取天气相关信息。

重要声明

⚠️ 法律风险提示

  1. 本工具仅供学习和研究使用,不得用于任何商业用途。
  2. 本工具获取的天气数据来源于第三方网站,数据版权归原网站所有。
  3. 使用本工具时,请严格遵守相关网站的使用条款、robots协议以及中国法律法规。
  4. 本工具不保证数据的准确性、完整性和时效性,使用数据时请自行验证。
  5. 使用者应自行承担因使用本工具而产生的所有法律责任和风险。
  6. 请勿使用本工具进行过于频繁的请求,以免对目标网站造成不必要的负担。

免责声明

本工具的开发和发布仅出于技术研究和学习目的。对于因使用本工具而导致的任何直接或间接损失,包括但不限于数据丢失、系统损坏、法律纠纷等,作者不承担任何责任。

使用者应在遵守相关法律法规的前提下使用本工具,并自行评估和承担所有风险。

功能特性

  • 基于ip2region的访客IP定位:完全本地化的IP地址定位,无需依赖外部API
  • 自动获取天气数据:根据访客所在城市自动获取天气数据
  • 灵活的城市ID获取方式:支持三种方式获取城市ID:
    • 通过城市名称获取城市ID
    • 通过经纬度坐标获取城市ID
    • 通过IP地址获取城市ID
  • 提供六种天气数据获取方式
    • 当天基础天气数据
    • 当天详细天气数据
    • 7日天气预报
    • 逐小时天气预报(默认24小时,可自定义条数)
    • 15日天气预报
    • 综合天气数据(同时获取详细、7天、逐小时和15天数据)
  • 支持PS-4自动加载:符合现代PHP开发标准
  • 完善的错误处理机制:确保应用稳定运行
  • 可更新的IP数据库:支持定期更新ip2region数据库以提高定位准确性

安装

方法一:使用Composer安装(推荐)

composer require office360/weather-crawler

方法二:从GitHub仓库安装开发版本

composer require office360/weather-crawler:dev-main

如果遇到网络问题,可以在composer.json中手动添加仓库配置:

{
    "repositories": [
        {
            "type": "vcs",
            "url": "https://github.com/office360/weather-crawler.git"
        }
    ],
    "require": {
        "office360/weather-crawler": "dev-main"
    }
}

然后运行:

composer install

快速开始

创建一个简单的PHP文件来测试天气爬虫:

使用流式接口获取天气数据(推荐)

<?php

require 'vendor/autoload.php';

use Weather\WeatherCrawler;

// 创建实例
$weatherCrawler = WeatherCrawler::create();

try {
    // 通过城市名称获取当前基础天气
    $basicWeather = $weatherCrawler->forCity('北京')
                                  ->getWeather('basic');
    print_r($basicWeather);
} catch (Exception $e) {
    echo '错误: ' . $e->getMessage();
}

通过城市名称获取天气数据

<?php

require 'vendor/autoload.php';

use Weather\WeatherCrawler;

// 创建实例
$weatherCrawler = WeatherCrawler::create();

try {
    // 1. 首先通过城市名称获取城市ID
    $cityCode = $weatherCrawler->getCityCodeByName('北京');
    echo "城市代码: {$cityCode}\n";
    
    // 2. 然后使用城市ID获取当前天气数据
    $currentWeather = $weatherCrawler->getCurrentWeather($cityCode);
    print_r($currentWeather);
} catch (Exception $e) {
    echo '错误: ' . $e->getMessage();
}

通过经纬度获取天气数据

<?php

require 'vendor/autoload.php';

use Weather\WeatherCrawler;

// 创建实例
$weatherCrawler = WeatherCrawler::create();

try {
    // 使用流式接口通过经纬度获取当前基础天气(北京的经纬度)
    $basicWeather = $weatherCrawler->forCoordinates(39.9042, 116.4074)
                                   ->getWeather('basic');
    print_r($basicWeather);
} catch (Exception $e) {
    echo '错误: ' . $e->getMessage();
}

通过IP地址获取天气数据

<?php

require 'vendor/autoload.php';

use Weather\WeatherCrawler;

// 创建实例
$weatherCrawler = WeatherCrawler::create();

try {
    // 使用流式接口通过IP地址获取当前基础天气(北京的IP地址)
    $basicWeather = $weatherCrawler->forIp('114.247.50.2')
                                   ->getWeather('basic');
    print_r($basicWeather);
} catch (Exception $e) {
    echo '错误: ' . $e->getMessage();
}

运行上面的代码,您将看到对应城市的天气数据。

使用方法

基本用法(自动定位)

<?php

require 'vendor/autoload.php';

use Weather\WeatherCrawler;

// 创建实例
$weatherCrawler = WeatherCrawler::create();

// 根据访客所在城市获取当前基础天气数据
// forCurrentLocation() 方法会自动获取访客IP并定位城市

try {
    $basicWeather = $weatherCrawler->forCurrentLocation()
                                   ->getWeather('basic');
    print_r($basicWeather);
} catch (Exception $e) {
    echo '错误: ' . $e->getMessage();
}

根据城市代码直接获取天气数据

<?php

require 'vendor/autoload.php';

use Weather\WeatherCrawler;

// 创建实例
$weatherCrawler = WeatherCrawler::create();

// 已知城市代码的情况下,可以直接使用城市代码获取天气数据

try {
    // 使用流式接口获取7日天气数据(北京)
    $sevenDayWeather = $weatherCrawler->forCityCode('101010100')
                                     ->getWeather('7day');
    print_r($sevenDayWeather);
} catch (Exception $e) {
    echo '错误: ' . $e->getMessage();
}

根据城市名称获取天气数据

<?php

require 'vendor/autoload.php';

use Weather\WeatherCrawler;

// 创建实例
$weatherCrawler = WeatherCrawler::create();

// 通过城市名称获取天气数据

try {
    // 使用流式接口获取逐小时天气数据
    $hourlyWeather = $weatherCrawler->forCity('上海')
                                    ->getWeather('hourly');
    print_r($hourlyWeather);
} catch (Exception $e) {
    echo '错误: ' . $e->getMessage();
}

手动指定IP地址获取天气数据

<?php

require 'vendor/autoload.php';

use Weather\WeatherCrawler;

// 创建实例
$weatherCrawler = WeatherCrawler::create();

// 手动指定IP地址获取天气数据(适用于代理环境或需要模拟不同地区的情况)

try {
    // 使用流式接口通过指定IP获取当前天气(模拟北京IP)
    $currentWeather = $weatherCrawler->forIp('114.247.50.2')
                                     ->getWeather('basic');
    print_r($currentWeather);
} catch (Exception $e) {
    echo '错误: ' . $e->getMessage();
}

获取综合天气数据

<?php

require 'vendor/autoload.php';

use Weather\WeatherCrawler;

// 创建实例
$weatherCrawler = WeatherCrawler::create();

// 获取综合天气数据

try {
    // 使用流式接口获取综合天气数据(广州)
    $comprehensiveWeather = $weatherCrawler->forCity('广州')
                                         ->getWeather('comprehensive');
    print_r($comprehensiveWeather);
} catch (Exception $e) {
    echo '错误: ' . $e->getMessage();
}

API参考

WeatherCrawler类

工厂方法

create()

创建WeatherCrawler实例的静态工厂方法。

返回值:

  • WeatherCrawler:WeatherCrawler实例
$weatherCrawler = WeatherCrawler::create();

流式接口方法

forCity(string $cityName)

通过城市名称设置城市代码。

参数:

  • $cityName:城市名称(如"北京"、"上海")

返回值:

  • WeatherCrawler:返回当前实例,用于方法链式调用
forCoordinates(float $latitude, float $longitude)

通过经纬度坐标设置城市代码。

参数:

  • $latitude:纬度(如北京的纬度39.9042)
  • $longitude:经度(如北京的经度116.4074)

返回值:

  • WeatherCrawler:返回当前实例,用于方法链式调用
forIp(?string $clientIp)

通过IP地址设置城市代码。

参数:

  • $clientIp:访客IP地址(可选,不提供则自动获取)

返回值:

  • WeatherCrawler:返回当前实例,用于方法链式调用
forCurrentLocation()

通过当前访问者IP地址自动设置城市代码。

返回值:

  • WeatherCrawler:返回当前实例,用于方法链式调用
forCityCode(string $cityCode)

直接设置城市代码。

参数:

  • $cityCode:城市代码(如"101010100")

返回值:

  • WeatherCrawler:返回当前实例,用于方法链式调用
getWeather(string $type = 'comprehensive', int $hourlyLimit = 24)

获取指定类型的天气数据。

参数:

  • $type:天气数据类型(可选,默认为'comprehensive')
    • 'basic':当天基础天气数据
    • 'detail':当天详细天气数据
    • '7day':7日天气预报
    • 'hourly':逐小时天气预报
    • '15day':15日天气预报
    • 'comprehensive':综合天气数据(同时获取详细、7天、逐小时和15天数据)
  • $hourlyLimit:逐小时天气预报的返回条数限制(仅当$type为'hourly'或'comprehensive'时有效,默认24条)

返回值:

  • array:天气数据数组,格式根据$type参数而定

获取城市ID的方法

getCityCodeByName(string $cityName)

通过城市名称获取城市代码。

参数:

  • $cityName:城市名称(如"北京"、"上海")

返回值:

  • string:城市代码(如"101010100")
getCityCodeByCoordinates(float $latitude, float $longitude)

通过经纬度坐标获取城市代码。

参数:

  • $latitude:纬度(如北京的纬度39.9042)
  • $longitude:经度(如北京的经度116.4074)

返回值:

  • string:城市代码(如"101010100")
getCityCodeByIp(?string $clientIp)

通过IP地址获取城市代码。

参数:

  • $clientIp:访客IP地址(可选,不提供则自动获取)

返回值:

  • string:城市代码(如"101010100")

getVisitorData(?string $clientIp)

获取访客的IP、所在城市、区域等信息。

参数:

  • $clientIp:访客IP地址(可选,不提供则自动获取)

返回值:

[
    'ip' => string, // 访客IP地址
    'province' => string, // 省份
    'city' => string, // 城市
    'district' => string, // 区域
    'cityCode' => string // 城市代码
]

获取天气数据的方法

getCurrentWeather(string $cityCode)

获取当前天气数据(包含基础和详细数据)。

参数:

  • $cityCode:城市代码(必需)

返回值:

[
    'cityCode' => string, // 城市代码
    'cityName' => string, // 城市名称
    'temperature' => string, // 当前温度
    'weather' => string, // 天气状况
    'windDirection' => string, // 风向
    'windPower' => string, // 风力
    'humidity' => string, // 湿度
    'time' => string, // 更新时间
    'aqi' => string, // 空气质量指数
    'airQuality' => [ // 空气质量详情
        'aqi' => string,
        'quality' => string,
        'pm25' => string,
        'pm10' => string,
        'o3' => string,
        'no2' => string,
        'so2' => string,
        'co' => string
    ],
    'weatherIndex' => [ // 天气指数
        [
            'name' => string, // 指数名称
            'value' => string, // 指数值
            'level' => string, // 指数等级
            'desc' => string // 指数描述
        ],
        // ...
    ]
]
get7DayWeather(string $cityCode)

获取7日天气预报。

参数:

  • $cityCode:城市代码(必需)

返回值:

[
    [
        'date' => string, // 日期
        'day' => string, // 星期
        'weather' => string, // 天气状况
        'tempMax' => string, // 最高温度
        'tempMin' => string, // 最低温度
        'windDay' => string, // 白天风向
        'windNight' => string, // 夜间风向
        'windPowerDay' => string, // 白天风力
        'windPowerNight' => string, // 夜间风力
        'humidityDay' => string, // 白天湿度
        'humidityNight' => string // 夜间湿度
    ],
    // ... 共7天
]
get15DayWeather(string $cityCode)

获取15日天气预报。

参数:

  • $cityCode:城市代码(必需)

返回值:

[
    [
        'date' => string, // 日期
        'day' => string, // 星期
        'weather' => string, // 天气状况
        'tempMax' => string, // 最高温度
        'tempMin' => string, // 最低温度
        'windDay' => string, // 白天风向
        'windNight' => string, // 夜间风向
        'windPowerDay' => string, // 白天风力
        'windPowerNight' => string, // 夜间风力
        'humidityDay' => string, // 白天湿度
        'humidityNight' => string // 夜间湿度
    ],
    // ... 共15天
]
getHourlyWeather(string $cityCode, int $limit = 24)

获取逐小时天气预报。

参数:

  • $cityCode:城市代码(必需)
  • $limit:返回条目数量限制(可选,默认24条)

返回值:

[
    [
        'time' => string, // 时间
        'temperature' => string, // 温度
        'weather' => string, // 天气状况
        'windDirection' => string, // 风向
        'windPower' => string, // 风力
        'humidity' => string // 湿度
    ],
    // ... 根据limit参数返回指定条数
]
getAllWeather(string $cityCode)

获取综合天气数据,包含当前天气、15日预报和逐小时预报。

参数:

  • $cityCode:城市代码(必需)

返回值:

[
    'currentWeather' => array, // 当前天气数据,同getCurrentWeather返回值
    'fifteenDayWeather' => array, // 15天天气预报数据,同get7DayWeather返回值格式
    'hourlyWeather' => array // 逐小时天气预报数据,同getHourlyWeather返回值格式
]
getCityCodeMap()

获取城市代码映射表。

返回值:

  • array:城市代码映射表,格式为 ['城市名称' => '城市代码']

注意事项

  1. 本工具依赖于第三方数据源的结构和接口,若数据源结构发生变化,可能导致数据获取失败。
  2. 使用前请务必阅读并遵守相关数据源的使用条款、robots协议以及中国法律法规。
  3. 合理控制请求频率,避免对数据源造成不必要的负担,建议在生产环境中添加缓存机制。
  4. 本工具获取的数据仅供参考,请勿用于任何关键决策或商业用途。
  5. 请确保您的使用行为符合相关法律法规,包括但不限于《中华人民共和国网络安全法》、《中华人民共和国著作权法》等。
  6. 若您不确定使用本工具是否合法,请咨询专业法律意见

开发

运行测试

composer test

许可证

MIT License

统计信息

  • 总下载量: 4
  • 月度下载量: 0
  • 日度下载量: 0
  • 收藏数: 0
  • 点击次数: 0
  • 依赖项目数: 0
  • 推荐数: 0

GitHub 信息

  • Stars: 0
  • Watchers: 0
  • Forks: 0
  • 开发语言: PHP

其他信息

  • 授权协议: MIT
  • 更新时间: 2026-01-08