Scrapy Spider类介绍

一.介绍

   Spider是定义如何抓取某一个站点(或一组站点的类),包括如何执行Crawl,以及如何从其页面中提取结构化数据。

  对于spider,抓取周期是这样的:

  1)首先生成初始请求以抓取第一个 URL,并指定一个回调函数以使用从这些请求下载的响应调用。

    第一个要执行的请求是通过调用start_requests() (默认情况下)  请求指定的url是通过start_urls一个列表,parse方法是一个回调函数,用来获取响应的网页。

  2)使用qequest对象请求,还将包含一个回调、然后由scrapy下载,由指定的回调函数处理它们的响应

  3)在回调函数中,可以解析页面内容,通常使用选择器(也可以使用 BeautifulSoup、lxml 或您喜欢的任何机制)并使用解析的数据生成items。

  4)最后从spider返回的items通常会保存到数据库。

 

二. scrapy.Spider类

  这是一个python类,是最简单的spider, 也是所有其它spider都必须继承的,它不提供任何特殊功能。它只是提供了一个默认start_requests()实现,通过start_urls(spider类的属性)发送请求,然后parse处理每一个响应。

class ToScrapeCSSSpider(scrapy.Spider):
    name = "cnblogsapi"
    start_urls = [
        'https://www.cnblogs.com/SunSpring/p/16193997.html',
    ]

    def parse(self, response):
        pass
        

  1.name属性

    定义spider名称的字符串,用于scrapy定位和实例化spider的方式,因此它必须是唯一的,此属性是必须的。

    如果spider抓取单个 域,通常创建一个spider的做法是:“域_spider.py" (如quotes_spider.py)。name就是取的域名。

  2.allowed_domains属性

    包含允许此spider抓取的域的可选字符串列表。

    假设您的目标网址是https://www.example.com/1.html,然后添加'example.com'到列表中

  3.start_urls属性

    这是一个url的list列表类型,spider在启动时爬取的url列表,初始请求由它定义,request将根据start_urls中包含的数据依次生成。

  4.custom_settings属性

    覆盖全局的settings文件设置,如下所示:

  custom_settings = {
        'DOWNLOADER_MIDDLEWARES':{
            'gerapy_pyppeteer.downloadermiddlewares.PyppeteerMiddleware': 543
        },
        'CONCURRENT_REQUESTS' : 3,
        'GERAPY_PYPPETEER_LOGGING_LEVEL' : logging.DEBUG
    }

  6.settings

   settings实例,读取settings.py的内容,下面是callback回调方法中获取设置内容

    def parse(self, response):
        print(self.settings['ROBOTSTXT_OBEY'])

  7.logger

    记录日志,如下所示

    def parse(self, response):
        self.logger.info('c')

  8.start_requests()

    此方法必须返回一个迭代器,其中包含要为spider爬取的第一个请求。当打开spider进行爬取时,它被scrapy调用。 scrapy只调用它一次,因此start_requests() 作为生成器实现是安全的。   

    默认实现Request(url, dont_filter=True)从start_urls中循环每一个url

  11. parse(response)

    这是scrapy用来处理下载响应的默认回调,start_urls里面的链接的请求完成下载后,parse方法就会被调用,返回的响应就会作为唯一的参数传递给parse方法。

  12.arguments属性

    spider可以接收修改其行为的参数,下面是一个示例:

import scrapy

class MySpider(scrapy.Spider):
    name = 'myspider'

    def __init__(self, category=None, *args, **kwargs):
        super(MySpider, self).__init__(*args, **kwargs)
        self.start_urls = [f'http://www.example.com/categories/{category}']
        # ...
scrapy crawl myspider -a category=electronics

  11.基它属性:

    1) state:一个 dict 可以用来在批次之间保持一些spider状态

  12.基它方法:

    1) from_crawler(crawler,*.args,**kwargs),创建类的方法,默认实现充当该__init__()方法的代理。

    

三.scrapy.Spider.CrawlSpider 类

  这是爬取常规网站最常用的爬虫,因为它通过定义一组规则为跟踪链接提供了一种方便的机制。

  它继承了spider的属性,该类还支持一个新的属性:

  rules属性对象:这是一个或多个rule对象的列表,每个rule定义了爬取网站的特定行为,如果多个规则匹配同一个链接,将使用每一个,根据在此属性中定义的顺序。

  rules对象包括:

    link_extractor(链接提取器对象)

    callback(可调用的回调方法)

    cb_wargs是一个包含要传递给回调函数的关键字参数的字典

    fllow一个布尔值,是否从使用规则提取的每个响应中遵循转接头,如果callback是None 默认为True,否则是False

  警告:基于crawlspider爬取时为新请求显示设置回调;否则可能会发生意外行为。

  下面是一个带有规则的示例:

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

class MySpider(CrawlSpider):
    name = 'example.com'
    allowed_domains = ['example.com']
    start_urls = ['http://www.example.com']

    rules = (
        # Extract links matching 'category.php' (but not matching 'subsection.php')
        # and follow links from them (since no callback means follow=True by default).
        Rule(LinkExtractor(allow=('category\.php', ), deny=('subsection\.php', ))),

        # Extract links matching 'item.php' and parse them with the spider's method parse_item
        Rule(LinkExtractor(allow=('item\.php', )), callback='parse_item'),
    )

    def parse_item(self, response):
        self.logger.info('Hi, this is an item page! %s', response.url)
        item = scrapy.Item()
        item['id'] = response.xpath('//td[@id="item_id"]/text()').re(r'ID: (\d+)')
        item['name'] = response.xpath('//td[@id="item_name"]/text()').get()
        item['description'] = response.xpath('//td[@id="item_description"]/text()').get()
        item['link_text'] = response.meta['link_text']
        url = response.xpath('//td[@id="additional_data"]/@href').get()
        return response.follow(url, self.parse_additional_page, cb_kwargs=dict(item=item))

    def parse_additional_page(self, response, item):
        item['additional_data'] = response.xpath('//p[@id="additional_data"]/text()').get()
        return item

 

posted on 2022-12-26 12:11  花阴偷移  阅读(18)  评论(0编辑  收藏  举报

导航