Scrapy003-项目流程
Scrapy003-项目流程
@(Spider)[POSTS]
前两篇文章我们了解到Scrapy
的原理和安装的相关知识,这节就需要知道创建项目流程的小知识。
根据官方文档:http://scrapy-chs.readthedocs.io/zh_CN/0.24/intro/tutorial.html中的入门教程,将流程进一步细化。
有些知识现在不需要明白,理解这个流程工作流程即可。
1. 创建项目工程
这里和Django
很类似,基本上一个模子出来的。
python
scrapy startproject tutorial
此命令属于全局命令,帮我们创建很多内容:
python
tutorial/
scrapy.cfg
tutorial/
__init__.py
items.py
pipelines.py
settings.py
spiders/
__init__.py
这些文件的作用:
scrapy.cfg
项目的配置文件,用于检测项目所在位置,加载默认配置文件的 入口tutorial
创建的项目目录items.py
项目中的Item
文件,就是前面说过的:创建容器用于存储目标结果piplines
项目管道文件,对结果的进一步处理,然后持久化结果settings
整个项目的配置文件spiders
自定义爬虫的目录,将所有自定义的爬虫文件全部放在该目录
还有很多其他目录,但是需要自己去添加,比如:添加自定义的中间件
2. 定义数据容器Item
Item
是用来保存爬取到的数据的容器,其实Item
是继承于Dict
,也可以理解为Python字典的别名,并且提供了额外的保护机制来避免错误导致的未定义字段错误。
具体情况,看看
Item
的源码就清楚了!
类似Django
里面的ORM
操作,通过继承scrapy.Item
类,根据定义类型scrapy.Field
,来定义一个Item
数据容器。
比如:我们需要获取目标网页的
- 名称
- 链接
- 描述内容
对此,在items.py
中定义相关的字段,具体如下:
import scrapy
class TutorialItem(scrapy.Item):
# define the fields for your item here like:
# name = scrapy.Field()
title = scrapy.Field()
link = scrapy.Field()
desc = scrapy.Field()
在项目创建的时候,就已经为我们创建好对应的
TutorialItem
类,只需要我们添加对应的字段即可。
3. 编写爬虫Spider
我们需要在tutorial/spiders/
目录下载创建自定义的爬虫文件,这里我们使用命令行工具(你也可以鼠标创建):
scrapy genspider -t basic dmoz dmoz.org
#scrapy genspider生成爬虫命令
#-t 模板类型
#domz 爬虫名称
#dmoz.org 爬取的域名
这里需要知道有这个命令即可。
执行完以上命令后,会在tutorial/spiders/
下自动生成dmoz.py
文件,文件内容:
import scrapy
class DmozSpider(scrapy.Spider):
name = "dmoz"
allowed_domains = ["dmoz.org"]
start_urls = ['http://dmoz.org/']
def parse(self, response):
pass
命令行工具下,为我们自动创建了很多内容:
DmozSpider(scrapy.Spider)
类
定义的爬虫类:名称+Spider,并继承scrapy.Spider类name
定义的爬虫名称,该名称必须是唯一的,用于区分Spider。allowed_domains
可爬取的域名start_urls
Spider启动时进行爬取的URL列表,也就是我们所说的种子URL。后续的URL从这些种子URL获取到数据。parse()
父类中的一个方法,该方法负责解析返回的数据(response data
),并提取数据生成数据容器Item
或生成需要进一步处理的URL的Request对象
。当该爬虫被调用时,每个初始URL(种子URL)经过一系列流程到下载器处理后生成的响应对象(response)
将会作为唯一的参数传递给该函数。
response
和Django
视图函数中的request
原理一样
下面开始写一个简单的爬虫实例
在dmoz.py文件中,进行如下修改:
import scrapy
class DmozSpider(scrapy.Spider):
name = "dmoz"
allowed_domains = ["dmoz.org"]
start_urls = [
"http://www.dmoz.org/Computers/Programming/Languages/Python/Books/",
"http://www.dmoz.org/Computers/Programming/Languages/Python/Resources/"
]
def parse(self, response):
filename = response.url.split("/")[-2]
with open(filename, 'wb') as f:
f.write(response.body)
上面是使用官方文档的例子
4. 爬取
此时,我们需要进入项目的根目录下,执行下列命令启动spider
:
scrapy crawl dmoz #局部命令
屏幕输出:
2016-12-01 11:45:42 [scrapy] INFO: Scrapy 1.2.1 started (bot: tutorial)
2016-12-01 11:45:42 [scrapy] INFO: Overridden settings: {'SPIDER_MODULES': ['tutoria
l.spiders'], 'BOT_NAME': 'tutorial', 'NEWSPIDER_MODULE': 'tutorial.spiders', 'ROBOTS
TXT_OBEY': True}
2016-12-01 11:45:42 [scrapy] INFO: Enabled extensions:
['scrapy.extensions.corestats.CoreStats',
'scrapy.extensions.logstats.LogStats',
'scrapy.extensions.telnet.TelnetConsole']
2016-12-01 11:45:42 [scrapy] INFO: Enabled downloader middlewares:
['scrapy.downloadermiddlewares.robotstxt.RobotsTxtMiddleware',
'scrapy.downloadermiddlewares.httpauth.HttpAuthMiddleware',
'scrapy.downloadermiddlewares.downloadtimeout.DownloadTimeoutMiddleware',
'scrapy.downloadermiddlewares.defaultheaders.DefaultHeadersMiddleware',
'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware',
'scrapy.downloadermiddlewares.retry.RetryMiddleware',
'scrapy.downloadermiddlewares.redirect.MetaRefreshMiddleware',
'scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware',
'scrapy.downloadermiddlewares.redirect.RedirectMiddleware',
'scrapy.downloadermiddlewares.cookies.CookiesMiddleware',
'scrapy.downloadermiddlewares.chunked.ChunkedTransferMiddleware',
'scrapy.downloadermiddlewares.stats.DownloaderStats']
2016-12-01 11:45:42 [scrapy] INFO: Enabled spider middlewares:
['scrapy.spidermiddlewares.httperror.HttpErrorMiddleware',
'scrapy.spidermiddlewares.offsite.OffsiteMiddleware',
'scrapy.spidermiddlewares.referer.RefererMiddleware',
'scrapy.spidermiddlewares.urllength.UrlLengthMiddleware',
'scrapy.spidermiddlewares.depth.DepthMiddleware']
2016-12-01 11:45:42 [scrapy] INFO: Enabled item pipelines:
[]
2016-12-01 11:45:42 [scrapy] INFO: Spider opened
2016-12-01 11:45:42 [scrapy] INFO: Crawled 0 pages (at 0 pages/min), scraped 0 items
(at 0 items/min)
2016-12-01 11:45:42 [scrapy] DEBUG: Telnet console listening on 127.0.0.1:6023
2016-12-01 11:45:43 [scrapy] DEBUG: Crawled (200) <GET http://www.dmoz.org/robots.tx
t> (referer: None)
2016-12-01 11:45:44 [scrapy] DEBUG: Crawled (200) <GET http://www.dmoz.org/Computers
/Programming/Languages/Python/Resources/> (referer: None)
2016-12-01 11:45:44 [scrapy] DEBUG: Crawled (200) <GET http://www.dmoz.org/Computers
/Programming/Languages/Python/Books/> (referer: None)
2016-12-01 11:45:44 [scrapy] INFO: Closing spider (finished)
2016-12-01 11:45:44 [scrapy] INFO: Dumping Scrapy stats:
{'downloader/request_bytes': 734,
'downloader/request_count': 3,
'downloader/request_method_count/GET': 3,
'downloader/response_bytes': 16013,
'downloader/response_count': 3,
'downloader/response_status_count/200': 3,
'finish_reason': 'finished',
'finish_time': datetime.datetime(2016, 12, 1, 3, 45, 44, 251572),
'log_count/DEBUG': 4,
'log_count/INFO': 7,
'response_received_count': 3,
'scheduler/dequeued': 2,
'scheduler/dequeued/memory': 2,
'scheduler/enqueued': 2,
'scheduler/enqueued/memory': 2,
'start_time': datetime.datetime(2016, 12, 1, 3, 45, 42, 567933)}
2016-12-01 11:45:44 [scrapy] INFO: Spider closed (finished)
查看包含 [dmoz]
的输出,可以看到输出的log
中包含定义在start_urls
的初始URL,并且与spider中是一一对应的。在log中可以看到其没有指向其他页面( (referer:None)
)。
同时还创建了两个文件:Book,Resources
上述过程大致如下:
Scrapy
的Spider
为start_urls
中的每个种子URL创建了一个scrapy.request
请求对象,并将parse
方法作为回调函数(callback
)赋值给Request
。
Request
经过一些流程,生成scrapy.http.response
响应对象,并发送给parse()
处理。
这个过程就是种子URL的整体数据流过程,后续处理的URL几乎都是在重复此流程。
5. 提取数据到数据容器Item
提取数据我们就需要一些选择器Selectors
的知识,在网页中提取数据有很多方法。Scrapy
使用了一种基于Xpath
和CSS
表达式的机制:Scrapy Selectors
。
这里简单介绍四个基本方法:
xpath()
: 传入xpath
表达式,返回该表达式所对应的所有节点的selector list
列表 。css()
: 传入CSS
表达式,返回该表达式所对应的所有节点的selector list
列表.extract()
: 序列化该节点为unicode
字符串并返回list
。re()
: 根据传入的正则表达式对数据进行提取,返回unicode
字符串list
列表
推荐使用
Xpath
,简单方便,性能好,当然正则也是必须要熟练使用的。
接下来,对dmoz.py
进一步的修改:
import scrapy
from tutorial.items import TutorialItem #导入数据容器类
class DmozSpider(scrapy.Spider):
name = "dmoz"
allowed_domains = ["dmoz.org"]
start_urls = [
"http://www.dmoz.org/Computers/Programming/Languages/Python/Books/",
"http://www.dmoz.org/Computers/Programming/Languages/Python/Resources/"
]
def parse(self, response):
for sel in response.xpath('//ul/li'):
item = TutorialItem()
item['title'] = sel.xpath('a/text()').extract()
item['link'] = sel.xpath('a/@href').extract()
item['desc'] = sel.xpath('text()').extract()
yield item
yield
起到传值的作用,具体会在后面的源码分析中提到,敬请期待!
做进一步的爬取:
scrapy crawl dmoz
在不禁用日志的情况下,我们可以看到爬取的内容:
[dmoz] DEBUG: Scraped from <200 http://www.dmoz.org/Computers/Programming/Languages/Python/Books/>
{'desc': [u' - By David Mertz; Addison Wesley. Book in progress, full text, ASCII format. Asks for feedback. [author website, Gnosis Software, Inc.\n],
'link': [u'http://gnosis.cx/TPiP/'],
'title': [u'Text Processing in Python']}
[dmoz] DEBUG: Scraped from <200 http://www.dmoz.org/Computers/Programming/Languages/Python/Books/>
{'desc': [u' - By Sean McGrath; Prentice Hall PTR, 2000, ISBN 0130211192, has CD-ROM. Methods to build XML applications fast, Python tutorial, DOM and SAX, new Pyxie open source XML processing library. [Prentice Hall PTR]\n'],
'link': [u'http://www.informit.com/store/product.aspx?isbn=0130211192'],
'title': [u'XML Processing with Python']}
6.保存爬取的数据
最简单的存储方式是使用Feed exports
:
scrapy crawl dmoz -o items.json
该命令将采用 JSON
格式对爬取的数据进行序列化,生成 items.json
文件。
以上流程是使用Scrapy
框架的组基本的流程,还有很多内容没有涉及到,在后面的实战篇将提及到。
Scrapy003-项目流程的更多相关文章
- iOS开发项目之一 [ 项目流程]
项目流程 *人员配置 *客户端(iOS工程师,Android工程师) *前端 h5 *后台人员(php,java,net) *提供接口(请求地址.请求参数,请求方式,接口文档) *UI UE * 效果 ...
- ng机器学习视频笔记(十六) ——从图像处理谈机器学习项目流程
ng机器学习视频笔记(十六) --从图像处理谈机器学习项目流程 (转载请附上本文链接--linhxx) 一.概述 这里简单讨论图像处理的机器学习过程,主要讨论的是机器学习的项目流程.采用的业务示例是O ...
- vue框架构建项目流程
构建项目流程: 1.全局查询:node -v 2.全局初始化:npm install --global vue-cli 3.模块化工程:vue init webpack myapp--->y,n ...
- 在IDEA中构建Tomcat项目流程
在IDEA中构建Web项目流程 打开你的IDEA,跟着我走! 第一步:新建项目 第二步:找到Artifacts 点击绿色的+号,如图所示,点一下 这一步很关键,目的是设置输出格式为war包,如果你的项 ...
- Atitit 项目管理 提升开发效率的项目流程方法模型 哑铃型 橄榄型 直板型
Atitit 项目管理 提升开发效率的项目流程方法模型 哑铃型 橄榄型 直板型 项目主体三个部分 ui界面,中间层,数据库 按照不同的比重可以分为一下三个模型 哑铃型 橄榄型 直板型 哑铃型 开 ...
- Vue 简单的总结四(项目流程,DIY脚手架、vue-cli的使用)
项目流程 1.下载 cdn 2.引包 vue-router依赖vue vue-router.js 3.如果是模块化机制 Vue.use(vue-router) 4.创建示例 let Home = {/ ...
- django搭建简单开发项目流程(一)
1 搭建环境 sudo apt-get install python3-pip 安装pip3 sudo pip3 install virtualenv 安装虚拟环境 virtualenv -p pyt ...
- BBS+Blog项目流程及补充知识点
项目流程: 1. 产品需求 (1)基于用户认证组件和Ajax实现登陆验证(图片验证码) (2)基于forms组件和Ajax实现注册功能 (3)设计系统首页(文章列表渲染) (4)设计个人站点页面 (5 ...
- gulp创建完整的项目流程
所有的环境都是在 node 安装好的基础上执行的. node -v 查看node的安装情况.npm -v查看npm 的安装情况. gulp自动化构建常用参数 1.src 读取文件或者文件夹 2.des ...
- mobx项目创建 + mobx项目流程代码
一. 安装mobx 1. react 安装并 reject抽离配置 1. 全局安装 create-react-app 这个脚手架 npm/cnpm i create-react-app -g yarn ...
随机推荐
- .NET Core 1.0 RC2 历险之旅
文章背景:对于.NET Core大家应该并不陌生, 从它被 宣布 到现在已经有1-2年的时间了,其比较重要的一个版本1.0 RC2 也即将发布..Net Core从一个一个的测试版到现在的RC2,经历 ...
- 77 swapoff-关闭系统交换区
Linux swapoff命令用于关闭系统交换区(swap area). swapoff实际上为swapon的符号连接,可用来关闭系统的交换区. 语法 swapoff [设备] 参数: -a 将/et ...
- 【POJ 1390】Blocks
http://poj.org/problem?id=1390 黑书上的例题,感觉我这辈子是想不到这样的dp了QAQ \(f(i,j,k)\)表示将\(i\)到\(j\)合并,并且假设未来会有\(k\) ...
- MFC用户自定义消息
之前做过佳能相机和位移平台的额二次开发,当时遇到一个棘手的问题,就是位移平台如何知道相机已经拍完照了,或者相机如何知道位移平台已经运行到指定位置,当时为了方便采用了定时器来定时检测位移平台的位置,结果 ...
- 8.Android 系统状态栏沉浸式/透明化解决方案
转载:http://www.jianshu.com/p/34a8b40b9308 前言 网上已经有很多有关于系统状态栏的解决方案,这篇文章也不会有什么新奇的解决方案,都是本人经过自己试验,统计提炼出来 ...
- hdu 1410
Ref : http://www.clanfei.com/2012/04/772.html 可推出公式: ans=sigma[C(N1-1,i)*0.5^(N1+i)] (0<=i<=N2 ...
- js jquery 页面加载初始化方法
js jquery 页面加载初始化方法 一.js页面加载初始化方法 // 1.在body里面写初始化方法. <body onload='init()'> </body> < ...
- php cli配置文件问题
引言 今天在教别人使用protobuf的时候,无意中发现了一个php cli模式下的诡异问题,费了老半天的找到解决方法了,这里拿出来分享下. 问题描述 我们这边最先引入了protobuf协议,使用的是 ...
- [Android]Volley源码分析(五)
前面几篇通过源码分析了Volley是怎样进行请求调度及请求是如何被实际执行的,这篇最后来看下请求结果是如何交付给请求者的(一般是Android的UI主线程). 类图:
- mysql中bit_count和bit_or函数的含义
翻阅mysql手册时,看到有个示例使用了bit_or方法来去除重复的数据,一开始没看明白,后来看明白之后感觉非常巧妙.示例要实现的功能就是计算每月有几天有访问,先把示例摘录在这里. 1 2 3 4 5 ...