V1.0 教你如何爬取天气数据

编程入门 行业动态 更新时间:2024-10-28 11:20:32

V1.0 <a href=https://www.elefans.com/category/jswz/34/1763259.html style=教你如何爬取天气数据"/>

V1.0 教你如何爬取天气数据

标题意思是:爬虫实践;爬取中国天气网天气数据1.0版本,以后如有更新就不更改原博了(记录一下,免得以后忘了就尴尬了)

编程环境:Pycharm
浏览器:Google Chrome

这个实践大概花了两个小时时间,虽然慢了点但是还是很有成就感的嘿,毕竟第一次写爬虫。
爬虫目标是爬取中国天气网上指定城市的7日天气数据并保存。
思路是模块化编程。
以下具体思路!

第一步:构建url

在中国天气网搜索某城市,观察其url,发现构造并不像搜索引擎一样,但是url主体相同,区别是每个城市有各自的id,所有第一次必须手动去中国天气网查询城市,获得相应id,然后添加到cityID字典里。

第二步:爬取HTML内容

得到url后,就是万用的getHTML模块。以下便是爬虫三连。

        r = requests.get(url, timeout=30)r.raise_for_status()r.encoding = r.apparent_encoding

第三步:解析HTML内容

解析HTML获取所需要的数据是爬虫最重要的一步。
而解析HTML的内容就轮到BeautifulSoup上场。
本次实践使用的是CSS语法查找的所需要的元素。

在原网页的图示位置右键鼠标,点击检查,得到下图:

易知我们所需数据的位置。观察标签树,构建搜索语句。

soup = BeautifulSoup(html.text, 'lxml')
l = soup.select('div[id="7d"] input[id="hidden_title"]')
ll = soup.select('ul[class="t clearfix"] li')

如何进一步提取所需数据,过滤无关数据?
!!!re!
依然是观察数据然后构建re表达式来提取数据。

re.findall(r'\d.*C', str(ll)

第四步:保存数据

本来最好是创建一个小型数据库,但是我不太熟练,就简单的放到文本文件里。
一个好的技巧是使用with语句来打开文件,这样可以免去忘了关闭文件导致文件损坏或者丢失等问题。

def saveHTML(s):with open(r"climate.txt",'at') as f:f.write(s+'\n')

第五步:主程序

for i,j in cityID.items():url='/'+cityID[i]+'.shtml'ls=[]HTML=getHTML(url)tx=readHTML(HTML)tx.pop(1)saveHTML(i+':'+str(tx))ls.clear()

到这里爬虫已经写完了,但是我无聊又给改造了一下加上了一个进度条,用来提高交互友好度,在爬取大批量数据时可以清晰的知道大概进度。

附加:文本进度条

s ,n= len(cityID),1
print("执行开始".center(s // 2, "-"))
start = time.perf_counter()
for i,j in cityID.items():passa ,b= '*' * n,'.' * (s - n)print("\r{:^3.0f}%[{}->{}]".format(n*100/s, a, b), end='') n+=1
print('   {:.2f}s\n执行结束!'.format(time.perf_counter() - start))

这个进度条实现的功能是每爬完一个城市,进度条就增加一点,比例是s ,n= len(cityID),1'{:^3.0f}%'.format(n*100/s),然后添加了运行程序的耗时。

突然想到,每个页面的爬取时间大概是一样的,其实貌似还可以添加上‘预期结束时间’和‘预期剩余时间’的,算了,以后有机会再说吧。

就这样,以上。

.

完整算法

# !/usr/bin/ env python
# author:LingInHeart
# time:2019/12/14
# 实践项目-爬取天气预报数据
# 能力所限,只能做到爬取当日所在的7日天气数据,并保存在txt文档里。
# 中国天气网的搜索是用id构建的,没有城市相应的id,只能手动添加id再构造urlfrom bs4 import BeautifulSoup
import requests
import re,timecityID={'应城-湖北':'101200405','东港-辽宁':'101070604','裕华-河北':'101090123'}def getHTML(url):try:r = requests.get(url, timeout=30)r.raise_for_status()r.encoding = r.apparent_encodingreturn rexcept Exception as err:print(err)
def readHTML(html):soup = BeautifulSoup(html.text, 'lxml')ll = soup.select('div[id="7d"] input[id="hidden_title"]')ls.append(re.findall(r'\d.*C', str(ll)))ll = soup.select('ul[class="t clearfix"] li')for i in ll:s=''for j in i.text:if j not in [' ', '\n']:s += jls.append(re.findall(r'\d.+/.+℃',s))return ls
def saveHTML(s):with open(r"climate.txt",'at') as f:f.write(s+'\n')s ,n= len(cityID),1
print("执行开始".center(s // 2, "-"))
start = time.perf_counter()
for i,j in cityID.items():url='/'+cityID[i]+'.shtml'#;print(url)ls=[]HTML=getHTML(url)tx=readHTML(HTML)tx.pop(1)saveHTML(i+':'+str(tx))ls.clear()a ,b= '*' * n,'.' * (s - n)print("\r{:^3.0f}%[{}->{}]".format(n*100/s, a, b), end='') n+=1
print('   {:.2f}s\n执行结束!'.format(time.perf_counter() - start))

更多推荐

V1.0 教你如何爬取天气数据

本文发布于:2024-03-04 20:44:38,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1710376.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:教你如何   天气   数据

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!