下面是使用Python Scrapy爬取天气数据并导出CSV文件的完整攻略,包括以下步骤:
第一步:安装Scrapy
Scrapy是一个Python爬虫框架,可以大大简化爬取网页的过程。安装Scrapy的方法是打开命令行窗口(或者终端),输入以下命令:
pip install scrapy
第二步:创建一个Scrapy项目
在命令行窗口中,输入以下命令:
scrapy startproject weather
其中,weather
为项目的名称,你可以根据自己的需求随意取名。
第三步:创建一个Spider
在Scrapy中,Spider的作用是定义要爬取的数据源以及如何爬取。我们可以在项目的根目录下创建一个名为weather_spider.py
的文件,用于定义我们对天气数据的爬取方式。
以下是一个示例,爬取的数据源为中国天气网,代码如下:
import scrapy
class WeatherSpider(scrapy.Spider):
name = "weather" # Spider名称
start_urls = [
'http://www.weather.com.cn/weather/101010100.shtml' # 要爬取的网页地址
]
def parse(self, response):
# 解析HTML页面
yield {
'city': response.css('.crumbs.fl h2::text').get().strip(), # 获取城市名称
'temperature': response.css('.tem span::text').get(), # 获取当天温度
'weather': response.css('.wea::text').get() # 获取当天天气情况
}
从代码中可以看出,我们定义了一个名为WeatherSpider
的Spider类,其继承自Scrapy提供的Spider类,重写了其中的parse
方法。该方法用于解析HTML页面,并将解析后的结果返回。
在该示例中,我们使用了Scrapy提供的css
选择器来获取页面中的相关内容,例如获取城市名称的代码为response.css('.crumbs.fl h2::text').get().strip()
,获取当天温度的代码为response.css('.tem span::text').get()
,获取当天天气情况的代码为response.css('.wea::text').get()
。
注意:这里我们通过在后台代码中硬编码地址来爬取天气数据,实际上有些天气网站提供API供我们使用,我们应该优先考虑使用API获取数据。
第四步:导出CSV文件
完成上面几个步骤后,我们已经可以爬取天气数据了。接下来,我们需要将这些数据导出至CSV文件中。我们可以在项目根目录下创建一个名为output.py
的Python脚本,用于将数据写入CSV文件中。
以下是一个示例代码:
import csv
with open('weather.csv', mode='w', newline='') as weather_file:
fieldnames = ['city', 'temperature', 'weather']
writer = csv.DictWriter(weather_file, fieldnames=fieldnames)
writer.writeheader()
writer.writerow({'city': '北京', 'temperature': '22℃', 'weather': '晴'})
writer.writerow({'city': '上海', 'temperature': '25℃', 'weather': '多云'})
上面的代码演示了如何将Python中的数据写入CSV文件。其中,with open('weather.csv', mode='w', newline='') as weather_file:
代表打开一个名为weather.csv的CSV文件,并以写入模式打开。我们通过csv.DictWriter对象写入数据。
在示例中,我们将城市名称、当天温度、当天天气写入到了文件中。产生的文件如下:
city,temperature,weather
北京,22℃,晴
上海,25℃,多云
示例一:爬取今日天气数据
我们可以通过修改weather_spider.py
文件中的start_urls
字段,修改为想要抓取的天气预报的页面地址。例如,我们要抓取的是今天北京市的天气预报,可以将该字段设置为:
start_urls = [
'http://www.weather.com.cn/weather/101010100.shtml'
]
然后执行以下命令即可:
scrapy crawl weather -o weather.csv
这条命令的含义是,运行名为weather
的Spider类,并将结果输出到weather.csv
文件中。运行命令后,我们将获得一个weather.csv
文件,其中记录了今天北京市的天气数据。
示例二:爬取多天天气数据
如果我们想要一次性抓取多天、多个城市的天气预报,可以通过修改返回结果来实现。以下是一个示例代码:
import scrapy
class WeatherSpider(scrapy.Spider):
name = "weather" # Spider名称
start_urls = [
'http://www.weather.com.cn/weather/101010100.shtml', # 北京
'http://www.weather.com.cn/weather/101020100.shtml', # 上海
'http://www.weather.com.cn/weather/101030100.shtml', # 天津
'http://www.weather.com.cn/weather/101280101.shtml', # 广州
'http://www.weather.com.cn/weather/101280601.shtml', # 深圳
]
def parse(self, response):
# 解析HTML页面
city = response.css('.crumbs.fl h2::text').get().strip() # 获取城市名称
for i in range(1, 7): # 获取接下来七天的天气数据
yield {
'city': city, # 城市名称
'date': response.css(f'#day_{i} b::text').get(), # 日期
'temperature': response.css(f'#day_{i} .tem b::text').get(), # 白天温度
'weather_day': response.css(f'#day_{i} .wea::text').get(), # 白天天气情况
'temperature_night': response.css(f'#night_{i} .tem b::text').get(), # 夜晚温度
'weather_night': response.css(f'#night_{i} .wea::text').get(), # 夜晚天气情况
}
在上述代码中,我们将start_urls
字段设置为要抓取数据的多个城市天气页面地址。在parse
方法中,我们循环获取接下来七天的天气数据,将这些数据返回。当执行以下命令时,我们将获得一个含有多个城市、多天天气数据的CSV文件。
scrapy crawl weather -o weather.csv
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:使用python scrapy爬取天气并导出csv文件 - Python技术站