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实践----获取天气信息的更多相关文章

  1. 半吊子学习Swift--天气预报程序-获取天气信息

    昨天申请的彩云天气Api开发者今天上午已审核通过  饭后运动过后就马不停蹄的来测试接口,接口是采用经纬度的方式来获取天气信息,接口地址如下 https://api.caiyunapp.com/v2/ ...

  2. 内网公告牌获取天气信息解决方案(C# WebForm)

    需求:内网公告牌能够正确显示未来三天的天气信息 本文关键字:C#/WebForm/Web定时任务/Ajax跨域 规划: 1.天定时读取百度接口获取天气信息并存储至Txt文档: 2.示牌开启时请求Web ...

  3. C#调用WebService获取天气信息

    概述 本文使用C#开发Winform应用程序,通过调用<WebXml/>(URL:http://www.webxml.com.cn)的WebService服务WeatherWS来获取天气预 ...

  4. java获取天气信息

    通过天气信息接口获取天气信息,首先要给项目导入程序所需要的包,具体需要如下几个包: json-lib-2.4.jar ezmorph-1.0.6.jar commons-beanutils-1.8.3 ...

  5. Kettle通过Webservice获取天气信息

      Kettle通过Webservice获取天气信息 需求: 通过kettle工具,通过webservice获取天气信息,写成xml格式文件. 思路: Kettle可通过两种选择获取webservic ...

  6. Java通过webservice接口获取天气信息

    通过SOAP请求的方式获取天气信息并解析返回的XML文件. 参考: http://www.webxml.com.cn/WebServices/WeatherWS.asmx import java.io ...

  7. ajax无刷新获取天气信息

    浏览器由于安全方面的问题,禁止ajax跨域请求其他网站的数据,但是可以再本地的服务器上获取其他服务器的信息,在通过ajax请求本地服务来实现: <?php header("conten ...

  8. Android实现自动定位城市并获取天气信息

    定位实现代码: <span style="font-size:14px;">import java.io.IOException; import java.util.L ...

  9. java解析xml实例——获取天气信息

    获取xml并解析其中的数据: package getweather.xml; import java.io.IOException; import java.util.HashMap; import ...

随机推荐

  1. 1.C#知识点:值类型和引用类型

    一.什么是值类型?什么引用类型? 1.值类型的值是存储在栈上的.引用类型是存在堆上的.  2.值类型变量声明之后,不管是否已经分配内存,编译器在堆上为其分配内存.  3.引用类型声明的时候,这时候只在 ...

  2. 解决代码报红:Cannot resolve symbol 'xxx'

    直接复制别人的代码,maven依赖到自己的IDEA中,个别代码报红,说是不能加载这个东西,检查代码没错,依赖没错,引入jar包也没错 最后网上找到了解决方法,参考文章 如上图所示,一般建议点击Inva ...

  3. Java - "JUC" ReentrantLock获取锁

    [Java并发编程实战]-----“J.U.C”:ReentrantLock之一简介 ReentrantLock介绍 ReentrantLock是一个可重入的互斥锁,又被称为“独占锁”. 顾名思义,R ...

  4. 开源框架--NFine.Framework学习(01)

    框架底层采用经典DDD架构,UI层采用jQuery+Bootstrap打造而成的一套符合中国式操作习惯的快速开发框架. 前后端使用技术 1.前端技术 JS框架:jquery-2.1.1.Bootstr ...

  5. NIO学习笔记六:channel 之前数据传输及scatter/gather

    在Java NIO中,如果两个通道中有一个是FileChannel,那你可以直接将数据从一个channel传输到另外一个channel. FileChannel的transferFrom()方法可以将 ...

  6. Java 并发:Executor ExecutorService ThreadPoolExecutor

    Executor Executor仅仅是一个简单的接口,其定义如下 public interface Executor { void execute(Runnable command); } 作为一个 ...

  7. CSS-网站导航栏标题之间的分隔符

    在一个网页上,尤其是导航栏文字与文字之间,大多数情况下都会有分隔符,也就是文字之间的一个小竖线,这个小小的分隔符,每个网站都有不同的样式,常用的写法就是用标签的边框,这个写法也比较简单,用起来也方便, ...

  8. JS中undefined和null的区别,以及出现原因

    区别:null是一个表示无的对象,转换为数值为0: undefined表示一个无的原始值,转化为数值为NAN(与任何数字相加也为NAN) undefined出现原因:(口诀:一变量二函数一对象) 1. ...

  9. CSS布局模型学习(Float、Position、Flexbox)

    一.Floatfloat 属性定义元素在哪个方向浮动.以往这个属性总应用于图像,使文本围绕在图像周围,不过在 CSS 中,任何元素都可以浮动.浮动元素会生成一个块级框,而不论它本身是何种元素. 清除浮 ...

  10. KOTLIN-1(常用网址)

    ---恢复内容开始--- 1.官网:http://kotlinlang.org/ 2.官方文档:https://kotlinlang.org/docs/reference 3.kotlin源码:htt ...