PHP爬取历史天气
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爬取历史天气的更多相关文章
- python 爬取历史天气
python 爬取历史天气 官网:http://lishi.tianqi.com/luozhuangqu/201802.html # encoding:utf-8 import requests fr ...
- Scrapy实战篇(五)之爬取历史天气数据
本篇文章我们以抓取历史天气数据为例,简单说明数据抓取的两种方式: 1.一般简单或者较小量的数据需求,我们以requests(selenum)+beautiful的方式抓取数据 2.当我们需要的数据量较 ...
- PyQuery爬取历史天气信息
1.准备工作: 网址:https://lishi.tianqi.com/xian/index.html 爬虫类库:PyQuery,requests 2.网页分析: 红线部分可更改为需要爬取的城市名,如 ...
- python爬虫实战(六)--------新浪微博(爬取微博帐号所发内容,不爬取历史内容)
相关代码已经修改调试成功----2017-4-13 详情代码请移步我的github:https://github.com/pujinxiao/sina_spider 一.说明 1.目标网址:新浪微博 ...
- Python爬取中国天气网
Python爬取中国天气网 基于requests库制作的爬虫. 使用方法:打开终端输入 “python3 weather.py 北京(或你所在的城市)" 程序正常运行需要在同文件夹下加入一个 ...
- python3爬取墨迹天气并发送给微信好友,附源码
需求: 1. 爬取墨迹天气的信息,包括温湿度.风速.紫外线.限号情况,生活tips等信息 2. 输入需要查询的城市,自动爬取相应信息 3. 链接微信,发送给指定好友 思路比较清晰,主要分两块,一是爬虫 ...
- 初识python 之 爬虫:爬取中国天气网数据
用到模块: 获取网页并解析:import requests,html5lib from bs4 import BeautifulSoup 使用pyecharts的Bar可视化工具"绘制图表& ...
- python爬取中国天气网站数据并对其进行数据可视化
网址:http://www.weather.com.cn/textFC/hb.shtml 解析:BeautifulSoup4 爬取所有城市的最低天气 对爬取的数据进行可视化处理 按温度对城市进行排 ...
- scrapy实例:爬取中国天气网
1.创建项目 在你存放项目的目录下,按shift+鼠标右键打开命令行,输入命令创建项目: PS F:\ScrapyProject> scrapy startproject weather # w ...
随机推荐
- C#使用Emit生成构造函数和属性
假设我们需要一个名叫Kitty的类,其在Pets程序集下. 1 // specify a new assembly name 2 var assemblyName = new AssemblyName ...
- python全栈开发day81--jsonp
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- ELK日志分析平台环境部署 (yum安装)
前言:通常体质被分散存储在不同的设备上面,在庞大的服务器集群中,我们需要集中化的管理,日志的统计和检索,一般我们使用grep和awk,wc等linux命令虽然能够实现检索和统计,但是呢,对于要求更高的 ...
- Codeforces 886E Maximum Element 组合数学 + dp
我们定义dp[ i ]表示长度为 i 的序列, 最后没有一个==k的时候返回的方案数, 也就是最后强制返回 i 的方案数. 我们能得到dp方程 dp[ i ] = sum(dp[ i - j - ...
- Noj - 在线强化训练1
1445 A 求n个整数的和 1564 B 判断一个数是否是完全数 1011 C 判素数(Prime number) 1566 D 输入一组整数,找出最小值 1200 E 判断三角 ...
- responseHandler
resonsehandler 接受服务端传过来的数据,然后在这个函数里处理好要显示的数据在return个table显示 <!DOCTYPE html> <html lang=&quo ...
- 在controller中将timestamp类型的数据通过toString()方法变成字符串
然后在miniui里面将dateFormat="yyyy-MM-dd",变成想要的格式.
- pdf文件去掉广告,水印,背景和删除密码方法收藏
对于学习资料中,pdf文件中的出现的频繁的广告内容真的让人看了很烦,怎么删除呢,后来发现有一款工具foxitphantom可以直接删除,具体操作是,先用该软件打开,然后选择Edit->Heade ...
- POJ 3237 Tree 【树链剖分】+【线段树】
<题目链接> 题目大意: 给定一棵树,该树带有边权,现在对该树进行三种操作: 一:改变指定编号边的边权: 二:对树上指定路径的边权全部取反: 三:查询树上指定路径的最大边权值. 解题分析: ...
- Mysql漂流系列(一):MySQL的执行流程
MySQL的执行流程 MySQL的执行流程: MySQL的执行流程分析: 1.当我们请求mysql服务器的时候,MySQL前端会有一个监听,请求到了之后,服务器得到相关的SQL语句,执行之前(虚线部分 ...