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 ...
随机推荐
- webpack学习笔记--配置resolve
Resolve Webpack 在启动后会从配置的入口模块出发找出所有依赖的模块,Resolve 配置 Webpack 如何寻找模块所对应的文件. Webpack 内置 JavaScript 模块化语 ...
- zookeeper 学习 客户端Acl操作笔记
Acl = Access control list create /node2 node2data [zk: localhost:2181(CONNECTED) 14] addauth digest ...
- centos 6.9安装python 3.6
.下载源码包在官网按照需要下载到本地 wget https://www.python.org/ftp/python/3.6.1/Python-3.6.1.tgz .解压源码包 tar -xvf Pyt ...
- 【Android】Tips for Android developer: “Conversion to Dalvik format failed: Unable to execute dex: null”
Androiddeveloper, I have met a strange problem when I want use a third party jar, it remained me tha ...
- redcontrol for SL 中文化及样式选择
app.xaml.cs public partial class App: Application { public App() { //指定t ...
- scrapy 基础使用以及错误方案
原先用的是selenium(后面有时间再写),这是第一次使用scrapy这个爬虫框架,所以记录一下这个心路历程,制作简单的爬虫其实不难,你需要的一般数据都可以爬取到. 下面是我的目录,除了main.p ...
- [转,讲的非常精彩]CIDR地址块及其子网划分(内含原始IP地址分类及其子网划分的介绍)
http://blog.csdn.net/dan15188387481/article/details/49873923 CIDR地址块及其子网划分(内含原始IP地址分类及其子网划分的介绍) 1. ...
- 2018-03-11 20165235 祁瑛 Java第二周考试总结
20165235 祁瑛 Java第二周考试总结 课后习题p16 代码编写 class Person { void speakHello (){ System.out.print("nin h ...
- java添加水印等比缩放
/** * 图片天加文字水印(默认缩小scale) * 备注: * Positions.BOTTOM_RIGHT 表示水印位置 * * @param filePath 原图路径 * @param ne ...
- Dubbo入门---搭建一个最简单的Demo框架(转)
Dubbo背景和简介 Dubbo开始于电商系统,因此在这里先从电商系统的演变讲起. 单一应用框架(ORM) 当网站流量很小时,只需一个应用,将所有功能如下单支付等都部署在一起,以减少部署节点和成本. ...