1. CrawlSpider

1
class scrapy.spiders.Rule(link_extractor, callback=None, cb_kwargs=None, follow=None, process_links=None, process_request=None)
  • link_extractor是一个链接提取器对象,它定义了如何从每个已爬网页中提取链接。
  • callback是可调用的或字符串(在这种情况下,将使用具有该名称的蜘蛛对象的方法)针对使用指定的链接抽取器提取的每个链接调用。这个回调接收一个响应作为它的第一个参数,并且必须返回一个包含Item和/或 Request对象(或者它们的任何子类)的列表。♣警告:编写爬网规则时,避免使用parse回调,因为CrawlSpider使用parse方法本身来实现其逻辑。因此,如果您重写该parse方法,抓取蜘蛛将不再工作。
  • follow是一个布尔值,用于指定是否应使用此规则提取的每个响应之后的链接。如果callback是None,follow默认值True,则默认为False。
  • cb_kwargs是一个包含要传递给回调函数的关键字参数的字典。
  • process_links是一个可调用的字符串或字符串(在这种情况下,将使用具有该名称的蜘蛛对象的方法),将使用指定的每个响应提取每个链接列表link_extractor。这主要用于过滤目的。
  • process_request 是可调用的或字符串(在这种情况下,将使用具有该名称的spider对象的方法),该方法将在此规则提取的每个请求中调用,并且必须返回一个请求或None(用于过滤请求) 。
    CrawlSpider示例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule
from tutorial.items import TutorialItem


class ScrapyorgSpider(CrawlSpider):
name = 'test'
allowed_domains = ['quotes.toscrape.com']
start_urls = ['http://quotes.toscrape.com/']

rules = (
Rule(LinkExtractor(allow=(), restrict_css=('ul.pager')), callback='parse1',
follow=True),
)

def parse1(self, response):
# print(response.url)
tutorial_item = TutorialItem()
for quote in response.css('div.quote'):
tutorial_item['text'] = quote.css('span.text::text').extract_first()
tutorial_item['author'] = quote.css('small.author::text').extract_first()
tutorial_item['tags'] = quote.css('div.tags a.tag::text').extract_first()
yield tutorial_item

2. Item Loaders

  • Items提供了抓取数据的容器,而Item Loaders提供了填充该容器的机制。
  • 要使用Item Loaders必须首先实例化它。您可以使用类似dict的对象(例如Item或- -dict)实例化它,也可以不使用它,在这种情况下,项目将在Item Loader构造函数中使用属性中指定的Item类自动ItemLoader.default_item_class 实例化。
  • 然后,您开始收集值到项装载程序,通常使用选择器。您可以向同一项目字段添加多个值; 项目加载器将知道如何使用适当的处理函数“加入”这些值。

ItemLoader对象

1
class scrapy.loader.ItemLoader([item, selector, response, ]**kwargs)

返回一个新的Item Loader来填充给定的Item。如果没有给出项目,则使用该类中的一个自动实例化default_item_class
参数

  • item(item对象),项目实力来填充后续调用的add_xpath()、add_css()和add_vaule()
  • selector,从中提取数据的选择器
  • response,用于使用构造选择器的响应default_selector_class,除非给出selector参数,在这种情况下,将忽略response参数。

这里是Spider中典型的Item Loader用法,使用Items部分中声明的TutorialItem项:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# -*- coding: utf-8 -*-
import scrapy
from scrapy.loader import ItemLoader

from tutorial.items import TutorialItem


class MydomainSpider(scrapy.Spider):
name = 'mydomain'
allowed_domains = ['quotes.toscrape.com']
start_urls = ['http://quotes.toscrape.com/']

def parse(self, response):
for quote in response.css('div.quote'):
# text = quote.css('span.text::text').extract_first()
# author = quote.css('small.author::text').extract_first()
# tags = quote.css('div.tags a.tag::text').extract()
# tutorial_item = TutorialItem()
# tutorial_item['text'] = text
# tutorial_item['author'] = author
# tutorial_item['tags'] = tags
# yield tutorial_item
item_loader = ItemLoader(item=TutorialItem(), selector=quote)
item_loader.add_css('text', 'span.text::text')
item_loader.add_value('text', '________')
item_loader.add_css('author', 'small.author::text')
item_loader.add_css('tags', 'div.tags a.tag::text')
yield item_loader.load_item()
next_page = response.css('li.next a::attr(href)').extract_first()
if next_page is not None:
yield response.follow(next_page, callback=self.parse)
# 最后,收集的所有数据时,该ItemLoader.load_item()方法被称为实际上返回填充先前提取并与收集到的数据的项目add_xpath(), add_css()和add_value()调用。