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. INFO JobScheduler: Added jobs for time 1524468752000 ms/INFO MemoryStore: Block input-0-1524469143000 stored as bytes in memory/完全分布式 ./bin/run-example streaming.NetworkWordCount localhost 9999无法正常运行

    1.完全分布式  ./bin/run-example streaming.NetworkWordCount localhost 9999无法正常运行: 1 [hadoop@slaver1 spark- ...

  2. Java集合源码学习(四)HashMap

    一.数组.链表和哈希表结构 数据结构中有数组和链表来实现对数据的存储,这两者有不同的应用场景,数组的特点是:寻址容易,插入和删除困难:链表的特点是:寻址困难,插入和删除容易:哈希表的实现结合了这两点, ...

  3. 【BZOJ4998】星球联盟

    题解: 应该还是比较水的 首先很容易发现的就是两个点一旦联通他们就永远联通了 所以联通之后我们就把他们之间缩成一个点

  4. FastJson 支持配置的PropertyNamingStrategy四种策略

    摘要: FastJson默认使用CamelCase,在1.2.15版本之后,FastJson支持配置PropertyNamingStrategy,支持四种策略: CamelCase.PascalCas ...

  5. BZOJ3262/洛谷P3810 陌上花开 分治 三维偏序 树状数组

    原文链接http://www.cnblogs.com/zhouzhendong/p/8672131.html 题目传送门 - BZOJ3262 题目传送门 - 洛谷P3810 题意 有$n$个元素,第 ...

  6. day 48-css-part1

    CSS(Cascading Style Sheet,层叠样式表 css是前端的优化器,如果说我们的html是把前端的大体骨架搭起来的话,那么我们的css就是在这个骨架的基础上进行修饰,使之更有立体感, ...

  7. JAVA首次课堂测试总结

    暑期生活已经结束,新的学期也已经开始,而暑期放假之前约定的JAVA首次课堂测试也如期的到来,本次测试真的可以学到和多东西,也有很多感想. 首先体会最深的就是系主任所说的软件工程不是那么好学的,真的需要 ...

  8. Tallest Cow POJ - 3263 (区间点修改)

    FJ's N (1 ≤ N ≤ 10,000) cows conveniently indexed 1..N are standing in a line. Each cow has a positi ...

  9. POJ 2481 Cows 【树状数组】

    <题目链接> 题目大意: 就是给出N个区间,问这个区间是多少个区间的真子集. 解题分析: 本题与stars类似,只要巧妙的将线段的起点和终点分别看成 二维坐标系中的x,y坐标,就会发现,其 ...

  10. Anaconda 虚拟环境的使用

    目录 前言 1. 创建虚拟环境 2. 虚拟环境管理 3. Conda虚拟环境的包管理 前言 今天把anaconda进行了滚动更新,实体环境python版本也相应从3.6跟新到了3.7.但是问题来了,之 ...