首先需要了解需要爬取的数据的网页的结构,其结构如下图所示(只截取了部分):

从图中可以看出每一天的天气数据都被一个<li></li>包含,这七天的数据又都包含在一个<ul></ul>中。

所以我们的目标就是获取ul下每个li中的数据。注意,“今天”的数据中温度只有一个数值,而其后6天的

数据温度都有两个数值,需要单独处理。

代码如下(IDE:pycharm):

from bs4 import BeautifulSoup
from bs4 import UnicodeDammit
import urllib.request
import sqlite3class WeatherDB:def openDB(self):# 使用sqlite3建立的weathers数据库self.con = sqlite3.connect("weathers.db")self.cursor = self.con.cursor()try:self.cursor.execute("create table weathers (wCity varchar(16),wDate varchar(16),wWeather varchar(64),wTemp varchar(32),constraint pk_weather primary key(wCity,wDate))")except:self.cursor.execute("delete from weathers")def closeDB(self):self.con.commit()self.con.close()def insert(self,city,date,weather,temp):try:self.cursor.execute("insert into weathers(wCity,wDate,wWeather,wTemp) values(?,?,?,?)",(city,date,weather,temp))except Exception as err:print(err)def show(self):self.cursor.execute("select * from weathers")rows = self.cursor.fetchall()print("%-16s%-16s%-32s%-16s"%("city","date","weather","temp"))for row in rows:print("%-16s%-16s%-32s%-16s"%(row[0],row[1],row[2],row[3]))
class WeatherForecast:def __init__(self):# 构造请求头,模拟浏览器self.headers={"User-Agent":"Mozilla/5.0(Windows; U; Windows NT 6.0 x64; en-US; rv:1.9pre)Gecko/2008072421 Minefield/3.0.2pre"}# 要爬取的四个城市的名称及其在中国天气网所对应的代码self.cityCode={"北京":"101010100","上海":"101020100","广州":"101280101","深圳":"101280601"}def forecastCity(self, city):if city not in self.cityCode.keys():print(city+"code cannot be found")return# 要访问的网址url = "http://www.weather.com.cn/weather/"+self.cityCode[city]+".shtml"try:#构造request的参数req = urllib.request.Request(url, headers=self.headers)data = urllib.request.urlopen(req)data = data.read()dammit = UnicodeDammit(data, ["utf-8","gbk"])# data中就是返回来的整个网页data = dammit.unicode_markupsoup = BeautifulSoup(data, features="html.parser")# 借助BeautifulSoup查找class是‘t clearfix'的ul中所有的lilis = soup.select("ul[class='t clearfix'] li")# 用来区分“今天”和其余6天n=0for li in lis:try:# 获取li下h1中的文本值date = li.select('h1')[0].text# 获取标签li下class是“wea”的p标签下的文本值weather = li.select('p[class="wea"]')[0].textif n>0:# 对应其余六天,有2个温度需要提取,获取标签li下class是“tem”的p标签下的span标签的文本值temp = li.select('p[class="tem"] span')[0].text+"/"+li.select('p[class="tem"] i')[0].textelse:# 对应“今天”,有1个温度需要提取,获取标签li下class是“tem”的p标签下的i标签的文本值temp = li.select('p[class="tem"] i')[0].textprint(city,date,weather,temp)n=n+1# 将数据插入数据库self.db.insert(city,date,weather,temp)except Exception as err:print(err)except Exception as err:print(err)def process(self,cities):self.db = WeatherDB()self.db.openDB()for city in cities:self.forecastCity(city)self.db.closeDB()
ws = WeatherForecast()
ws.process(["北京","上海","广州","深圳"])
print("comploted")

运行上述代码后,可以看到如下结果:

我也不是很懂,大家多多指教。

 

简单的爬取中国天气网某个城市七天的天气预报数据相关推荐

  1. python爬取中国天气网中城市及其对应编号

    文章目录 一.前言 二.思路 三.程序 四.注意事项 一.前言 为了实现爬取各地城市天气预报及其可视化的需要,爬取中国天气网中城市及其对应编号 . 天气预报可视化文章如下: <python爬虫, ...

  2. R语言爬取中国天气网单个城市实时天气预报数据

    在传统零售行业,雨天天气大概会影响晴天30%-40%的销售业绩,所以从网上获取天气数据来作分析,并根据天气数据作出预测,提前做好预防措施和提醒业务人员,把损失减少到最低就显得十分重要,用R语言的rve ...

  3. R语言rvest包3步爬取中国天气网国内所有城市(县)7天实时天气预报数据

    接上一篇用R语言爬取中国天气网单个城市的7天实时天气预报数据,这篇文章综合一下,使用R语言rvest包3步爬取中国天气网国内所有城市(县)7天实时天气预报数据,这里的步数跨度可能有点长,但思路确实是3 ...

  4. python爬取本地天气信息_用Python写一个爬取中国天气网的终端版天气预报爬虫

    导语 前几篇文章介绍了爬取静态网站的主要方法.今天写一个小项目实践一下.本项目可以在终端窗口查询全国3400多个区县的当日天气信息和近七天天气信息. 实现效果 [Python爬虫]写一个爬取中国天气网 ...

  5. python爬取中国天气网天气图标

    python爬取中国天气网天气图标 准备工作 天气预报图例网址:http://www.weather.com.cn/static/html/legend.shtml 安装requests:pip in ...

  6. python爬取中国天气网中国全部城市的天气链接

    近期自己尝试用python写一个qqbot实现天气查询功能,现已基本实现 已经基本完成爬取中国天气网的所有城市的天气情况链接 下附中国天气网所有城市的名称及对应链接 {'朝阳': 'http://ww ...

  7. Scrapy实例:爬取中国天气网天气数据

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

  8. Java爬取中国天气网实况天气数据

    因实验室需求,需要找一个实况天气API. 百度云.阿里云.腾讯云上边我都去找了,很多平台要么没有,要么要收费(免费的可调用次数太少了).而我在高德开放平台上找到了一个,但是不符合要求,被老师pass掉 ...

  9. 使用Python爬取中国天气网天气数据

    使用Python获取中国天气网中"广州"天气数据 注意:原文章写于2016年12月 广州天气页面:http://www.weather.com.cn/weather/1012801 ...

最新文章

  1. 浅谈云服务器都能用来做什么?
  2. C#用xpath查找某节点
  3. python pygame模块按键延迟_pygame模块中键控命令不能实现方块移动,求解
  4. datagrid后台分页js.js
  5. 最简单的控制台登录小案例,适合初学者
  6. Unity 脚本生命周期流程图
  7. html如何设置三列列宽相等,CSS分割宽度100%到3列
  8. 2021考研c语言编程题,2021c语言编程例题及答案.docx
  9. Python ATM实战
  10. python str方法的用法_Python基础之str常用方法、for循环
  11. paip.java 以及JavaScript (js) 的关系以及区别
  12. goflyway安装
  13. 硬盘格式化怎么操作 硬盘格式化后数据还在吗
  14. Android禁用系统更新
  15. 蚂蚁金服宫孙:guava探究系列之优雅校验数据
  16. 【uniapp】 两种上拉加载方式
  17. python字符串两个冒号_Python 数组字符串 冒号 用法
  18. 针对Excel表格文件操作的编程实现
  19. 用区块链解决电子证据司法存证
  20. 令人炸毛儿的MySQL隐式转换 - 无形之刃,最为致命

热门文章

  1. 如何在OpenStack Kolla上部署Tungsten Fabric(附14个常见的配置问题)
  2. EasyDSS流媒体服务器成功实现5G超高清8k视频RTMP/HLS(m3u8)直播过程中遇到的一些坑(insta360 4k/8k直播)
  3. mysql链接远程报错10061
  4. R(rstudio)语言协方差分析
  5. 古币杂谈:基础知识之 进,退,仰,俯,昂,降
  6. 谈谈生活中那些与学习相关的事儿
  7. 居然是一个中文Github网站!该不会是个假的吧?
  8. cal java中的用法_Java中static用法
  9. 展技术实力,筑元宇宙安全,零时科技成为首批湾区元宇宙联盟成员!
  10. C++中的~i是什么意思