通用爬虫

通用爬虫CrawlSpider:

CrawlSpider是Scrapy提供的一个通用Spider。在spider里,我们可以指定一些爬取规则来实现页面的提取,这些爬取的规则由一个专门的数据结构Rule表示。Rule里包含提取和根进页面的配置,Spider会根据Rule来确定当前页面的哪些链接需要爬取、哪些页面的爬取结果需要用那些方法解析等

CrawlSpider继承自Spider类,除了Spider类的所有方法和属性,它还提供了一个非常重要的属性和方法。

rules,它是爬取规则属性,是包含一个或多个Rule对象的列表

parse_start_url(),它是一个可重写的方法。

这里最重要的内容莫过于Rule的定义了,它的定义和参数如下:

class scrapy.contrib.spiders.Rule(link_extractor,callback=None,cb_kwargs=None,folow=None,process_links=None,process_request=None)

link_extractor:是Link Extractor对象。通过它,Spider可以知道从爬取的页面中提取的哪些链接,提取出的链接会自动生成Request;

allow是一个正则表达式或者正则表达式列表,它定义了从当前页面提取出来的链接哪些是符合要求的;

allow_domains定义了符合要求的域名,只有此域名的链接才会被跟进生产新的Request,它相当于白名单。

deny_domains相当于黑名单

restrict_xpaths:定义了从当前页面中XPath匹配的区域提取链接,其值是XPath表达式或者XPath表达式列表;

callback:即回调函数,注意,避免使用parse()作为回调函数,由于CrawlSpider使用parse()方法来实现其逻辑,如果parse()方法覆盖了,CrawlSpider将会运行失败

cb_kwargs:字典,它包含传递给回调函数的参数

follow:布尔值,他指定根据该规则从response提取的链接是否需要跟进,如果callback参数为None,follow默认值设置为True,否则默认为False。

process_links:指定处理函数,从link_extractor中获取到链接列表时,该函数会调用,它主要用于过滤;

process_request:同样是指定处理函数,根据Rule提取到的每一个Request时,该函数都会调用,对request进行处理。该函数返回值必须是request或None。

item Loader提供一种便捷的价值来帮助我们方便的提取Item,他提供一系列API可以分析原始数据对Item进行赋值。Item提供的是保存抓取数据的容器,而Item Loader提供的是填充容器的机制

创建爬虫命令:

scrapy startproject scrapyuniversal

scrapy genspider -t crawl china tech.china.com





import scrapy.spider import CrawlSpider,Rule
from scrapy.linkextractors import LinkExtractor

class DushuSpider(CrawlSpider):
    name = 'dushu',
    allowed_domains = ['www.dushu.com']
    start_urls = ['http://www.dushu.com/']

    rules = (
        Rule(LinkExtractor(allow=r'/guoxue/\d+'),follow=True),
        Rule(LinkExtractor(allow=r'/guoxue/\d+'),callback="parse_item"),
    )

    def parse_item(self,response):
        print(response.xpath('//title/text()'))
  ................................................................


#与scrapy爬虫相比,crawlspider使用rules规则,相当于scrapy爬虫中的:
def parse_link(self,response):
    links = response.xpath('//a/@href')
    for link in links:
        yield scrapy.Request(link,callback=self.parse_item)

def parse_item(self,response):
        print(response.xpath('//title/text()'))

总结:

在Scrapy通用爬虫中,我们将所有配置抽离出来,每增加一个爬虫,就只需要增加一个JSON文件配置。我们之后只需要维护这些配置文件即可。如果要更加方便的管理,可以将规则存入数据库,再对接可视化管理界面即可。

猜你喜欢

转载自blog.csdn.net/daiyu__zz/article/details/81783516