程序本身没有什么难的。
目的是从中国天气网获取天气。
经过分析,每个城市天气页面的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