Scrapy实践----获取天气信息
scrapy是一个非常好用的爬虫框架,它是基于Twisted开发的,Twisted又是一个异步网络框架,既然它是异步的,那么执行起来肯定会很快,所以scrapy的执行速度也不会慢的!
如果你还没没有学过scrapy的话,那么我建议你先去学习一下,再来看这个小案例,毕竟这是基于scrapy来实现的!网上有很多有关scrapy的学习资料,你可以自行百度来学习!
接下来进入我们的正题:
如何利用scrapy来获取某个城市的天气信息呢?
我们爬取的网站是:天气网
城市我们可以自定义
1.创建项目名称
scrapy startproject weatherSpider
2.编写items.py文件
在这个文件中我们主要定义我们想要抓取的数据:
a.城市名(city)
b.日期(date)
c.天气状况(weather)
d.湿度(humidity)
e.空气质量(air_quality)
import scrapy
class WeatherspiderItem(scrapy.Item):
"""
设置要爬取的信息
"""
city = scrapy.Field()
date = scrapy.Field()
weather = scrapy.Field()
humidity = scrapy.Field()
air_quality = scrapy.Field()
3.打开网页
利用Chrome浏览器来提取上面5个信息

利用同样的方式我们可以找到其余4个信息个XPath表达式
4.编写爬虫文件
在第3步中我们已经找到我们想要的信息的XPath表达式了,我们就可以开始写代码了
import scrapy
from scrapy import loader
from ..items import WeatherspiderItem
class WeatherSpider(scrapy.Spider):
name = 'weather'
allowed_domains = ['tianqi.com']
# 这是事先定义好的城市,我们还可以在里面添加其他城市名称
cities = ['shanghai', 'hangzhou', 'beijing']
base_url = 'https://www.tianqi.com/'
start_urls = []
for city in cities:
start_urls.append(base_url + '{}'.format(city))
def parse(self, response):
"""
提取上海今天的天气信息
:param response:
:return:
"""
# 创建一个ItemLoader,方便处理数据
iloader = loader.ItemLoader(WeatherspiderItem(),response=response)
iloader.add_xpath("city", '//dl[@class="weather_info"]//h2/text()')
iloader.add_xpath('date', '//dl[@class="weather_info"]/dd[@class="week"]/text()')
iloader.add_xpath('weather', '//dl[@class="weather_info"]/dd[@class="weather"]'
'/p[@class="now"]/b/text()')
iloader.add_xpath('weather', '//dl[@class="weather_info"]/dd[@class="weather"]'
'/span/b/text()')
iloader.add_xpath('weather', '//dl[@class="weather_info"]/dd[@class="weather"]'
'/span/text()')
iloader.add_xpath('humidity', '//dl[@class="weather_info"]/dd[@class="shidu"]'
'/b/text()')
iloader.add_xpath('air_quality', '//dl[@class="weather_info"]/dd[@class="kongqi"]'
'/h5/text()')
iloader.add_xpath('air_quality', '//dl[@class="weather_info"]/dd[@class="kongqi"]'
'/h6/text()')
return iloader.load_item()
如果觉得困惑为何要使用ItemLoader的话,建议去读一下关于ItemLoader的官方文档:传送门
5.结果保存为JSON格式
要想把我们提取的结果保存到某种文件中,我们需要编写pipelines
import os
import json
class StoreAsJson(object):
def process_item(self, item, spider):
# 获取工作目录
pwd = os.getcwd()
# 在当前目录下创建文件
filename = pwd + '/data/weather.json'
with open(filename, 'a') as fp:
line = json.dumps(dict(item), ensure_ascii=False) + '\n'
fp.write(line)
6.添加设置信息
我们写的pipelines文件要起作用,需要在settings.py中设置
ITEM_PIPELINES = {
'WeatherSpider.pipelines.StoreAsJson': 300,
}
7.启动爬虫
scrapy crawl wether
8.参考资料
从零开始写Python爬虫 --- 2.3 爬虫实践:天气预报&数据存储
如果大家喜欢的话,请点个赞!!O(∩_∩)O
Scrapy实践----获取天气信息的更多相关文章
- 半吊子学习Swift--天气预报程序-获取天气信息
昨天申请的彩云天气Api开发者今天上午已审核通过  饭后运动过后就马不停蹄的来测试接口,接口是采用经纬度的方式来获取天气信息,接口地址如下 https://api.caiyunapp.com/v2/ ...
- 内网公告牌获取天气信息解决方案(C# WebForm)
需求:内网公告牌能够正确显示未来三天的天气信息 本文关键字:C#/WebForm/Web定时任务/Ajax跨域 规划: 1.天定时读取百度接口获取天气信息并存储至Txt文档: 2.示牌开启时请求Web ...
- C#调用WebService获取天气信息
概述 本文使用C#开发Winform应用程序,通过调用<WebXml/>(URL:http://www.webxml.com.cn)的WebService服务WeatherWS来获取天气预 ...
- java获取天气信息
通过天气信息接口获取天气信息,首先要给项目导入程序所需要的包,具体需要如下几个包: json-lib-2.4.jar ezmorph-1.0.6.jar commons-beanutils-1.8.3 ...
- Kettle通过Webservice获取天气信息
Kettle通过Webservice获取天气信息 需求: 通过kettle工具,通过webservice获取天气信息,写成xml格式文件. 思路: Kettle可通过两种选择获取webservic ...
- Java通过webservice接口获取天气信息
通过SOAP请求的方式获取天气信息并解析返回的XML文件. 参考: http://www.webxml.com.cn/WebServices/WeatherWS.asmx import java.io ...
- ajax无刷新获取天气信息
浏览器由于安全方面的问题,禁止ajax跨域请求其他网站的数据,但是可以再本地的服务器上获取其他服务器的信息,在通过ajax请求本地服务来实现: <?php header("conten ...
- Android实现自动定位城市并获取天气信息
定位实现代码: <span style="font-size:14px;">import java.io.IOException; import java.util.L ...
- java解析xml实例——获取天气信息
获取xml并解析其中的数据: package getweather.xml; import java.io.IOException; import java.util.HashMap; import ...
随机推荐
- Mybatis架构简介
一.Mybatis与ORM 对象关系映射(即Object Relational Mapping,简称ORM),主要用于关系型数据库和实体之间的映射,主要为了解决对象与关系数据库存在的互不匹配的现象,O ...
- python-访问者模式
源码地址:https://github.com/weilanhanf/PythonDesignPatterns 说明: 访问者模式的基本想法是,软件系统中拥有一个由许多对象构成的.比较稳定的对象结构, ...
- IO流作业
IO流作业 一. 填空题 Java IO流可以分为 字节流 和处理流两大类,其中前者处于IO操作的第一线,所有操作必须通过他们进行. 输入流的唯一目的是提供通往数据的通道 ...
- layui实现复选框全选,反选
html <div class="layui-input-inline"> <input type="checkbox" class=&quo ...
- Js获取地址栏参数值
function getQueryString(name) { var reg = new RegExp("(^|&)" + name + "=([^&] ...
- 学习ES6的全部特性
ES6 简介 ECMAScript 6 简称 ES6,是 JavaScript 语言的下一代标准,已经在2015年6月正式发布了.它的目标是使得 JavaScript 语言可以用来编写复杂的大型应用程 ...
- 一文读懂商业智能(BI):企业数据分析的中枢
商业智能(BI)大家可能早已耳熟能详.从早期的报表自动化,到现在的复杂灵活分析,多平台支持,优秀的人机互动,多数据抽取,大数据整合,甚至和当下最火的人工智能都有结合点.可能一提到BI,大家都会自然而然 ...
- Android之使用枚举利弊及替代方案
Android上不应该使用枚举,占内存,应该使用@XXXDef注解来替代 使用 Enum 的缺点 每一个枚举值都是一个对象,在使用它时会增加额外的内存消耗,所以枚举相比与 Integer 和 Stri ...
- C#和C++互相操作 结构体数组的传递
C++中结构体定义: typedef struct // 平面 { double time; float normal[3]; float center[3]; } plane; C++中方法声明 ...
- python SMTP 发送邮件
#!/usr/bin/env/python # -*- coding: utf-8 -*- # @Time : 2018/11/19 9:56 # @Author : ChenAdong # @Ema ...