您的位置:首页 > 其它

【Scrapy】学习记录1_一个基本的Scrapy项目

2016-11-08 10:42 309 查看
[Scrapy整体架构]



===========================================

引擎(Scrapy Engine),用来处理整个系统的数据流处理,触发事务。

调度器(Scheduler),用来接受引擎发过来的请求,压入队列中,并在引擎再次请求的时候返回。

下载器(Downloader),用于下载网页内容,并将网页内容返回给蜘蛛。

蜘蛛(Spiders),蜘蛛是主要干活的,用它来制订特定域名或网页的解析规则。编写用于分析response并提取item(即获取到的item)或额外跟进的URL的类。 每个spider负责处理一个特定(或一些)网站。

项目管道(Item Pipeline),负责处理有蜘蛛从网页中抽取的项目,他的主要任务是清晰、验证和存储数据。当页面被蜘蛛解析后,将被发送到项目管道,并经过几个特定的次序处理数据。

下载器中间件(Downloader Middlewares),位于Scrapy引擎和下载器之间的钩子框架,主要是处理Scrapy引擎与下载器之间的请求及响应。

蜘蛛中间件(Spider Middlewares),介于Scrapy引擎和蜘蛛之间的钩子框架,主要工作是处理蜘蛛的响应输入和请求输出。

调度中间件(Scheduler Middlewares),介于Scrapy引擎和调度之间的中间件,从Scrapy引擎发送到调度的请求和响应。

===========================================

“scrapy 不是系统内部或外部命令”

注意如果是win7系统,敲入cmd之后,要在出现的CMD提示上点右键,选择“以管理员身份运行”

这样就可以在cmd下任意位置输入scrapy

不会再出现“scrapy 不是系统内部或外部命令“的提示啦。

===========================================

启动项目

scrapy startproject [projectname]

【正确结果】

应该产生以下文件:

scrapy.cfg: 项目配置文件

[projectname]/: 项目python模块, 呆会代码将从这里导入

[projectname]/items.py: 项目items文件

[projectname]/pipelines.py: 项目管道文件

[projectname]/settings.py: 项目配置文件

[projectname]/spiders: 放置spider的目录

Item

保存爬取到的数据的容器;其使用方法和python字典类似, 并且提供了额外保护机制来避免拼写错误导致的未定义字段错误。通过创建一个 scrapy.Item 类, 并且定义类型为 scrapy.Field 的类属性来定义一个Item。

首先根据需要获取到的数据对item进行建模。 我们需要获取名字,url,以及网站的描述。

对此,在item中定义相应的字段。编辑 [projectname]目录中的 items.py 文件.

通过定义item, 可以很方便的使用Scrapy的其他方法。而这些方法需要知道item的定义。

Spider

用于从单个网站(或者一些网站)爬取数据的类。

其包含了一个用于下载的初始URL,如何跟进网页中的链接以及如何分析页面中的内容, 提取生成 item 的方法。

为了创建一个Spider,必须继承 scrapy.Spider 类, 且定义以下三个属性:

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

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

parse():是spider的一个方法。

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

Spider代码,保存在 [projectname]/spiders 目录下的 [spidername].py 文件中。

===========================================

基本爬取过程

Scrapy为Spider的 start_urls 属性中的每个URL创建了 scrapy.Request 对象,并将 parse 方法作为回调函数(callback)赋值给了Request。

Request对象经过调度,执行生成 scrapy.http.Response 对象并送回给spider parse() 方法。

提取Item

1.Selectors选择器简介

从网页中提取数据有很多方法。Scrapy使用了一种基于 XPath 和 CSS 表达式机制: Scrapy Selectors

XPath表达式示例

/html/head/title: 选择HTML文档中 <head> 标签内的 <title> 元素
/html/head/title/text(): 选择上面提到的 <title> 元素的文字
//td: 选择所有的 <td> 元素
//div[@class="mine"]: 选择所有具有 class="mine" 属性的 div 元素


为了配合XPath,Scrapy除了提供了 Selector 之外,还提供了方法来避免每次从response中提取数据时生成selector的麻烦。

Selector有四个基本的方法(点击相应的方法可以看到详细的API文档):

xpath(): 传入xpath表达式,返回该表达式所对应的所有节点的selector list列表 。

css(): 传入CSS表达式,返回该表达式所对应的所有节点的selector list列表.

extract(): 序列化该节点为unicode字符串并返回list。

re(): 根据传入的正则表达式对数据进行提取,返回unicode字符串list列表。

2.在Shell中尝试Selector选择器

shell根据response提前初始化了变量 sel 。该selector根据response的类型自动选择最合适的分析规则(XML vs HTML)。

我们可以通过这段代码选择该页面中网站列表里所有
<li>
元素:

sel.xpath(‘//ul/li’)

网站的描述:

sel.xpath(‘//ul/li/text()’).extract()

网站的标题:

sel.xpath(‘//ul/li/a/text()’).extract()

网站的链接:

sel.xpath(‘//ul/li/a/@href’).extract()

之前提到过,每个 .xpath() 调用返回selector组成的list,因此我们可以拼接更多的 .xpath() 来进一步获取某个节点。我们将在下边使用这样的特性:

for sel in response.xpath('//ul/li'):
title = sel.xpath('a/text()').extract()
link = sel.xpath('a/@href').extract()
desc = sel.xpath('text()').extract()
print title, link, desc


3.使用item

Item 对象是自定义的python字典。 使用标准的字典语法来获取到其每个字段的值。(字段即是我们之前用Field赋值的属性):

item['title']


一般来说,Spider将会将爬取到的数据以 Item 对象返回

保存爬取到的数据

最简单存储爬取的数据的方式是使用 Feed exports:

scrapy crawl dmoz -o items.json


该命令将采用 JSON 格式对爬取的数据进行序列化,生成 items.json 文件。

小规模的项目中,这种存储方式已经足够。

如果需要对爬取到的item做更多更为复杂的操作,可以编写 Item Pipeline 。 编写自己的 [projectname]/pipelines.py 。

如果仅仅想要保存item,则不需要实现任何的pipeline。

===========================================

基本概念

命令行工具(Command line tools)

用于管理Scrapy项目的命令行工具

Items

定义爬取的数据

Spiders

编写爬取网站的规则

选择器(Selectors)

使用XPath提取网页的数据

Scrapy终端(Scrapy shell)

在交互环境中测试提取数据的代码

Item Loaders

使用爬取到的数据填充item

Item Pipeline

后处理(Post-process),存储爬取的数据

Feed exports

以不同格式输出爬取数据到不同的存储端

Link Extractors

方便用于提取后续跟进链接的类。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Scrapy
相关文章推荐