scrapy学习--Spiders
来源:互联网 发布:sql语句单引号转义 编辑:程序博客网 时间:2024/04/30 05:36
一、爬虫的工作流程
1.通过调用start_request()中的URL获取初始的request,并以parse为回调函数生成Request。
2.在parse方法中分析返回的内容,返回Item对象或者Request或者一个可迭代容器。
3.在parse内可以使用选择器分析网页内容,并生成item。
4.由pipeline将返回的item存储到数据库或者使用Feed exports存入到文件中。
二、Spider参数
1.crawl时添加-a传递参数:
scrapy crawl myspider -a category=electronics
2.在构造器中获取参数:import scrapyclass MySpider(Spider): name = 'myspider' def __init__(self, category=None, *args, **kwargs): super(MySpider, self).__init__(*args, **kwargs) self.start_urls = ['http://www.example.com/categories/%s' % category] # ..
三、内置Spider
Spider是最简单的spider。每个其他的spider必须继承自该类。
属性、方法
name定义了Scrapy如何定位Spider,因此是必须且唯一的。
allowed_domains 可选。包含了spider允许爬取的域名列表。当OffsiteMiddleware启用时,域名不在列表中的URL不会被跟进。
start_urls URL列表。spider从该列表中开始爬取。
custom_settings 当运行爬虫时,字典的设置将从项目广泛配置重写。它必须被定义为类属性,因为在实例化之前更新的设置。
crawler 这个属性被设置在类初始化并且链接到被爬虫初始化绑定的Crawler对象之后。
settings 爬虫运行的设置。
from_crawler(crawler , *args , **kwargs) 这个方法用于Scrapy创建你的爬虫。
start_requests()方法必须返回一个可迭代对象。包含了爬虫用于爬取的第一个Request。
make_requests_from_url(url) 返回一个request对象。该方法在初始化request时被start_request()调用。
parse(response) 用于分析response的主体方法。
log(message[,level,component]) log方法。
closed(reason) spider关闭是被调用。
四、Spider实例
前面的三项实际上主要在描述Spider和它的方法是什么。下面以实例为例理解Spider怎么用。
# -*- coding: utf-8 -*-'''Created on 2015年8月25日@author: frozen cloud'''from _elementtree import parseimport scrapyfrom firstSpider.items import FirstspiderItemclass MultSpider(scrapy.Spider): name = "multspider" allowed_domains = ["zhihu.com"] start_urls = ( 'http://www.zhihu.com/question/31810474#answer-16771792', 'http://www.zhihu.com/question/22138966#answer-19540679', 'http://www.zhihu.com/question/22138958', ) def parse(self, response): self.log('A response from %s just arrived!' % response.url) sel = scrapy.Selector(response) for h3 in response.xpath('//h3').extract(): yield FirstspiderItem(name=h3) for url in response.xpath('//a/@href').extract(): yield scrapy.Request(url,callback=self.parse)这个例子演示了单个回调函数中返回多个Request和Item,以及log方法。
在尝试调试这个例子时,如果使用的是eclipse+pydev进行调试,还需要修改debug配置的,具体请查看
scrapy学习笔记——第一个项目,eclipse+pydev搭建scarpy项目
在这个例子中可以在debug中清晰的看到第一个item返回的结果,以及第二个所报的错误。
查看源码:
可以看出这里必须是绝对路径,否则不会出现冒号。但是a标签中提取的都是相对路径所以才有此从错误。
这里暂时不去管它,只要理解这个方法的本意即可。
CrawlSpider
这个是从Spider继承常用的spider,并提供了两个新的属性。
rules 一个包含n个Rule对象的list。每个Rule对爬取网站的动作定义了特定表现。如果多个rule匹配了相同的链接,则根据他们的本属性中定义的顺序,第一个会被使用。
parse_start_url(response)当start_url的请求返回时,该方法被调用。该方法分析最初的返回值并必须返回一个Item对象或者一个Request对象或者一个可迭代的包含二者对象。
爬取规则
class scrapy.contrib.spiders.
Rule
(link_extractor,callback=None, cb_kwargs=None, follow=None, process_links=None,process_request=None)
link_extractor 是一个 Link Extractor 对象。 其定义了如何从爬取到的页面提取链接。callback 是一个callable或string(该spider中同名的函数将会被调用)。 从link_extractor中每获取到链接时将会调用该函数。该回调函数接受一个response作为其第一个参数, 并返回一个包含 Item 以及(或) Request 对象(或者这两者的子类)的列表(list)。cb_kwargs 包含传递给回调函数的参数(keyword argument)的字典。follow 是一个布尔(boolean)值,指定了根据该规则从response提取的链接是否需要跟进。 如果 callback 为None, follow 默认设置为 True ,否则默认为 False 。process_links 是一个callable或string(该spider中同名的函数将会被调用)。 从link_extractor中获取到链接列表时将会调用该函数。该方法主要用来过滤。process_request 是一个callable或string(该spider中同名的函数将会被调用)。 该规则提取到每个request时都会调用该函数。该函数必须返回一个request或者None。 (用来过滤request)
注意:当编写爬虫规则时,请避免使用parse作为回调函数。 由于CrawlSpider使用parse方法来实现其逻辑,如果您覆盖了parse 方法,crawl spider 将会运行失败。
这一段内容多为解释性的东西,所以就直接照搬了官文。
下一次学习CrawlSpider实例和其他一些Spider。
另外不得不吐槽,那么多写着scrapy教程,打开一看100%把官文直接搬过来的,既没有自己学习的心得体会,也没有自己学习时遇到的问题和解决的思路方法,真不知道写到博客里是为了什么,还不如直接看官文算了,点开都是浪费时间。
- scrapy学习--Spiders
- scrapy学习--内置Spiders简介
- Scrapy学习笔记IV-Spiders
- 【Scrapy】Spiders爬虫
- Scrapy spiders介绍
- Scrapy-spiders(爬虫)
- Scrapy:一次性运行多个Spiders
- Scrapy:一次性运行多个Spiders
- Locally run all of the spiders in Scrapy
- Scrapy源码分析-Spiders爬虫中文文档(一)
- python.scrapy 之crawlall命令执行所有的spiders
- Scrapy爬虫框架教程(三)-- 调试(Debugging)Spiders
- 九.scrapy项目下spiders内多个爬虫同时运行
- 【scrapy】学习Scrapy入门
- <scrapy>scrapy入门学习
- 【scrapy】学习Scrapy入门
- 跟我学系列,走进Scrapy爬虫(六)Spiders爬虫
- Scrapy学习
- uPnp概述
- Android开源框架ViewPageIndicator和ViewPager实现Tab导航
- perl IO::Socket::INET模块
- 常用linux系统监控命令
- emacs-async库简要说明
- scrapy学习--Spiders
- <Android Framework 之路>Android5.1 Camera Framework(二)
- 第四周1000题解
- Java finally语句到底是在return之前还是之后执行?
- 《Java疯狂讲义》中关联、组合和聚合的谬误
- 可变数组NSMutableArray详解
- Scala中类的继承,超类的重载等
- Linux串口编程详解
- 关于html中li的问题