赞
踩
1.通过调用start_request()中的URL获取初始的request,并以parse为回调函数生成Request。
2.在parse方法中分析返回的内容,返回Item对象或者Request或者一个可迭代容器。
3.在parse内可以使用选择器分析网页内容,并生成item。
4.由pipeline将返回的item存储到数据库或者使用Feed exports存入到文件中。
1.crawl时添加-a传递参数:
scrapy crawl myspider -a category=electronics
2.在构造器中获取参数:
import scrapy
class 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必须继承自该类。
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怎么用。
- # -*- coding: utf-8 -*-
- '''
- Created on 2015年8月25日
- @author: frozen cloud
- '''
- from _elementtree import parse
- import scrapy
- from firstSpider.items import FirstspiderItem
-
- class 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配置的,具体请查看
在这个例子中可以在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%把官文直接搬过来的,既没有自己学习的心得体会,也没有自己学习时遇到的问题和解决的思路方法,真不知道写到博客里是为了什么,还不如直接看官文算了,点开都是浪费时间。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。