获取信息

修改items.py如下:

import scrapy

class TutorialItem(scrapy.Item):

# define the fields for your item here like:

# name = scrapy.Field()

city = scrapy.Field()

date = scrapy.Field()

dayDesc = scrapy.Field()

dayTemp = scrapy.Field()

爬虫代码

内容如下,采用的项目还是之前创建的Tutorial/weather.py

import scrapy

from tutorial.items import TutorialItem

from scrapy.selector import Selector

from scrapy.http import Request

headers = {'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36'}

class Douban(scrapy.Spider):

name = 'weather'

allowed_domains = ['sina.com.cn']

start_urls = ['http://weather.sina.com.cn/hangzhou']

def parse(self,response):

item = TutorialItem()

item['city'] = response.xpath("//*[@id='slider_ct_name']/text()").extract()

tenDay = response.xpath('//*[@id="blk_fc_c0_scroll"]');

item['date'] = tenDay.css('p.wt_fc_c0_i_date::text').extract()

item['dayDesc'] = tenDay.css('img.icons0_wt::attr(title)').extract()

item['dayTemp'] = tenDay.css('p.wt_fc_c0_i_temp::text').extract()

return item

说明:

name: 用于区别Spider。该名字必须是唯一的,您不可以为不同的Spider设定相同的名字。

start_urls: 包含了Spider在启动时进行爬取的url列表。因此,第一个被获取到的页面将是其中之一。后续的URL则从初始的URL获取到的数据中提取。

parse() 是spider的一个方法。 被调用时,每个初始URL完成下载后生成的 Response 对象将会作为唯一的参数传递给该函数。 该方法负责解析返回的数据(response data),提取数据(生成item)以及生成需要进一步处理的URL的 Request 对象。

分析源码发现:

  • 城市名可以通过获取id为slider_ct_name的h4元素获取
  • 日期可以通过获取id为blk_fc_c0_scroll下的class为wt_fc_c0_i_date的p元素获取
  • 天气描述可以通过获取id为blk_fc_c0_scroll下的class为icons0_wt的img元素获取
  • 温度可以通过获取id为blk_fc_c0_scroll下的class为wt_fc_c0_i_temp的p元素获取

其中:

//*:选取文档中的所有元素。@:选择属性 /:从节点选取 。extract():提取

Pipeline

当Item在Spider中被收集之后,它将会被传递到Item Pipeline,一些组件会按照一定的顺序执行对Item的处理。

每个item pipeline组件(有时称之为“Item Pipeline”)是实现了简单方法的Python类。他们接收到Item并通过它执行一些行为,同时也决定此Item是否继续通过pipeline,或是被丢弃而不再进行处理。

以下是item pipeline的一些典型应用:

清理HTML数据

验证爬取的数据(检查item包含某些字段)

查重(并丢弃)

将爬取结果保存到数据库中

process_item(self, item, spider)

每个item pipeline组件都需要调用该方法,这个方法必须返回一个 Item (或任何继承类)对象, 或是抛出 DropItem 异常,被丢弃的item将不会被之后的pipeline组件所处理。

参数:

item (Item 对象) – 被爬取的item

spider (Spider 对象) – 爬取该item的spider

open_spider(self, spider)

当spider被开启时,这个方法被调用。

参数: spider (Spider 对象) – 被开启的spider

close_spider(spider)

当spider被关闭时,这个方法被调用

参数: spider (Spider 对象) – 被关闭的spider

from_crawler(cls, crawler)

PIPELINE代码

编辑pipelines.py

class TutorialPipeline(object):

def __init__(self):

pass

def process_item(self, item, spider):

with open('wea.txt', 'w+') as file:

city = item['city'][0].encode('utf-8')

file.write('city:' + str(city) + '\n\n')

date = item['date']

desc = item['dayDesc']

dayDesc = desc[1::2]

nightDesc = desc[0::2]

dayTemp = item['dayTemp']

weaitem = zip(date, dayDesc, nightDesc, dayTemp)

for i in range(len(weaitem)):

item = weaitem[i]

d = item[0]

dd = item[1]

nd = item[2]

ta = item[3].split('/')

dt = ta[0]

nt = ta[1]

txt = 'date:{0}\t\tday:{1}({2})\t\tnight:{3}({4})\n\n'.format(

d,

dd.encode('utf-8'),

dt.encode('utf-8'),

nd.encode('utf-8'),

nt.encode('utf-8')

)

file.write(txt)

return item

写好ITEM_PIPELINES后,还有很重要的一步,就是把 ITEM_PIPELINES 添加到设置文件 settings.py 中。

ITEM_PIPELINES = {

    'tutorial.pipelines.TutorialPipeline': 1

}

另外,有些网站对网络爬虫进行了阻止(注:本项目仅从技术角度处理此问题,个人强烈不建议您用爬虫爬取有版权信息的数据),我们可以在设置中修改一下爬虫的 USER_AGENT 和 Referer 信息,增加爬虫请求的时间间隔。

DEBUG

显示只有城市:

scrapy内置的html解析是基于lxml库的,这个库对html的解析的容错性不是很好,通过检查网页源码,发现有部分标签是不匹配的(地区和浏览器不同取到的源码可能不同)

换个html代码解析器就可以了,这里建议用 BeautifulSoup

https://www.crummy.com/software/BeautifulSoup/bs4/doc/index.html

下载链接:

https://www.crummy.com/software/BeautifulSoup/bs4/download/4.5/

爬虫代码如下:

import scrapy

from tutorial.items import TutorialItem

from scrapy.selector import Selector

from scrapy.http import Request

from bs4 import BeautifulSoup

headers = {'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36'}

class Douban(scrapy.Spider):

name = "weather"

allowed_domains = ["sina.com.cn"]

start_urls = ['http://weather.sina.com.cn']

def parse(self, response):

html_doc = response.body

#html_doc = html_doc.decode('utf-8')

soup = BeautifulSoup(html_doc)

itemTemp = {}

itemTemp['city'] = soup.find(id='slider_ct_name')

tenDay = soup.find(id='blk_fc_c0_scroll')

itemTemp['date'] = tenDay.findAll("p", {"class": 'wt_fc_c0_i_date'})

itemTemp['dayDesc'] = tenDay.findAll("img", {"class": 'icons0_wt'})

itemTemp['dayTemp'] = tenDay.findAll('p', {"class": 'wt_fc_c0_i_temp'})

item = TutorialItem()

for att in itemTemp:

item[att] = []

if att == 'city':

item[att] = itemTemp.get(att).text

continue

for obj in itemTemp.get(att):

if att == 'dayDesc':

item[att].append(obj['title'])

else:

item[att].append(obj.text)

return item

4、python开源——scrapy爬虫天气预报相关推荐

  1. scrapy爬虫储存到mysql_详解Python之Scrapy爬虫教程NBA球员数据存放到Mysql数据库

    获取要爬取的URL 爬虫前期工作 用Pycharm打开项目开始写爬虫文件 字段文件items # Define here the models for your scraped items # # S ...

  2. python实现scrapy爬虫每天定时抓取数据

    python实现scrapy爬虫每天定时抓取数据 1. 前言. 1.1. 需求背景. 每天抓取的是同一份商品的数据,用来做趋势分析. 要求每天都需要抓一份,也仅限抓取一份数据. 但是整个爬取数据的过程 ...

  3. Python之Scrapy爬虫实战--爬取妹子图

    1.前言 反正闲着也是闲着,不如来学习啊! 2.关键代码 新建项目 不会的同学可参考我的另一篇博文,这里不再赘述:Python之Scrapy爬虫实战–新建scrapy项目 这里只讲一下几个关键点,完整 ...

  4. python的scrapy爬虫可以将爬去的数据放入数据库吗_Python基于Scrapy的爬虫 数据采集(写入数据库)...

    上一节已经学了如何在spider里面对网页源码进行数据过滤. 这一节将继续学习scrapy的另一个组件-pipeline,用来2次处理数据 (本节中将以储存到mysql数据库为例子) 虽然scrapy ...

  5. python的scrapy爬虫模块间进行传参_小猪的Python学习之旅 —— 4.Scrapy爬虫框架初体验...

    小猪的Python学习之旅 -- 4.Scrapy爬虫框架初体验 Python 引言: 经过前面两节的学习,我们学会了使用urllib去模拟请求,使用 Beautiful Soup和正则表达式来处理网 ...

  6. Python之Scrapy爬虫的常用命令

    Scrapy爬虫的常用命令: Scrapy命令行是为持续运行设计的专业爬虫框架. 常用的Scrapy,命令有三个: startproject genspider crawl Scrapy为什么采用命令 ...

  7. 基于python的scrapy爬虫抓取京东商品信息

    这是上的第二节爬虫课程的课后作业:抓取京东某类商品的信息,这里我选择了手机品类. 使用scrapy爬虫框架,需要编写和设置的文件主要有phone.py , pipelines.py , items.p ...

  8. Python之Scrapy爬虫教程NBA球员数据存放到Mysql数据库

    Scrapy爬虫,请先准备好Scrapy的环境 获取要爬取的URL 爬虫前期工作 用Pycharm打开项目开始写爬虫文件 启动爬虫 获取要爬取的URL 爬虫前期工作 用Pycharm打开项目开始写爬虫 ...

  9. 【Python】Scrapy爬虫框架小试牛刀:爬取某论坛招聘信息

    Scrapy爬虫框架小试牛刀:爬取某论坛招聘信息 背景 Scrapy工作原理 创建项目 创建爬虫 确定数据爬取思路 编写对象:item.py 制作爬虫:muchongrecruit.py 存储内容:p ...

最新文章

  1. 计算机科学 44(6a 增刊,窃昕攻击下子空间码的安全性-计算机科学.PDF
  2. JMeter压力测试入门教程[图文]
  3. 3d饼图 vue_Vue+Echarts构建可视化大数据平台实战项目分享(附源码)(上)
  4. mysql启动错误1.69,MySQL无法启动例一
  5. [Golang]Go语言学习资源集合
  6. linux取消线程的原理,浅析 Linux 进程与线程
  7. 函数计算GB镜像秒级启动:下一代软硬件架构协同优化
  8. 【Elasticsearch】es 脑裂
  9. bash: ./install_software: Permission denied
  10. Codeforces123E. Maze【树形dp】【概率dp】【证明题】
  11. 预处理_关于食材预处理
  12. 【BZOJ】3963: [WF2011]MachineWorks
  13. C语言源代码系列-管理系统之物业费管理
  14. 计算机错误1327,Win7系统电脑安装软件失败并提示错误1327解决办法
  15. YDOOK:MyPLayer:Jinwei Lin 最新开源 Python 音频视频基本播放器
  16. 如何在html中插入表情包,一款支持插入表情的编辑器实现代码(简单思路挺重要)...
  17. 计算机蓝屏代码0x0000007b,win7系统开机蓝屏提示STOP:0X0000007B错误代码怎么办
  18. openpyxl 打开大文件很慢_解决python执行较大excel文件openpyxl慢问题
  19. 为你解说加密Pdf如何导出图片
  20. php footer'=%3e2,为基于Wordpress的博客添加CNZZ统计代码

热门文章

  1. 超前点播风波后,中国视频行业变现仍需摸索中前行
  2. 基于SSM的快递代取管理系统
  3. Codeforces 26B. Regular Bracket Sequence
  4. ViewPager(六)让ViewPager用起来更顺滑——设置间距与添加转场动画
  5. mupdf中CMYK与RGB的转换算法
  6. 这篇文章教你用消除笔去水印
  7. web前端埋点及数据上报
  8. Win11调整分区大小的方法有哪些?
  9. java计算机毕业设计学生学籍信息管理系统源码+mysql数据库+lw文档+系统+调试部署
  10. 2020下半年新机最新消息_2020下半年3款重磅新机:三星Note20被吹爆,华为Mate40差点意思...