CrawlSpider
CrawlSpider:继承自Spider类,有两个重要的属性和方法。
通过Rule来定义我们的要求,Rule参数如下:
Rule(link_extractor, callback=None, cb_kwargs=None ,follow=None,process_links=None, process_reqυest=None)
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
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:感觉并没啥用处
主要参数:
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。
from scrapy.loader . processors import Compose
processor = Compose(str.upper, lambda s: s. strip())
print(processor(’ hello world'))
运行输出:
HELLO WORLD
from scrapy.loader.processors import MapCompose
processor = MapCompose (str. upper, lambda s: s. strip())
print (processor( [’ Hello' , 'World' , 'Python' ]) )
运行结果如下所示:
['HELLO', 'WORLD’, t PYTHON']
pip install jmespath
安装好 jmespath 之后,便可以使用这个 Processor 了,如下所示 :
from scrapy. loader. processors import Select] mes
proc = SelectJmes ( 'foo' )
processor = SelectJmes (’ foo’)
print(processor({’ foo':’ bar'}))
运行结果如下所示:
bar