name
字符串,爬虫名称,必须唯一,代码会通过它来定位spider
allowed_domains
列表,允许域名
没定义 或 空: 不过滤,
url不在其中: url不会被处理,
域名过滤功能: settings中OffsiteMiddleware
start_urls
:列表或者元组,任务的种子
custom_settings
:字典,覆盖项目中的settings.py
crawler
:Crawler 实例
settings
:Settings 实例
logger
:记录日志
from_crawler()
:类方法,创建spider时调用
start_requests()
:必须返回一个可迭代对象
make_requests_from_url(url)
:默认parse回调, dont_filter=True,不过滤url
parse(response)
: 默认回调方法, 返回值只能是Request, 字典和item对象,或者它们的可迭代对象
log(message[, level, component])
:对logger的包装
closed(reason)
:spider结束时调用
参考文章
scrapy系列(三)——基础spider源码解析
CrawlSpider继承于Spider,为全站爬取而生
rules
:列表,元素为Rule类的实例,采集行为。类似Django的url匹配
如果有多个rule都匹配同一个链接,那么位置下标最小的一个rule将会被使用。
要request的地址和allow_domain里面的冲突,从而被过滤掉。
可以停用过滤功能。
yield Request(url, callback=self.parse_item, dont_filter=True)
__init__
:执行了_compile_rules方法
parse
:重写默认回调方法,调用方法_parse_response
parse_start_url
:处理parse返回的response
_requests_to_follow
:response中解析出目标url,并将其包装成request请求
_response_downloaded
:_requests_to_follow的回调方法,作用就是调用_parse_response方法
_parse_response
:spider._follow_links的值是从settings的CRAWLSPIDER_FOLLOW_LINKS值获取到的。
_compile_rules
:将rule中的字符串表示的方法改成实际的方法
from_crawler
:
link_extractor
:Link Extractor实例,解析规则。
callback
:方法或字符串,回调方法,慎用parse做为回调方法
cb_kwargs
:字典,用于给callback方法传递参数
follow
:布尔对象,表示是当前response否继续采集。如果callback是None,那么它就默认为True,否则为False。
process_links
:在crawlspider中的_requests_to_follow方法中被调用,元素为Link的列表作为参数,返回值也是一个元素为Link的列表,目标url是相对的链接,那么scrapy会将其扩展成绝对的
process_request
:处理request
import scrapy
from scrapy.spiders import CrawlSpider, Rule
from scrapy.linkextractors import LinkExtractor
class MySpider(CrawlSpider):
name = 'example.com'
allowed_domains = ['example.com']
start_urls = ['http://www.example.com']
rules = (
# 提取匹配 'category.php' (但不匹配 'subsection.php') 的链接并跟进链接(没有callback意味着follow默认为True)
Rule(LinkExtractor(allow=('category\.php', ), deny=('subsection\.php', ))),
# 提取匹配 'item.php' 的链接并使用spider的parse_item方法进行分析
Rule(LinkExtractor(allow=('item\.php', )), callback='parse_item'),
)
def parse_item(self, response):
self.log('Hi, this is an item page! %s' % response.url)
item = scrapy.Item()
item['id'] = response.xpath('//td[@id="item_id"]/text()').re(r'ID: (\d+)')
item['name'] = response.xpath('//td[@id="item_name"]/text()').extract()
item['description'] = response.xpath('//td[@id="item_description"]/text()').extract()
return item
参考文章:
scrapy系列(四)——CrawlSpider解析
Spiders-爬取规则(Crawling rules)