鱼C论坛

 找回密码
 立即注册
查看: 1933|回复: 1

[作品展示] 爬取城市历史天气数据并保存在Excel中

[复制链接]
发表于 2020-4-13 13:44:15 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
输入城市名称和年份,获取2011~2019年中任意一年的历史天气并保持在excel中
感觉用正则表达式有点繁杂了
城市和年份太多,只测试了几个城市,不保证每个城市每个年份都能查到

  1. import requests
  2. from bs4 import BeautifulSoup
  3. import openpyxl
  4. import re

  5. #查找日期正则表达式
  6. find_date = re.compile(r'<div><a href="//lishi.tianqi.com/.*?/(.*?).html"',re.S)
  7. #查找最高温度正则表达式
  8. find_htemp = re.compile(r'<div style="width: 100px">(\d{1,2}|-\d{1,2})</div>',re.S)
  9. #查找最低温度正则表达式
  10. find_dtemp = re.compile(r'<div>(\d{1,2}|-\d{1,2})</div>',re.S)
  11. #查找天气情况正则表达式
  12. find_tianqi = re.compile(r'<div>([^0-9]*?)</div>',re.S)
  13. #查找风力正则表达式
  14. find_fengli = re.compile(r'<div style="width:200px;">(.*?)</div>',re.S)

  15. #生成查询网址的函数
  16. def genHTML(cityname,year):
  17.     months = ["%d%02d" % (year, month + 1) for month in range(12)]
  18.     todo_urls = [f"http://lishi.tianqi.com/{cityname}/{month}.html" for month in months]
  19.     return todo_urls


  20. #抓取网页信息
  21. def askURL(url):
  22.     headers = {
  23.         "User-Agent": "Mozilla / 5.0(Windows NT 10.0; WOW64) AppleWebKit / 537.36(KHTML, like Gecko) Chrome/78.0.3904.108 Safari / 537.36"
  24.     }
  25.     res = requests.get(url, headers=headers)
  26.     res = res.content.decode("utf-8")
  27.     return res

  28. #解析网页信息
  29. def getdata(res):
  30.     datalist = [ ]
  31.     soup = BeautifulSoup(res, "html.parser")
  32.     data = soup.find_all('ul',class_="lishitable_content clearfix")
  33.     data = str(data)

  34.     dates = re.findall(find_date,data)
  35.     dtemp = re.findall(find_dtemp,data)
  36.     htemp = re.findall(find_htemp,data)
  37.     tianqi = re.findall(find_tianqi,data)
  38.     fengli = re.findall(find_fengli,data)

  39.     for i in range(len(dates)):
  40.         datalist.append([dates[i],dtemp[i],htemp[i],tianqi[i],fengli[i]])

  41.     return datalist

  42. #保存信息至文件
  43. def saveData(datalist,cityname,year):
  44.     wb = openpyxl.Workbook()
  45.     ws = wb.active

  46.     ws['A1'] = "日期"
  47.     ws['B1'] = "最低温度"
  48.     ws['C1'] = "最高温度"
  49.     ws['D1'] = "天气"
  50.     ws['E1'] = "风力"

  51.     #datalist为双层列表
  52.     for i in range(12):
  53.         for each in datalist[i]:
  54.             ws.append(each)

  55.     wb.save("%d年%s历史天气.xlsx"%(year,cityname))

  56. def main():
  57.     print("-------历史天气查询系统-------")
  58.     cityname = input("请输入城市名称(小写全拼):")
  59.     year = int(input("请输入查询年份:"))
  60.     urls = genHTML(cityname,year)
  61.     result = []
  62.     for i in range(12):
  63.         res = askURL(urls[i])
  64.         result.append(getdata(res))

  65.     saveData(result,cityname,year)


  66. if __name__ == '__main__':
  67.     main()
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-4-13 20:51:48 | 显示全部楼层
沙发
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-6-15 11:15

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表