scrapy存在两种爬虫类,一个是基于basic模板创建的普通爬虫类scrapy.Spider, 另一个是基于crawl的规则性爬虫类scrapy.spiders.CrawlSpider
scrapy.Spider是所有爬虫类的父类。当爬虫程序启动时,类中的start_requests()首先被调用。它的源码:
def start_requests(self):
cls = self.__class__
if method_is_overridden(cls, Spider, 'make_requests_from_url'):
warnings.warn(
"Spider.make_requests_from_url method is deprecated; it "
"won't be called in future Scrapy releases. Please "
"override Spider.start_requests method instead (see %s.%s)." % (
cls.__module__, cls.__name__
),
)
for url in self.start_urls:
yield self.make_requests_from_url(url)
else:
for url in self.start_urls:
yield Request(url, dont_filter=True)
在经过engine引擎的工作流程中, 发起的请求被成功下载之后,再次由爬虫类的parse()解析函数来解析。当解析完成之后,将解析中的数据item( dict / scarpy.Item子类对象 )。
对于普通的爬虫类来说,需要提供哪些属性:
name = '爬虫名' # 日志记录器的名称
allowed_domains = ['网站的域名'] # 域名由ip和port组成的
start_urls = ['爬虫起始的网址或接口URL'] # 如果重写start_requests()方法时,可以不用此类属性
# 默认scrapy.Request()下载之后,没有指定callback时,由parse()函数解析
def parse(self, response):
pass
普通爬虫类的创建
scrapy genspider 爬虫名 域名
默认情况下使用 basic的爬虫模板。
规则爬虫是省略了一般的解析工作,它完成了感兴趣的连接文本
提取。按rules中给定的Rule规则包含的LinkExtractor的allow/deny/restrict_xpaths/restrict_css的描述进行提取连接标签中的信息(href, text)。
一个规则爬虫类的属性,包含:
name = "爬虫名"
allowed_domains = []
start_urls = [] # 入口
# 爬虫规则
rules = [
scrapy.spiders.Rule(
LinkExtractor(allow=('正则1', '正则2'), # 想要的
deny=('正则1', '正则2'), # 不想要的
restrict_xpaths=('包含a标签的(直接或间接)父标签1', '..'),
restrict_css=('', ''),
tags=('a', 'area'), # 指定感兴趣的标签名,
attrs=('href', )
), #
callback,
follow=False,
process_request='获取请求对象的函数' # 指定函数,必须返回一个scrapy.Request子类对象
),
scrapy.spiders.Rule(),
]
【注意】不能重写parse()解析函数,另个callback属性指定回调函数一定是字符描述,且不能带self。如
rules = [
Rule(LinkExtractor(r'.*?\d+.html'), callback='parse_book'),
]
规则爬虫类的创建
scrapy genspider -t crawl 爬虫名 域名
使用crawl的爬虫模块创建爬虫类。