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