Python命令行实现—查全国7天天气

开发 后端
为什么要爬天气呢?1.可以练练手2.利用itchat库实现自动回复功能后,把查天气的功能集成起来,实现微信自助查天气功能!

为什么要爬天气呢?1.可以练练手2.利用itchat库实现自动回复功能后,把查天气的功能集成起来,实现微信自助查天气功能!

首先,还是相似的套路,我们看看能不能在官网上直接抓包(XHR)来获取一个通用API。然后直接用API查询就OK?在百度搜关键词【天气】或者【南京天气】会跳出对应的网页:http://www.weather.com.cn/weather/101190101.shtml.点进去,可以看到相应城市下一周的天气情况:

 

Python命令行实现—查全国7天天气

再换一个城市上海,我们发现,浏览器地址变为:http://www.weather.com.cn/weather/101020100.shtml。原来101020100这串数字对应着相应城市的代码。我们来分析下页面上XHR请求,看看有没有直接抓包的可能?

经过谷歌浏览器——检查-Networt-XHR-刷新,发现并没有XHR请求,看来我们需要的天气内容和城市代码,可能是包含在页面中经过JS和服务器处理后呈现的.....好吧,尝试失败!

再看一下JS请求,发现太多了,无力去逐一查看!所幸网上有人早已记录下了所有城市对应的城市代码。我把拷贝了一下,存到了本地mysql,数据在百度云上,需要的可以自行下载下,执行SQL即可直接把SQL表和数据一并建好。https://pan.baidu.com/s/1kXaN2Aj 密码是:8y6n。

好了,准备工作做完了,现在思路就很清楚了,全国城市和代码都有了,我们查某个城市的天气,只需要输入城市,就可以从mysql里获取对应的城市代码如:101020100,然后构造相应的url:http://www.weather.com.cn/weather/101190101.shtml就可以查看到对应城市的7天天气了,然而,页面并没有XHR和直接可用的json数据,那我们只能自己动手了——分析网页内容,动手写正则表达式/beautifulSoup/Xpath来提取页面信息,具体内容在此就不赘述了,详见代码就好:

  1. import re 
  2. import pymysql 
  3. import requests 
  4. from bs4 import BeautifulSoup 
  5.  
  6. class SearchWeather(): 
  7.     def __init__(self): 
  8.         self.HEADERS ={ 
  9.         'User-Agent''Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 ''(KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36'
  10.         self.CONNECTION = pymysql.connect(host='localhost',user='root',password='xxx',db='xxx',charset='utf8',cursorclass=pymysql.cursors.DictCursor) 
  11.  
  12.     def getcityCode(self,cityName): 
  13.         SQL = "SELECT cityCode FROM cityWeather WHERE cityName='%s'" % cityName 
  14.         try: 
  15.             with self.CONNECTION.cursor() as cursor
  16.                 cursor.execute(SQL) 
  17.                 self.CONNECTION.commit() 
  18.                 result = cursor.fetchone() 
  19.                 return result['cityCode'
  20.         except Exception as e: 
  21.             print(repr(e)) 
  22.  
  23.     def getWeather(self,cityCode,cityname): 
  24.         url = 'http://www.weather.com.cn/weather/%s.shtml' % cityCode 
  25.         html = requests.get(url,headers = self.HEADERS) 
  26.         html.encoding='utf-8' 
  27.         soup=BeautifulSoup(html.text,'lxml'
  28.         weather = "日期      天气    【温度】    风向风力\n" 
  29.         for item in soup.find("div", {'id''7d'}).find('ul').find_all('li'): 
  30.             date,detail = item.find('h1').string, item.find_all('p'
  31.             title = detail[0].string 
  32.             templow = detail[1].find("i").string 
  33.             temphigh = detail[1].find('span').string if detail[1].find('span')  else '' 
  34.             wind,direction = detail[2].find('span')['title'], detail[2].find('i').string 
  35.             if temphigh==''
  36.                 weather += '你好,【%s】今天白天:【%s】,温度:【%s】,%s:【%s】\n' % (cityname,title,templow,wind,direction) 
  37.             else
  38.                 weather += (date + title + "【" + templow +  "~"+temphigh +'°C】' + wind + direction + "\n"
  39.         return weather 
  40.  
  41.     def main(self,city): 
  42.         cityCode = self.getcityCode(city) 
  43.         detail = self.getWeather(cityCode,city) 
  44.         print (detail) 
  45.  
  46. if __name__ == "__main__"
  47.     weather = SearchWeather() 
  48.     weather.main(city=input('请输入城市名称:')) 

代码运行效果如下:

 

Python命令行实现—查全国7天天气

 

责任编辑:未丽燕 来源: 今日头条
相关推荐

2020-12-11 06:44:16

命令行工具开发

2020-12-10 16:16:08

工具代码开发

2015-10-19 17:16:10

天气预报命令行Linux

2010-10-12 17:13:43

MySQL命令行

2010-03-10 17:23:37

Python 命令行参

2010-11-16 11:50:21

oracle命令行登录

2021-07-07 08:01:51

命令行Dotnet Core控制台

2010-11-16 11:55:31

Oracle命令行

2015-07-30 11:04:08

Linux命令行工具

2015-07-30 11:24:47

Linux 系统命令行工具

2015-07-29 10:34:50

Linux系统命令行工具

2018-05-04 09:15:35

PythonPlumbum命令行

2010-03-11 15:55:23

Python命令行

2015-07-01 09:15:46

linuxQuora命令行

2010-11-24 14:51:55

Mysql命令行

2017-07-10 14:00:04

Python命令行

2010-02-23 16:06:58

Python 命令行

2018-07-05 08:30:54

Python命令行工具shell

2009-12-08 14:31:31

PHP命令行读取参数

2021-11-15 14:30:49

Pythonargparse编程语言
点赞
收藏

51CTO技术栈公众号