返回

异步获取中国天气信息实战

后端

作为一名饱含激情的技术探索者,我乐于钻研那些新奇且富有挑战性的技术领域。此次,我将带领大家深入剖析一个饶有兴味的实战项目——异步获取中国天气信息。

引言

实时天气信息对于我们日常生活和生产活动至关重要。作为一名技术爱好者,我深知开发一个能够高效获取中国天气信息的爬虫的重要性。传统的同步爬虫存在效率低下的问题,而异步编程则为我们提供了另一种选择。

异步编程简介

异步编程是一种非阻塞式编程模型,允许程序在等待IO操作完成时执行其他任务,从而提高程序的整体效率。在Python中,我们可以使用asyncio库来实现异步编程。

Scrapy框架

Scrapy是一个功能强大的网络爬虫框架,它提供了许多有用的功能,包括请求调度、数据解析和管道处理。利用Scrapy,我们可以轻松构建高效且可扩展的爬虫程序。

爬虫实战

1. 安装依赖项

首先,我们需要安装必要的依赖项:

pip install scrapy asyncio beautifulsoup4

2. 创建项目

使用Scrapy命令创建新的项目:

scrapy startproject weather

3. 编写爬虫

在weather/spiders目录中创建一个新的爬虫文件(例如weather.py):

import scrapy
from scrapy.http import HtmlResponse
from asyncio import tasks
from bs4 import BeautifulSoup

class WeatherSpider(scrapy.Spider):
    name = 'weather'
    allowed_domains = ['weather.com.cn']
    start_urls = ['https://www.weather.com.cn/weather/101010100.shtml']

    async def parse(self, response: HtmlResponse):
        # 解析页面并提取天气信息
        soup = BeautifulSoup(response.body, 'html.parser')
        weather_info = soup.find('div', class_='crumbs')
        # 异步获取空气质量信息
        air_info_task = tasks.create_task(self.get_air_info(weather_info))
        # 异步获取未来天气信息
        future_info_task = tasks.create_task(self.get_future_info(weather_info))
        # 等待任务完成
        air_info = await air_info_task
        future_info = await future_info_task
        # 拼接天气信息并保存
        weather_dict = {
            '城市': weather_info.find('a').text,
            '今日天气': weather_info.find('p', class_='tem').text,
            '空气质量': air_info,
            '未来天气': future_info
        }
        yield weather_dict

    async def get_air_info(self, weather_info: BeautifulSoup):
        # 从天气页面异步获取空气质量信息
        air_url = weather_info.find('a', class_='air').attrs['href']
        air_response = await scrapy.Request.from_crawler(
            self.crawler,
            url=air_url,
            callback=self.parse_air_info
        )
        return self.parse_air_info(air_response)

    def parse_air_info(self, response: HtmlResponse):
        # 解析空气质量页面
        soup = BeautifulSoup(response.body, 'html.parser')
        air_info = soup.find('div', class_='aqi-info').text
        return air_info

    async def get_future_info(self, weather_info: BeautifulSoup):
        # 从天气页面异步获取未来天气信息
        future_url = weather_info.find('a', class_='future').attrs['href']
        future_response = await scrapy.Request.from_crawler(
            self.crawler,
            url=future_url,
            callback=self.parse_future_info
        )
        return self.parse_future_info(future_response)

    def parse_future_info(self, response: HtmlResponse):
        # 解析未来天气页面
        soup = BeautifulSoup(response.body, 'html.parser')
        future_info = []
        for item in soup.find('ul', class_='t clearfix').find_all('li'):
            date = item.find('h1').text
            weather = item.find('p', class_='wea').text
            temperature = item.find('p', class_='tem').text
            future_info.append({
                '日期': date,
                '天气': weather,
                '温度': temperature
            })
        return future_info

4. 运行爬虫

在命令行中运行爬虫:

scrapy crawl weather -o weather.json

结论

通过本文介绍的异步编程和Scrapy框架,我们成功构建了一个高效的天气爬虫,能够从中国气象局获取实时天气信息。这个项目不仅展示了异步编程和Scrapy框架的强大功能,也为开发者提供了一个构建实用爬虫程序的范例。