Scrapy 进阶
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()调用。
|
再见
好了各位,以上就是这篇文章的全部内容了,能看到这里的人呀,都是人才。
白嫖不好,创作不易。各位的支持和认可,就是我创作的最大动力,我们下篇文章见!
如果本篇博客有任何错误,请批评指教,不胜感激 !