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 ...
随机推荐
- [日常] Go语言圣经--包和文件-包初始化习题
1.解决包级变量的依赖顺序,然后按照包级变量声明出现的顺序依次初始化 2.包中含有多个.go源文件,它们将按照发给编译器的顺序进行初始化 3.init初始化函数,在每个文件中的init初始化函数,在程 ...
- [android] 新闻客户端引入SlidingMenu
下载SlidingMenu,https://github.com/jfeinstein10/SlidingMenu 导入library 我们项目右键==>Properties==>Andr ...
- 【ibatis】IBatis的动态SQL的写法
Ⅰ .动态SQL的写法 开始 <dynamic 条件成立时前面要加的字符串 prepend ="字符串"> prepend="字符串" 判断条件的对 ...
- 【Java并发编程】3、DelayQueue应用场景,多考生考试
该场景来自于:http://www.cnblogs.com/sunzhenchao/p/3515085.html. 模拟一个考试的日子,考试时间为120分钟,30分钟后才可交卷,当时间到了,或学生都交 ...
- python 历险记(六)— python 对正则表达式的使用(上篇)
目录 引言 什么是正则表达式? 正则表达式有什么用? 正则表达式的语法及使用实例 正则表达式语法有哪些? 这些正则到底该怎么用? 小结 参考文档 系列文章列表 引言 刚接触正则表达式,我也曾被它们天书 ...
- POJ1741(SummerTrainingDay08-G 树的点分治)
Tree Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 23380 Accepted: 7748 Description ...
- 关于CSS和JS中用到的各种Height和Width的问题
自己记不住,列一下关于CSS和JS中用到的各类有关Height和Width属性的介绍对比. 所属类别 属性名 意义 其他 浏览器模型 Screen.height 浏览器窗口所在的屏幕的高度(单位像素) ...
- bzoj1758Wc10重建计划——solution
1758: [Wc2010]重建计划 Time Limit: 40 Sec Memory Limit: 162 MBSubmit: 4707 Solved: 1200[Submit][Status ...
- JavaScript基础知识之 每日一题(网上搜罗来滴)
1.返回什么类型 (function(){return typeof arguments;})(); 答案是:object 参考:https://developer.mozilla.org/en-US ...
- Javascript、Jquery获取浏览器和屏幕各种高度宽度[mark]
Javascript: IE中:document.body.clientWidth ==> BODY对象宽度document.body.clientHeight ==> BODY对象高度d ...