您好,登录后才能下订单哦!
密码登录
登录注册
点击 登录注册 即表示同意《亿速云用户服务条款》
# Python中Scrapy如何抓取并分析天气数据
## 一、Scrapy框架简介
Scrapy是Python生态中最强大的网络爬虫框架之一,采用异步处理架构,具有以下核心优势:
- 内置高性能下载器(基于Twisted)
- 完善的中间件扩展机制
- 支持XPath和CSS选择器
- 自动处理编码与异常
- 内置数据导出管道
## 二、目标分析:天气数据源选择
### 2.1 常见数据源对比
| 数据源 | 优点 | 缺点 |
|--------------|-----------------------|-----------------------|
| 中国天气网 | 官方数据权威 | 反爬机制严格 |
| Weather.com | 国际数据全面 | 需要处理英文数据 |
| 聚合数据API | 接口规范 | 有调用次数限制 |
### 2.2 示例选择
本文以中国天气网(www.weather.com.cn)为例,抓取北京未来7天天气预报数据。
## 三、项目搭建实战
### 3.1 创建Scrapy项目
```bash
pip install scrapy
scrapy startproject weather_spider
cd weather_spider
scrapy genspider weather www.weather.com.cn
settings.py
关键配置:
USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
ROBOTSTXT_OBEY = False
DOWNLOAD_DELAY = 2 # 降低请求频率
ITEM_PIPELINES = {
'weather_spider.pipelines.WeatherSpiderPipeline': 300,
}
items.py
:
import scrapy
class WeatherItem(scrapy.Item):
date = scrapy.Field() # 日期
temp = scrapy.Field() # 温度范围
weather = scrapy.Field() # 天气状况
wind = scrapy.Field() # 风力风向
humidity = scrapy.Field() # 湿度
weather.py
:
import scrapy
from weather_spider.items import WeatherItem
class WeatherSpider(scrapy.Spider):
name = 'weather'
allowed_domains = ['weather.com.cn']
start_urls = ['http://www.weather.com.cn/weather/101010100.shtml']
def parse(self, response):
for day in response.css('div#7d ul li'):
item = WeatherItem()
item['date'] = day.css('h1::text').get()
item['weather'] = day.css('p.wea::text').get()
item['temp'] = '/'.join(day.css('p.tem span::text, p.tem i::text').getall())
item['wind'] = day.xpath('.//p[@class="win"]/i/text()').get()
yield item
scrapy-fake-useragent
库middlewares.py
pipelines.py
示例(MongoDB存储):
import pymongo
class WeatherSpiderPipeline:
def __init__(self):
self.client = pymongo.MongoClient('mongodb://localhost:27017')
self.db = self.client['weather_db']
def process_item(self, item, spider):
self.db['beijing'].insert_one(dict(item))
return item
使用Pandas进行基础分析:
import pandas as pd
from matplotlib import pyplot as plt
df = pd.DataFrame(list(db.beijing.find()))
df['high_temp'] = df['temp'].str.extract('(\d+)℃').astype(int)
# 绘制温度变化曲线
plt.figure(figsize=(10,5))
df.plot(x='date', y='high_temp', kind='line')
plt.title('北京未来7天最高气温变化')
plt.savefig('weather_trend.png')
使用scrapy-redis
实现:
# settings.py
SCHEDULER = "scrapy_redis.scheduler.Scheduler"
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
对接Selenium:
from scrapy_selenium import SeleniumRequest
yield SeleniumRequest(
url=url,
callback=self.parse_detail,
script='window.scrollTo(0, document.body.scrollHeight)'
)
通过Scrapy框架,我们实现了: 1. 高效抓取结构化天气数据 2. 数据持久化存储 3. 基础可视化分析 4. 应对常见反爬措施
完整项目代码已上传GitHub(示例仓库地址)。实际应用中建议添加异常处理、日志记录等生产级代码,并考虑使用APIScheduler实现定时抓取。 “`
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。