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天气数据获取工具,用于学习和研究目的获取天气相关信息。
重要声明
⚠️ 法律风险提示
- 本工具仅供学习和研究使用,不得用于任何商业用途。
- 本工具获取的天气数据来源于第三方网站,数据版权归原网站所有。
- 使用本工具时,请严格遵守相关网站的使用条款、robots协议以及中国法律法规。
- 本工具不保证数据的准确性、完整性和时效性,使用数据时请自行验证。
- 使用者应自行承担因使用本工具而产生的所有法律责任和风险。
- 请勿使用本工具进行过于频繁的请求,以免对目标网站造成不必要的负担。
免责声明
本工具的开发和发布仅出于技术研究和学习目的。对于因使用本工具而导致的任何直接或间接损失,包括但不限于数据丢失、系统损坏、法律纠纷等,作者不承担任何责任。
使用者应在遵守相关法律法规的前提下使用本工具,并自行评估和承担所有风险。
功能特性
- 基于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:城市代码映射表,格式为['城市名称' => '城市代码']
注意事项
- 本工具依赖于第三方数据源的结构和接口,若数据源结构发生变化,可能导致数据获取失败。
- 使用前请务必阅读并遵守相关数据源的使用条款、robots协议以及中国法律法规。
- 请合理控制请求频率,避免对数据源造成不必要的负担,建议在生产环境中添加缓存机制。
- 本工具获取的数据仅供参考,请勿用于任何关键决策或商业用途。
- 请确保您的使用行为符合相关法律法规,包括但不限于《中华人民共和国网络安全法》、《中华人民共和国著作权法》等。
- 若您不确定使用本工具是否合法,请咨询专业法律意见。
开发
运行测试
composer test
许可证
MIT License
统计信息
- 总下载量: 4
- 月度下载量: 0
- 日度下载量: 0
- 收藏数: 0
- 点击次数: 0
- 依赖项目数: 0
- 推荐数: 0
其他信息
- 授权协议: MIT
- 更新时间: 2026-01-08