python爬取实时天气

程序本身没有什么难的。

目的是从中国天气网获取天气。

经过分析,每个城市天气页面的url大概如下。

http://www.weather.com.cn/weather/101180101.shtml

其他部分都一样,其中,“101180101”,只有代表城市的数字不一样,一个城市一个编码。

本来还想整个网站爬取遍历,后面发现有人已经把城市对应的编码整理好了。

于是找了这么一个txt文件,文件里的内容大概是这个样子

101010100=北京
101010200=海淀
101010300=朝阳
101010400=顺义
101010500=怀柔

101010600=通州

....

总共大约2000 多条。

为了,保持数据稳定性,觉得把编码和城市名放到mysql里。

由于只是一次性工程,即只写入一次。

不过还是pymyqsql写进去吧,谁也不会闲着,自己动手往数据库里写2000多条数据。

代码如下:

# 前置部分,因为只需要写入一次,所以这段代码就不放进主代码里,这里就是记录一下。
# 没有做写入检测,就这样吧。

# # 把数据从city.txt写入mysql数据库

#1 链接本地的数据库

conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='密码', db='数据库名',charset='utf8') 

#创建表city_weather_code ,id是自增的并且唯一,同时设为主键;city_name,city_code分别对应城市名字和编码

create_table_sql = "CREATE TABLE IF NOT EXISTS city_weather_code ("\

	"id INT PRIMARY KEY AUTO_INCREMENT," \
	"city_name VARCHAR(30) NOT NULL ," \
	"city_code INT NOT NULL)  "
cursor = conn.cursor()   # 获取游标
cursor.execute(create_table_sql)   # 执行创建语句
conn.commit()  # 使执行创建语句生效
# 打开文件按行读取数据
with open("city.txt", 'r', encoding='utf-8') as f:    # 读的模式打开
	res = f.readlines()  #一行行读取文件,
	for i in res:  #遍历文件每一行,先去空格然后以‘’=‘’号分割。每行得到一个列表
		if i !="\n":
			data = i.strip().split("=")
			citycode = data[0]     # 把编码赋值给citycode
			cityname = data[1]   # 把城市名赋值给cityname
			insert_sql = "INSERT INTO city_weather_code(city_name,city_code) VALUE ('%s','%s')"%(cityname.strip(),citycode.strip())   # 把数据插入数据库
			cursor.execute(insert_sql)
			conn.commit()
conn.close()


以上是准备工作------------------------------------------------


程序代码如下:

import re
from bs4 import BeautifulSoup
import requests
import pymysql
import time


# 查询代码封装成函数
def check_code(check_name):
	conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='as329299', db='sky',charset='utf8')
	cursor = conn.cursor()
	select_mysql = "SELECT city_code FROM city_weather_code WHERE city_name ='%s'" % check_name
	cursor.execute(select_mysql)
	res = cursor.fetchone()  # 返回值是一个元组
	# print(res)
	conn.commit()
	cursor.close()
	conn.close()
	return res[0]

# 拼接url封装成函数
def url(code):
	# 中国天气网址天气页面url:http://www.weather.com.cn/weather/101180101.shtml,
	# 其中101180101,即是各城市的代码。代码对应城市,拼接出地址即可
	raw_url="http://www.weather.com.cn/weather/"
	url=raw_url+str(code)+".shtml"
	return url

# 获取天气
def get_weather(url):
	Header ={"User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.81 Safari/537.36"}
	res = requests.get(url, headers = Header)
	soup = BeautifulSoup(res.content, 'html.parser')
	# 下面代码解释出当前的日期、温度、天气、风向、风力
	# 关键是,代码写死了,爬取网站代码一改,又要跟着调整。
	data = soup.find(class_="t clearfix")
	date = data.li.h1.text
	print("查询的日期:", date)
	wea = soup.find_all(class_="wea")[0].text.strip()
	print("天气概况:", wea)
	tem = soup.find_all(class_="tem")[0].text.strip()
	print("当前温度:",tem)
	win = soup.find_all(class_="win")[0].span['title'].strip()
	print("风向:",win)
	leve1 = soup.find_all(class_="win")[0].i.text.strip()
	print("风力:",leve1)
	print("当前时间是:", time.asctime())

if __name__=="__main__":
	while True:
		print("--------欢迎使用py自己动手查天气--------")
		check_name = input("请输入要查询的城市[按q]退出>>>").strip()
		if check_name=="q":
			break
		else:
			try:
				code = check_code(check_name)  # 根据输入的内容数据库取对应的城市代码
				print("查询城市代码成功!")
				url = url(code)  # 拼接url
				print("正在获取天气,请稍后。。。")
				get_weather(url)  # 查询天气并输出
			except:
				print("查询失败,请输入正确的城市名称,例如[北京]、[天河],市或区县名称。")
				
				

好了,先这样。

执行结果如下:

--------欢迎使用py自己动手查天气--------
请输入要查询的城市[按q]退出>>>北京
查询城市代码成功!
正在获取天气,请稍后。。。
查询的日期: 5日(今天)
天气概况: 多云
当前温度: 3℃
风向: 西风
风力: <3级
当前时间是: Thu Apr  5 23:00:36 2018
--------欢迎使用py自己动手查天气--------

请输入要查询的城市[按q]退出>>>

enjoy it


猜你喜欢

转载自blog.csdn.net/sinat_35886587/article/details/79691948