爬虫实战-爬取天气预报

记录自己的成长

Posted by BY on May 12, 2019
废话不多说上源码才是大家最需要的,任务上紧急的理解是必须的(后续我会注意注释的加入)

历史天气预报数据:

import requests
from lxml import etree
import time
import re

city = 'hangzhou'
index_url = 'http://www.tianqihoubao.com/lishi/{}.html'

index_page = requests.get(index_url.format(city))
index_html = etree.HTML(index_page.text)

year_ele = index_html.xpath('//*[@id="content"]/div[@class="box pcity"]')
temp_m = []
for year in year_ele:
    for month in year.xpath('ul/li/a'):
        month_id = month.xpath('text()')[0]
        month_url = month.xpath('@href')[0]
        temp_m.append([month_id,month_url])


def month_range(start='',end=''):
    month_list = []
    while int(start[:4])<int(end[:4]):
        month_list.append(start)
        if start[4:6] == '12':
            start = str(int(start[:4]) + 1) + '01'
        else:
            start = str(int(start) + 1)
    while int(start) < int(end):
        month_list.append(start)
        start = str(int(start) + 1)
    month_list.append(end)
    return month_list


temp_d = []
url = 'http://www.tianqihoubao.com/lishi/{0}/month/{1}.html'

for year in month_range('201904','201904'):
    print(year,'天气数据下载中……')
    temp_page = requests.get(url.format(city, year))
    print(year,'数据下载成功')
    temp_html = etree.HTML(temp_page.text)
    temp_ele = temp_html.xpath('//*[@class="wdetail"]/table/tr')
    print(temp_ele)
    for day in temp_ele[1:]:
        date_time = day.xpath('td[1]/a/text()')[0].strip()
        print(date_time, end=' ')
        date_id = ''.join(re.findall('(.*?)年(.*?)月(.*?)日',date_time)[0])
        print(date_id, end=' ')
        date_weth = day.xpath('td[2]/text()')[0].strip().replace(' ','').replace('\r\n', '')
        print(date_weth, end=' ')
        date_weth_day = date_weth.split('/')[0]
        print(date_weth_day,end=' ')
        date_weth_night = date_weth.split('/')[1]
        print(date_weth_night, end=' ')
        date_temp = day.xpath('td[3]/text()')[0].strip().replace(' ','').replace('\r\n', '')
        print(date_temp, end=' ')
        date_temp_day = date_temp.replace('℃', '').split('/')[0]
        print(date_temp_day, end=' ')
        date_temp_night = date_temp.replace('℃', '').split('/')[1]
        print(date_temp_night, end=' ')
        date_windlv = day.xpath('td[4]/text()')[0].strip().replace(' ','').replace('\r\n', '')
        print(date_windlv, end=' ')
        date_windlv_day = date_windlv.split('/')[0]
        print(date_windlv_day, end=' ')
        date_windlv_night = date_windlv.split('/')[1]
        print(date_windlv_night, end=' ')
        temp_d.append([date_id, date_weth_day, date_weth_night, date_temp_day,
                       date_temp_night, date_windlv_day, date_windlv_night, date_id[:4], date_id[4:6]])
        print()
    time.sleep(10)


结果展示

2019年04月01日 20190401 晴/晴 晴 晴 18℃/8℃ 18 8 东北风3-4级/东北风3-4级 东北风3-4级 东北风3-4级 2019年04月02日 20190402 小雨/小雨 小雨 小雨 17℃/11℃ 17 11 东北风1-2级/东北风1-2级 东北风1-2级 东北风1-2级 2019年04月03日 20190403 阴/多云 阴 多云 15℃/10℃ 15 10 东北风1-2级/东北风1-2级 东北风1-2级 东北风1-2级 2019年04月04日 20190404 小雨/小雨 小雨 小雨 16℃/12℃ 16 12 东北风1-2级/东北风1-2级 东北风1-2级 东北风1-2级 2019年04月05日 20190405 多云/多云 多云 多云 23℃/12℃ 23 12 西南风1-2级/西南风1-2级 西南风1-2级 西南风1-2级 2019年04月06日 20190406 晴/晴 晴 晴 28℃/14℃ 28 14 西南风1-2级/西南风1-2级 西南风1-2级 西南风1-2级

最近三天的天气预报:

from lxml import etree
import ssl
import requests

index_page = requests.get('http://www.tianqihoubao.com/yubao/hangzhou.html')
#print(index_page)
index_html = etree.HTML(index_page.text)
hztq = index_html.xpath('//*[@class="wdetail"]/table/tr')
print(hztq)
num = 0
for day in hztq[1:]:
    if num % 2 == 0:
        day_time = day.xpath('td[1]/text()')[0].strip()
        print(day_time)
        day_status = day.xpath('td[2]/text()')[0].strip()
        print(day_status, end='\t')
        day_weather = day.xpath('td[3]/b/text()')[0].strip()
        print(day_weather, end='\t')
        day_high = day.xpath('td[4]/b/text()')[0].strip()
        print(day_high, end='\t')
        day_rain = day.xpath('td[5]/text()')[0].strip()
        print(day_rain, end='\t')
    else:
        day_status = day.xpath('td[1]/text()')[0].strip()
        print(day_status, end='\t')
        day_weather = day.xpath('td[2]/b/text()')[0].strip()
        print(day_weather, end='\t')
        day_high = day.xpath('td[3]/b/text()')[0].strip()
        print(day_high, end='\t')
        day_rain = day.xpath('td[4]/text()')[0].strip()
        print(day_rain, end='\t')
    num += 1
    print('')

结果展示:

[<Element tr at 0x116b7aac8>, <Element tr at 0x116b7ab08>, <Element tr at 0x116b7ab48>, <Element tr at 0x116b7ab88>, <Element tr at 0x116b7abc8>, <Element tr at 0x116b7ac48>, <Element tr at 0x116b7ac88>]
2019-05-11
白天	晴	30℃	东北风 4-5级	
夜间	晴	18℃	东北风 4-5级	
2019-05-12
白天	多云	30℃	东北风 4-5级	
夜间	小到中雨	19℃	东北风 4-5级	
2019-05-13
白天	小雨	25℃	东北风 1-2级	
夜间	阴	19℃	东北风 1-2级