PHP爬取历史天气

PHP作为宇宙第一语言,爬虫也是非常方便,这里爬取的是从天气网获得中国城市历史天气统计结果。

程序架构

main.php

<?php
include_once("./parser.php");
include_once("./storer.php");
#解析器和存储器见下文
$parser = new parser();
$storer = new storer();
#获得url列表
$urlList = $parser->getCityList("http://lishi.tianqi.com/");
#依次解析新的URL网站内容,并存到数据库中
foreach($urlList as $url)
{
$data = $parser->getData($url);
$storer->store($data);
}

解析器

解析器提供两个接口,一个是解析主页,获得url列表;另一个是解析每座城市的数据,获得该城市的历史天气数据。

这里使用到的解析库是phpquery,使用JQuery的查询方式,简单高效。

<?php
#借助JQuery库解析
include_once("./phpQuery-onefile.php");
class parser
{
//获取城市url列表
function getCityList($url)
{
//直接在线流下载
phpQuery::newDocumentFile($url);
//第一次选择
$links = pq(".bcity *");
$urlList = [];
foreach ($links as $link) {
#第二次选择
$tmp = pq($link)->find('a')->attr('href');
#过滤组标签
if ($tmp!="#" and $tmp!="") {
#检查url
if(strpos($tmp,"-")==false and filter_var($tmp, FILTER_VALIDATE_URL))
$urlList[] = $tmp; #添加URL列表
}
}
return $urlList;
} //获取某个城市的历史气候
function getData($url)
{
//直接在线流下载
phpQuery::newDocumentFile($url);
//第一次选择
$text = pq("div .tqtongji p")->text(); #匹配城市
$city = $this->match("/,(.+)共出现/",$text);
#匹配天气
$rainy = $this->match("/雨(\d+)天/",$text);
$cloudy = $this->match("/多云(\d+)天/",$text);
$sunny = $this->match("/晴(\d+)天/",$text);
$overcast = $this->match("/阴(\d+)天/",$text); #为了跟cloudy区分
$snowy = $this->match("/雪(\d+)天/",$text);
#匹配拼音
$pinYin = $this->match("/http:\/\/lishi\.tianqi\.com\/(.*?)\/index\.html/",$url); $result["url"] = $url;
$result["city"] = $city;
$result["pinYin"] = $pinYin;
$result["rainy"] = $rainy;
$result["cloudy"] = $cloudy;
$result["sunny"] = $sunny;
$result["overcast"] = $overcast;
$result["snowy"] = $snowy;
return $result;
}
#正则解析
function match($rule,$text)
{
preg_match_all($rule, $text, $result);
#有些地区不是所有天气都有
if(count($result[1])==0)
return "0";
return $result[1][0];
}
}

存储器

使用MySQLi接口即可,代码如下:

<?php
class storer
{
public $mysqli;
function __construct()
{
$this->mysqli = new mysqli('localhost', '***', '******', 'phpWeather');
$this->mysqli->query("SET NAMES UTF8");
} function store($data)
{
$url = $data["url"];
$city = $data["city"];
$pinYin = $data["pinYin"];
$rainy = $data["rainy"];
$cloudy = $data["cloudy"];
$sunny = $data["sunny"];
$overcast = $data["overcast"];
$snowy = $data["snowy"]; #字符串在插入时要添加''来区分
$insertData = "VALUES('$city','$pinYin',$rainy,$cloudy,$sunny,$overcast,$snowy,'$url');";
#sql分开写更加清楚
$sql = "INSERT INTO record(city,pinYin,rainy,cloudy,sunny,overcast,snowy,url)".$insertData;
$isok = $this->mysqli->query($sql);
if($isok)
{
echo "$city 数据添加成功\n";
}
else
{
echo $sql . "\n";
echo "$city 数据添加失败\n";
}
}
function __destruct()
{
$this->mysqli->close();
}
}
?>

爬虫结果

共爬取了3119座城市的从2011年到现在的历史天气,接下来的数据分析以及可视化留到下一篇博客讲述。

PHP爬取历史天气的更多相关文章

  1. python 爬取历史天气

    python 爬取历史天气 官网:http://lishi.tianqi.com/luozhuangqu/201802.html # encoding:utf-8 import requests fr ...

  2. Scrapy实战篇(五)之爬取历史天气数据

    本篇文章我们以抓取历史天气数据为例,简单说明数据抓取的两种方式: 1.一般简单或者较小量的数据需求,我们以requests(selenum)+beautiful的方式抓取数据 2.当我们需要的数据量较 ...

  3. PyQuery爬取历史天气信息

    1.准备工作: 网址:https://lishi.tianqi.com/xian/index.html 爬虫类库:PyQuery,requests 2.网页分析: 红线部分可更改为需要爬取的城市名,如 ...

  4. python爬虫实战(六)--------新浪微博(爬取微博帐号所发内容,不爬取历史内容)

    相关代码已经修改调试成功----2017-4-13 详情代码请移步我的github:https://github.com/pujinxiao/sina_spider 一.说明 1.目标网址:新浪微博 ...

  5. Python爬取中国天气网

    Python爬取中国天气网 基于requests库制作的爬虫. 使用方法:打开终端输入 “python3 weather.py 北京(或你所在的城市)" 程序正常运行需要在同文件夹下加入一个 ...

  6. python3爬取墨迹天气并发送给微信好友,附源码

    需求: 1. 爬取墨迹天气的信息,包括温湿度.风速.紫外线.限号情况,生活tips等信息 2. 输入需要查询的城市,自动爬取相应信息 3. 链接微信,发送给指定好友 思路比较清晰,主要分两块,一是爬虫 ...

  7. 初识python 之 爬虫:爬取中国天气网数据

    用到模块: 获取网页并解析:import requests,html5lib from bs4 import BeautifulSoup 使用pyecharts的Bar可视化工具"绘制图表& ...

  8. python爬取中国天气网站数据并对其进行数据可视化

    网址:http://www.weather.com.cn/textFC/hb.shtml 解析:BeautifulSoup4 爬取所有城市的最低天气   对爬取的数据进行可视化处理 按温度对城市进行排 ...

  9. scrapy实例:爬取中国天气网

    1.创建项目 在你存放项目的目录下,按shift+鼠标右键打开命令行,输入命令创建项目: PS F:\ScrapyProject> scrapy startproject weather # w ...

随机推荐

  1. ***小程序wx.getUserInfo不能弹出授权窗口后的解决方案

    微信更新api后,wx.getUserInfo在开发和体验版本都不能弹出授权窗口.微信文档说明: 注意:此接口有调整,使用该接口将不再出现授权弹窗,请使用 <button open-type=& ...

  2. python---通过递归和动态规划策略解决找零钱问题

    也是常见套路. # coding = utf-8 def rec_mc(coin_value_list, change, know_results): min_coins = change if ch ...

  3. webpack学习笔记--压缩代码

    浏览器从服务器访问网页时获取的 JavaScript.CSS 资源都是文本形式的,文件越大网页加载时间越长. 为了提升网页加速速度和减少网络传输流量,可以对这些资源进行压缩. 压缩的方法除了可以通过 ...

  4. openresty用naxsi防xss、SQL注入

    下载naxsi wget https://github.com/nbs-system/naxsi/archive/untagged-afabfc163946baa8036f.tar.gz tar zx ...

  5. CentOS6 YUM安装MariaDB10.3.10

    1.先新增加一个MariaDB.repo vi /etc/yum.repos.d/MariaDB.repo [mariadb] name = MariaDB baseurl = http://mirr ...

  6. Visual Studio 2015 插件开发入门

    (1)安装 Visual Studio 2015 的时候选择 Visual Studio 扩展性工具(Visual Studio Extensibility Tools).对于已经安装好 Visual ...

  7. [转]MySQL 数据类型(float)的注意事项

    http://www.cnblogs.com/zhoujinyi/archive/2013/04/26/3043160.html 可能由于版本关系,我的mysql5.7插入数据超过范围时会提示,126 ...

  8. [已解决]virtualBox安装CentOS-6.3-x86_64-bin-DVD1.iso为什么总是显示命令行界面

    CentOS 6.3的安装界面分为2种,一种是图形化安装界面,另一种则类似于Dos系统的纯文本安装界面. 进入图形安装界面的必要条件是硬件系统的物理内存大于628M以上即可,因为之前在VBox虚拟机里 ...

  9. 未在本地计算机上注册“OraOLEDB.Oracle.1”提供程序。

     问题描述:运行访问oracle数据库的.net程序时,弹出错误"未在本地计算机上注册“OraOLEDB.Oracle.1”提供程序". 系统环境:windows server 2 ...

  10. 完成将 toChineseNum, 可以将数字转换成中文大写的表示,处理到万级别,例如 toChineseNum(12345),返回 一万二千三百四十五

    const toChineseNum = (num) => { const unit = ['', '十', '百', '千'] const counts = ['零', '一', '二', ' ...