Scrapy结合Mysql爬取天气预报入库

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介:

创建Scrapy工程:

1
scrapy startproject weather2

定义Items(items.py):

1
2
3
4
5
6
7
8
9
10
11
import  scrapy
 
class  Weather2Item(scrapy.Item):
     # define the fields for your item here like:
     # name = scrapy.Field()
     weatherDate  =  scrapy.Field()
     weatherDate2  =  scrapy.Field()
     weatherWea  =  scrapy.Field()
     weatherTem1  =  scrapy.Field()
     weatherTem2  =  scrapy.Field()
     weatherWin  =  scrapy.Field()

编写Spider(spiders/weatherSpider.py):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import  scrapy
from  weather2.items  import  Weather2Item 
 
class  CatchWeatherSpider(scrapy.Spider):
     name  =  'CatchWeather2'
     allowed_domains  =  [ 'weather.com.cn' ]
     start_urls  =  [
         "http://www.weather.com.cn/weather/101280101.shtml"
     ]
     
     def  parse( self , response):
         for  sel  in  response.xpath( '//*[@id="7d"]/ul/li' ):
             item  =  Weather2Item()
             item[ 'weatherDate' =  sel.xpath( 'h1/text()' ).extract() 
             item[ 'weatherDate2' =  sel.xpath( 'h2/text()' ).extract()
             item[ 'weatherWea' =  sel.xpath( 'p[@class="wea"]/text()' ).extract()
             item[ 'weatherTem1' =  sel.xpath( 'p[@class="tem tem1"]/span/text()' ).extract()  +  sel.xpath( 'p[@class="tem tem1"]/i/text()' ).extract()
             item[ 'weatherTem2' =  sel.xpath( 'p[@class="tem tem2"]/span/text()' ).extract()  +  sel.xpath( 'p[@class="tem tem2"]/i/text()' ).extract()
             item[ 'weatherWin' =  sel.xpath( 'p[@class="win"]/i/text()' ).extract()
             yield  item
  • name:定义蜘蛛的名字。

  • allowed_domains: 包含构成许可域的基础URL,供蜘蛛去爬。

  • start_urls: 是一个URL列表,蜘蛛从这里开始爬。蜘蛛从start_urls中的URL下载数据,所有后续的URL将从这些数据中获取。

数据来源是http://www.weather.com.cn/weather/101280101.shtml,101280101是广州的城市编号

这里用到了xpath分析html,感觉好简单


测试运行:

1
scrapy crawl CatchWeather2

结果片断:

wKioL1ZC8wyDfhAQAACOOLnoGMI038.png

已经拿到我们想要的数据

创建数据库:

1
2
3
4
5
6
7
8
9
10
11
CREATE  TABLE  `yunweiApp_weather` (
   `id`  int (11)  NOT  NULL  AUTO_INCREMENT,
   `weatherDate`  varchar (10)  DEFAULT  NULL ,
   `weatherDate2`  varchar (10)  NOT  NULL ,
   `weatherWea`  varchar (10)  NOT  NULL ,
   `weatherTem1`  varchar (10)  NOT  NULL ,
   `weatherTem2`  varchar (10)  NOT  NULL ,
   `weatherWin`  varchar (10)  NOT  NULL ,
   `updateTime` datetime  NOT  NULL ,
   PRIMARY  KEY  (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=15  DEFAULT  CHARSET=utf8;

创建PipeLines():

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
import  MySQLdb
import  datetime
 
DEBUG  =  True
 
if  DEBUG:
     dbuser  =  'lihuipeng'
     dbpass  =  'lihuipeng'
     dbname  =  'game_main'
     dbhost  =  '192.168.1.100'
     dbport  =  '3306'
else :
     dbuser  =  'root'
     dbpass  =  'lihuipeng'
     dbname  =  'game_main'
     dbhost  =  '127.0.0.1'
     dbport  =  '3306'
     
class  MySQLStorePipeline( object ):
     def  __init__( self ):
         self .conn  =  MySQLdb.connect(user = dbuser, passwd = dbpass, db = dbname, host = dbhost, charset = "utf8" , use_unicode = True )
         self .cursor  =  self .conn.cursor()
         #清空表:
         self .cursor.execute( "truncate table yunweiApp_weather;" )
         self .conn.commit() 
         
     def  process_item( self , item, spider): 
         curTime  =   datetime.datetime.now()  
         try :
             self .cursor.execute( """INSERT INTO yunweiApp_weather (weatherDate, weatherDate2, weatherWea, weatherTem1, weatherTem2, weatherWin, updateTime)  
                             VALUES (%s, %s, %s, %s, %s, %s, %s)"""
                             (
                                 item[ 'weatherDate' ][ 0 ].encode( 'utf-8' ), 
                                 item[ 'weatherDate2' ][ 0 ].encode( 'utf-8' ),
                                 item[ 'weatherWea' ][ 0 ].encode( 'utf-8' ),
                                 item[ 'weatherTem1' ][ 0 ].encode( 'utf-8' ),
                                 item[ 'weatherTem2' ][ 0 ].encode( 'utf-8' ),
                                 item[ 'weatherWin' ][ 0 ].encode( 'utf-8' ),
                                 curTime,
                             )
             )
     
             self .conn.commit()
     
     
         except  MySQLdb.Error, e:
             print  "Error %d: %s"  %  (e.args[ 0 ], e.args[ 1 ])
         return  item

修改setting.py启用pipelines:

1
2
3
4
ITEM_PIPELINES = {
     #'weather2.pipelines.Weather2Pipeline': 300,
     'weather2.pipelines.MySQLStorePipeline' : 400,
}

后面的数字只是一个权重,范围在0-1000内即可

重新测试运行:

1
scrapy crawl CatchWeather2

结果:

wKiom1ZC8-XgKrBXAABk-4QwIXM949.png结合运维后台随便展示一下:

wKiom1ZC9DqRrKIfAACjPeFkvqw919.png

搞完收工~~

本文转自运维笔记博客51CTO博客,原文链接http://blog.51cto.com/lihuipeng/1711852如需转载请自行联系原作者


lihuipeng

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
2月前
|
SQL 消息中间件 关系型数据库
Flink查询问题之每秒入库到mysql数量很少如何解决
Apache Flink是由Apache软件基金会开发的开源流处理框架,其核心是用Java和Scala编写的分布式流数据流引擎。本合集提供有关Apache Flink相关技术、使用技巧和最佳实践的资源。
|
3月前
|
数据采集 Python
Scrapy框架 -- 深度爬取并持久化保存图片
Scrapy框架 -- 深度爬取并持久化保存图片
47 0
|
8月前
|
XML 数据采集 JSON
scrapy_selenium爬取Ajax、JSON、XML网页:豆瓣电影
在网络爬虫的开发过程中,我们经常会遇到一些动态加载的网页,它们的数据不是直接嵌入在HTML中,而是通过Ajax、JSON、XML等方式异步获取的。这些网页对于传统的scrapy爬虫来说,是很难直接解析的。那么,我们该如何使用scrapy_selenium来爬取这些数据格式的网页呢?本文将为你介绍scrapy_selenium的基本原理和使用方法,并给出一个实际的案例。
|
8月前
|
存储 关系型数据库 MySQL
百万数据怎么入库mysql mysql百万级数据
      1、连接数据库的问题:建立连接和关闭连接的次数太多,导致IO访问次数太频繁。        2、应该使用批量插入和批量修改的方法,而不是有一条数据就进行插入,这样会导致访问数据库的实际特别的慢。
|
4月前
|
数据采集 JavaScript 开发者
使用Scrapy有效爬取某书广告详细过程
使用Scrapy有效爬取某书广告详细过程
使用Scrapy有效爬取某书广告详细过程
|
8月前
|
缓存 NoSQL 关系型数据库
Spring Boot实战解决高并发数据入库: Redis 缓存+MySQL 批量入库
Spring Boot实战解决高并发数据入库: Redis 缓存+MySQL 批量入库
472 0
|
8月前
|
数据采集 XML 存储
构建一个简单的电影信息爬虫项目:使用Scrapy从豆瓣电影网站爬取数据
这个案例展示了如何使用 Scrapy 框架构建一个简单的爬虫项目,从网页中提取数据并保存到文件中。通过配置、编写爬虫代码、定义数据模型和数据处理管道,你可以灵活地构建各种爬虫应用。
210 0
构建一个简单的电影信息爬虫项目:使用Scrapy从豆瓣电影网站爬取数据
|
数据采集 存储 JSON
「Python」爬虫-9.Scrapy框架的初识-公交信息爬取
本文将讲解如何使用scrapy框架完成北京公交信息的获取。
632 0
uiu
|
SQL 存储 分布式计算
Hive 快速入门与平台搭建 | 结合Mysql(一)
Hive 快速入门与平台搭建 | 结合Mysql(一)
uiu
399 0
Hive 快速入门与平台搭建 | 结合Mysql(一)
|
10月前
|
数据采集 开发者 Python
如何使用Scrapy框架爬取301跳转后的数据
如何使用Scrapy框架爬取301跳转后的数据