【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表达式示例
为了配合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)。
我们可以通过这段代码选择该页面中网站列表里所有
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() 来进一步获取某个节点。我们将在下边使用这样的特性:
3.使用item
Item 对象是自定义的python字典。 使用标准的字典语法来获取到其每个字段的值。(字段即是我们之前用Field赋值的属性):
一般来说,Spider将会将爬取到的数据以 Item 对象返回
保存爬取到的数据
最简单存储爬取的数据的方式是使用 Feed exports:
该命令将采用 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 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
方便用于提取后续跟进链接的类。
相关文章推荐
- Quartz学习研究(二):一个最基本的Quartz、Spring项目(附项目源代码)
- 参与一个项目,你需要学习什么,记录什么?
- Quartz学习研究(三):一个最基本的Quartz、Spring集群项目(附项目源代码)
- 马上要学习一门新的语言了,并且直接做一个项目,我要在这记录我学习的过程,加油
- .net core 2.0学习记录(一):搭建一个.Net Core网站项目
- C#中ArrayList 与 string、string[]数组 的转换 (转学习:今天做项目时遇到一个arrylist转换问题,做记录)
- Grunt学习笔记之开发环境的搭建与创建一个基本的项目
- Android JNI(NDK)简单学习(环境搭建,创建一个JNI项目的基本流程)
- Quartz学习研究(四):一个最基本的Quartz动态定时项目(附项目源代码)
- Quartz学习研究(一):一个最基本的Quartz项目(附项目源代码)
- ASP.NET MVC 2 学习篇(4)- 创建一个基本的MVC 项目
- (WPF学习记录)第二章 基本画刷
- [DB2 学习记录]4. DB2 基本安全概念-授权
- 给大家推荐一个好的开源项目 为学习NHibernate
- 刚刚做了一个小项目,存在一个问题,就是如何在数据库中插入多条记录
- 科技创新项目--基本知识学习(1) (07年10月2日)
- 网上一篇关于JavaScript基本概念初级讲解论坛贴的学习记录
- 一个GNU项目的编译过程记录
- Web项目中使用NLog记录日志,利用单件模式控制整个项目只有一个Logger对象的问题
- 学习跨平台的运行环境AIR完成一个测试项目