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

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

准备工作

  • 天气预报图例网址:http://www.weather.com.cn/static/html/legend.shtml
  • 安装requests:pip install requests

网页分析

  • 打开网页,可以看到图标有很多,而且分白天和夜间,我们要把图标保存到本地,并且图标名字要对应

在这里插入图片描述

  - 右键查看网页源代码,发现图标和名称都放到 `<td width="12%" ...` 的 **td** 标签下,而我们要做的就是提取其中的图片和名称
  ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200107142815884.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDc3NTU0OA==,size_16,color_FFFFFF,t_70)

编写代码

爬取网页

import requests
url = 'http://www.weather.com.cn/static/html/legend.shtml'
def getPage():
  # 请求头
  headers = {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.26 Safari/537.36 Core/1.63.5383.400 QQBrowser/10.0.1313.400"}
  res = requests.get(url, headers)
  # 手动指定字符编码为utf-8
  res.encoding = 'utf-8'
  print(res.text)
  return res.text
if __name__ == "__main__":
  getPage()
  • requests库的使用方法非常简单,requests.get(网页url) 就可以拿到网页内容了,但是为了模拟浏览器请求,最好还是加上请求头headers
  • requests响应内容:
    res.encoding:可以拿到当前的编码格式,也可以设置编码格式
    res.text:字符串响应体,这里就是网页的源代码
    res.content:二进制的响应体,如果是图片需要用到

    r.encoding                       #获取当前的编码
    r.encoding = 'utf-8'             #设置编码
    r.text                           #以encoding解析返回内容。字符串方式的响应体,会自动根据响应头部的字符编码进行解码。
    r.content                        #以字节形式(二进制)返回。字节方式的响应体,会自动为你解码 gzip 和 deflate 压缩。
    r.headers                        #以字典对象存储服务器响应头,但是这个字典比较特殊,字典键不区分大小写,若键不存在则返回None
    r.status_code                    #响应状态码
    r.raw                            #返回原始响应体,也就是 urllib 的 response 对象,使用 r.raw.read()   
    r.ok                             # 查看r.ok的布尔值便可以知道是否登陆成功
    r.json()                         #Requests中内置的JSON解码器,以json形式返回,前提返回的内容确保是json格式的,不然解析出错会抛异常
    r.raise_for_status()             #失败请求(非200响应)抛出异常
  • 爬取下来的网页,打印出来时发现中文乱码了,因此需要指定编码方式为 utf-8

提取图片和名称

import re

# td正则
wrapReg = r'<td width="12%"[^>]*>.*?</td>'
# 图片url正则
imgReg = r'<img src="(.*?)"'
# 天气名称正则
nameReg = r'<a[^>]*>([^>]*?)</a>'
# 颜色正则
colorReg = r'bgcolor="(.*?)"'

def run():
  # 爬取网页
  text = getPage()
  # 拿到td标签里的内容
  lis = re.findall(wrapReg, text, re.S|re.M)
  for item in lis:
    bgcolor = re.findall(colorReg, item, re.S|re.M)
    imgUrl = re.findall(imgReg, item, re.S|re.M)
    nameStr = re.findall(nameReg, item, re.S|re.M)
    if imgUrl and len(imgUrl) > 0 and nameStr and len(nameStr) > 0 and bgcolor and len(bgcolor) > 0:
      print('------------')
      print(imgUrl[0], nameStr[0], bgcolor[0])
  1. 首先我们拿到网页的源码 res.text
  2. 然后正则匹配包裹图片和名称的 td 标签,这里需要匹配包含 td 元素。为什么?后面会有说明

    re.findall(pattern, string, flags=0)
    返回string中所有与pattern匹配的全部字符串,返回形式为数组

    wrapReg = r'<td width="12%"[^>]*>.*?</td>'
    1.一个 . 就 是匹配除 n (换行符)以外的任意一个字符
    2.* 前面的字符出现0次或以上
    3..* 贪婪,匹配从.*前面为开始到后面为结束的所有内容
    4..*? 非贪婪,遇到开始和结束就进行截取,因此截取多次符合的结果,中间没有字符也会被截取
    5.(.*?) 非贪婪,与上面一样,只是与上面的相比多了一个括号,只保留括号的内容,在这里,如果加上括号,则只返回td标签的子元素,不返回td标签本身

    修饰符     描述
    re.I      使匹配对大小写不敏感
    re.L      做本地化识别(locale-aware)匹配
    re.M      多行匹配,影响 ^ 和 $
    re.S      使 . 匹配包括换行在内的所有字符
    re.U      根据Unicode字符集解析字符。这个标志影响 \w, \W, \b, \B.
    re.X      该标志通过给予你更灵活的格式以便你将正则表达式写得更易于理解
  3. 循环 td 标签列表,继续用正则匹配 td 标签里的 图片url天气名称,td 标签下还有 p > a 标签包裹,图片只需要img 标签 src 属性里面的内容,而天气名称是拿整个 a 标签里的内容,这里注意看括号的位置
    在这里插入图片描述
    在这里插入图片描述
  4. 最后就可以根据图片url和天气名称下载保存图片了,但是还有个问题需要注意,把网页拉到下面发现,td 标签里面可能是空的,因此需要判断是否有正确匹配才继续

在这里插入图片描述

  1. 另外,还需要匹配一个 td 的属性,bgcolor ,这个也会在后面说明

下载保存图片

# 后缀正则
suffixReg = r'\.([^.]*?)$'
def saveFile(url, name, bgcolor):
  # 获取后缀
  suffix = re.findall(suffixReg, url)
  # 下载文件
  res = requests.get(url)
  # 根据bgcolor区分白天和黑夜文件路径
  filePath = 'day/' if bgcolor == '#FEE6C5' else 'night/'
  print('filePath --> ', filePath)
  # 文件名
  fileName = filePath + name + '.' + suffix[0]
  with open(fileName, 'wb') as f:
    # 保存文件
    f.write(res.content)
    f.close
  • 前面提到,为什么要匹配包含 td 标签以及 bgcolor 有啥用?去掉 td 标签本身不是更简洁?这是因为白天夜间 的天气名称是一样的,如果不分白天夜间,那么保存了白天的图片,程序执行到保存夜间图片的时候,会把白天的图片替换掉。而白天和夜间的图片和名称正则都是相同的,有什么办法来区分白天和黑夜?
  • 回去看源代码,发现了白天和黑夜 td 标签有个属性,白天的 bgcolor="#FEE6C5",而夜间的 bgcolor="#D8E7F8",因此就可以用这个属性来区分,分别将白天图片保存到 day目录下,夜间图片保存到 night目录。需要在当前路径下新建day 和 night 文件夹,否则会报错
  • 另外,保存图片的时候只有图片名称,没有图片后缀,而图片url又刚好有图片的后缀,所以就可以根据图片url的后缀来确定文件的后缀

完整代码

Image placeholder
LiJie123
未设置
  35人点赞

没有讨论,发表一下自己的看法吧

推荐文章
【python测试开发栈】帮你总结python random模块高频使用方法

随机数据在平时写python脚本时会经常被用到,比如随机生成0和1来控制逻辑、或者从列表中随机选择一个元素(其实抽奖程序也类似,就是从公司所有人中随机选择中奖用户)等等。这篇文章,就帮大家整理在pyt

流畅的Python读书笔记 --- 第一章 Python数据模型

近期开始读“流畅的Python”这本书,想把自己的读书笔记分享给大家,希望能帮到也对这本书感兴趣但是没时间看的各位。(文章中大部分的话和图片摘录总结自“流畅的Python”一书,以及python官方网

【python测试开发栈】帮你总结python time模块高频使用方法

在平时写python脚本时,时间是我们经常用到的数据,比如:时间戳、前端展示的对应格式的时间等,在python中主要有三个和时间处理相关的模块:time、datetime、calendar,这篇文章主

中国AI人才图鉴:59%的中国籍研究员隶属美国研究机构

大数据文摘出品编译:Walker、蒋宝尚研究人员很容易被人们忽略,但不可否认,他们才是所有AI生态系统的核心组成部分。长期以来,中国和美国在人工智能方面的实力对比一直存在争议,但相关的数据支撑较弱。因

超8千Star,火遍Github的Python反直觉案例集!

大数据文摘授权转载作者:SatwikKansal译者:暮晨Python,是一个设计优美的解释型高级语言,它提供了很多能让程序员感到舒适的功能特性。但有的时候,Python的一些输出结果对于初学者来说似

面向回家编程!GitHub标星两万的”Python抢票教程”,我们先帮你跑了一遍

盼望着,盼望着,春节的脚步近了,然而,每年到这个时候,最难的,莫过于一张回家的火车票。据悉,今年春运期间,全国铁路发送旅客人次同比将增长8.0%。达到4.4亿人次,2020年铁路春运自1月10日开始,

CSS小图标不加载问题

CSS小图标不加载问题css小图标不加载的原因:●文件引入不全●css样式丢失(类名填写错误、css文件路径错误)解决方法:1、首先将需要的图标下载下来以下是iconfont下载的图标目录2、将ico

css3有内置图标吗?

css3有内置图标吗?css3没有内置图标,所有的图标都需要用户自己下载后使用。但是我们可以通过设置特殊字符,来实现图标的样式。(推荐学习:CSS视频教程)下面是一个特殊字符来代替图标的案例:

56岁潘石屹下决心学Python,60岁程序语言之父们还在敲代码,你呢

比你成功的人,比你还努力。上周,SOHO中国董事长、地产大亨 潘石屹,56岁生日当天发布微博宣布进军编程语言Python。 紧接着第二天,又更新微博解释为何会做出此举。潘石屹给出的解释大致就是,在不断

2019 最新计算机技能排名出炉:Python 排第三,第一名是…

除了编程语言之外,要想找一份计算机相关的工作,还需要很多其他方面的技能。最近,来自美国求职公司Indeed的一份报告显示:在全美工作技能需求中,数据库语言SQL、编程语言Java分列前两位。虽然Pyt

4分钟看尽Top编程语言15年沉浮:C#默Java泪,Python终上位!

大数据文摘出品作者:宁静哪种编程语言最火爆?在不同的时代,这个问题也有着不同的答案,而一部编程语言的使用人数变迁史,实际上也是一部计算机世界的成长编年史。一位名叫PYPL的油管up主很尽心地统计了从2

Python分析42年高考数据,告诉你高考为什么这么难?

大数据文摘授权转载自数据森麟作者:徐麟对于已经工作的“上班族”来说,6月7号到9号三天无疑是兴奋到飞起的,终于迎来了令人愉悦的端午假期。然而有那么一群人,将在端午节日之际迎来人生特别重要的一次经历或者

推荐:10个Python图像处理工具

概述了一些常用的Python库,它们提供了一种简单直观的图像转换方法。介绍在我们今天的世界中有很多的数据,而图像是这些数据中的重要组成部分。但是,要使用这些图像,需要对它们进行处理。因此,图像处理是分

Python面试|一文让你读懂if __name__==’__main__’的含义

程序入口对于很多编程语言来说,程序都必须要有一个入口,比如C,C++,以及完全面向对象的编程语言Java,C#等。如果你接触过这些语言,对于程序入口这个概念应该很好理解,C和C++都需要有一个main

大神程序员,夜夜coding到天明?Python之父昼伏夜出,PHP创始人24小时都在线

栗子鱼羊 发自凹非寺转自量子位 |公众号QbitAI大神程序员,夜夜coding到天明?有位名叫IvanBessarabov(简称“伊万”)的好事者,刚刚统计了各路大佬的代码提交(gitcommit)

用 Python 给女友做了个可能会被打死的七夕礼物

马上就是七夕了,晓得你们有女票的或者正在追妹子的,肯定又在绞尽脑汁想买什么别出新裁的礼物,如果女生感觉你的礼物花心思了,那肯定是好感度倍增啊。今天给各位分享一个用Python制作的成本一毛钱却诚意满满

python使用jieba实现中文文档分词和去停用词

分词工具的选择:  现在对于中文分词,分词工具有很多种,比如说: jieba分词、thulac、SnowNLP等。在这篇文档中,笔者使用的jieba分词,并且基于python3环境,选择jieba分词

PHP跌出前十,铁打的 Python 连续3年第一:IEEE Spectrum 2019编程语言排行榜出炉

Python势头不减,依旧第一,而且进一步拉开了与其他语言的差距。这一结果,来自IEEESpectrum2019年度编程语言排行榜。这已经是Python连续3年保持第一。在Python之下,第二交椅的

最受欢迎的编程语言排行:Python与Java谁更受欢迎?

Python在全球开发人员中的受欢迎程度急剧上升,专注于研究开发人员的SlashData最近公布了实际使用该语言的开发人员数量。根据SlashData的数据,目前世界上有820万使用Python编写代

为什么说 Python 是人工智能最佳Web开发的语言?

由于所有用户都可以使用大量的预构建库,因此Python非常适合人工智能在Web开发中的应用–但是还有什么能让它变得如此吸引人?在AbsoluteDigitalMedia,我们将仔细研究Python的历

史上第一张黑洞照片是用Python合成的?

这两天,史上第一张黑洞照片,在朋友圈和各大公众号疯传,希望你没有收到视觉中国的律师函。好了,言归正传。这个照片是怎么「拍到」的呢?其中一位研究人员(一个妹子,MIT 的博士,就是头图这位)就在 TED

流畅的python学习笔记-第4章

第4章文本和字节序列[toc]编码和解码markdom可以插入emoji表情包其中作为前缀,x1f54为对应表情的unicode编码🥺emoji 把码位转换成字节序列的过程是编码;把字节序列转换成码位

新书发售丨《Python3 反爬虫原理与绕过实战》

无论是在学习还是工作中,反爬虫技术是所有爬虫工程师都要面对的问题。常见的反爬虫原理和绕过技巧也是中高级爬虫工程师面试中关注的焦点,尤其是那些竞争激烈的大型互联网企业。作为一名开发者,了解反爬虫原理和绕

流畅的python学习笔记-第5章

第5章函数[toc]函数在python中一切都可以视作为对象,包括函数deffunction_try(): '''itisfuncitontrydoc''' print('function_tryd

第 426 期 Python 周刊

文章,教程和讲座端到端机器学习:从数据收集到模型部署链接:https://ahmedbesbes.com/end-to-end-ml.html在本文中,我们将完成构建和部署机器学习应用程序的必要步骤。