Scrapy通用爬虫笔记 — CrawlSpider和Item Loader

CrawlSpider

CrawlSpider:继承自Spider类,有两个重要的属性和方法。

  • process_start_url():当start_urls里的Request执行下载得到Response后,执行该函数进行解析,必须返回Item或者新的Request。
  • rules:定义爬取规则的属性,是一个包含一个或多个Rule规则的列表。通过定义的Rule可以筛选出符合我们要求的链接。

通过Rule来定义我们的要求,Rule参数如下:

Rule(link_extractor, callback=None, cb_kwargs=None ,follow=None,process_links=None, process_reqυest=None)
  • link_extractor:在里面定义对链接的要求,一般常用 LxmlLinkExtractor
    对象作为参数,其定义和参数如下所示:
class scrapy.linkextractors.lxmlhtml.LxmllinkExtractor(allow=(), deny=(), allow_domains=(),
deny_domains=(), deny_extensions=None, restrict_xpaths=() ,
 restrict_css=(), tags=(’ a',’ area'),attrs=('href', ), canonicalize=False, uniqe=True, process_value=None, strip=True)

主要参数:
allow:通过正则表达式或正则表达式列表,定义需要提取的链接的要求,deny相反。
allow_domains:定义符合要求的域名。
restrict_xpaths=() ,restrict_css=():通过Xpath和CSS匹配出可以提取链接的区域。
参考文档:http://scrapy.readthedocs.io/en/latest/topics/link-extractors.html#module-scrapy.linkextractors.lxm.html

  • callback:回掉函数,提取的链接会作为参数传入回掉函数,解析之后返回一个包含 Item或 Request 对象的列表。注意,避免使用 parse ()作为回调函数。 由于 CrawlSpider使用 parse ()方法来实现其逻辑,如果 parse ()方法覆盖了, CrawlSpider 将会运行失败。
  • cb_kwargs :字典,它包含传递给回调函数的参数 。
  • follow :布尔值,即 True 或 False ,它指定根据该规则从 response 提取的链接是否需要跟进 。如果 callback 参数为 None, follow 默认设置为 True ,否则默认为 False 。
  • process_links :指定处理函数,从 link_extractor 中获取到链接列表时,该函数将会调用,它主要用于过滤。
  • process_request :同样是指定处理函数,根据该 Rule 提取到每个 Request 时,该函数会调用,对 Request 进行处理。 该函数必须返回 Request 或者 None 。
    实例:
rules = [Rule(LinkExtractor(allow=('(/wiki/)((?!:).)*$'),),callback="parse_item", follow=True)]

Item Loader

Item Loader:可以将给Item赋值这一过程规则化。通过提供的API执行,API如下:

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

ps:感觉并没啥用处
主要参数:

  • item:定义的Item对象,可以调用 add_xpath() 、add_css ()或 add_value ()等方法来填充 Item对象。
  • selector:它是 Selector 对象,用来提取填充数据的选择器 。可以是Xpath或者CSS。
  • response:它是 Response 对象,用于使用构造选择器的 Response 。
    实例如下:
from scrapy.loader import Itemloader
from project.items import Product

def parse(self, response):
	loader = Itemloader(item=Product(), response=response)
	loader.add_xpath('name', ’//div[@class = "product_name"]')
	loader.add_xpath('title',’//div[@class="product_title"]’)
	loader.add_xpath( ’price’,’//p[@id="price"]’)
	loader.add_css(’stock’,’p#stock]')
	loader.add_value('last_updated’,’ today')
return loader.load_item()

另外, Item Loader 每个字段中都包含了一个 Input Processor (输入处理器)和一个 Output Processor(输出处理器)。Input Processor 收到数据时立刻提取数据, Input Processor 的结果被收集起来并且保存在 ltemLoader 内 ,但是不分配给 Item。 收集到所有的数据后, load_item()方法被调用来填充再生成Item 对象 。 在调用时会先调用 Output Processor 来处理之前收集到的数据,然后再存入 Item 中,这样就生成了 Item。
下面将介绍一些内置的的 Processor。

  • Identity:不进行任何处理,直接返回原来的数据。
  • TakeFirst :返回列表的第一个非空值,类似 extract_first ()的功能,常用作 Output Processor。
  • join :相当于字符串的 join ()方法,可以把列表拼合成字符串,字符串默认使用空格分隔 。
  • Compose: 是用给定的多个函数的组合而构造的 Processor ,按顺序将结果传递给下一个函数,直至结束将结果输出。
from scrapy.loader . processors import Compose
processor = Compose(str.upper, lambda s: s. strip())
print(processor(’   hello world'))

运行输出:

HELLO WORLD
  • MapCompose:与 Compose 类似, MapCompose 可以迭代处理一个列表输入值,如下所示:
from scrapy.loader.processors import MapCompose
processor = MapCompose (str. upper, lambda s: s. strip())
print (processor( [’ Hello' , 'World' , 'Python' ]) )

运行结果如下所示:

['HELLO', 'WORLD’, t PYTHON']
  • SelectJmes: 可以查询 JSON ,传入 Key ,返回查询所得的 Value 。 不过需要先安装 jmespath 库才可以使用它。
pip install jmespath

安装好 jmespath 之后,便可以使用这个 Processor 了,如下所示 :

     from scrapy. loader. processors import Select] mes
        proc = SelectJmes ( 'foo' )
        processor = SelectJmes (’ foo’)
        print(processor({’ foo':’ bar'}))

运行结果如下所示:

bar

你可能感兴趣的:(爬虫)