天天看點

python爬蟲:scrapy架構Scrapy類與子類CrawlSpiderScrapy類CrawlSpider類Rule類CrawlSpider樣例

Scrapy類

name

字元串,爬蟲名稱,必須唯一,代碼會通過它來定位spider

allowed_domains

清單,允許域名

沒定義 或 空: 不過濾,

url不在其中: url不會被處理,

域名過濾功能: settings中OffsiteMiddleware

start_urls

:清單或者元組,任務的種子

custom_settings

:字典,覆寫項目中的settings.py

crawler

:Crawler 執行個體

settings

:Settings 執行個體

logger

:記錄日志

from_crawler()

:類方法,建立spider時調用

start_requests()

:必須傳回一個可疊代對象

make_requests_from_url(url)

:預設parse回調, dont_filter=True,不過濾url

parse(response)

: 預設回調方法, 傳回值隻能是Request, 字典和item對象,或者它們的可疊代對象

log(message[, level, component])

:對logger的包裝

closed(reason)

:spider結束時調用

參考文章

scrapy系列(三)——基礎spider源碼解析

CrawlSpider類

CrawlSpider繼承于Spider,為全站爬取而生

rules:清單,元素為Rule類的執行個體,采集行為。類似Django的url比對

如果有多個rule都比對同一個連結,那麼位置下标最小的一個rule将會被使用。

要request的位址和allow_domain裡面的沖突,進而被過濾掉。

可以停用過濾功能。

yield Request(url, callback=self.parse_item, dont_filter=True)

__init__:執行了_compile_rules方法

parse:重寫預設回調方法,調用方法_parse_response

parse_start_url:處理parse傳回的response

_requests_to_follow:response中解析出目标url,并将其包裝成request請求

_response_downloaded:_requests_to_follow的回調方法,作用就是調用_parse_response方法

_parse_response:spider._follow_links的值是從settings的CRAWLSPIDER_FOLLOW_LINKS值擷取到的。

_compile_rules:将rule中的字元串表示的方法改成實際的方法

from_crawler:

Rule類

link_extractor:Link Extractor執行個體,解析規則。

callback:方法或字元串,回調方法,慎用parse做為回調方法

cb_kwargs:字典,用于給callback方法傳遞參數

follow:布爾對象,表示是目前response否繼續采集。如果callback是None,那麼它就預設為True,否則為False。

process_links:在crawlspider中的_requests_to_follow方法中被調用,元素為Link的清單作為參數,傳回值也是一個元素為Link的清單,目标url是相對的連結,那麼scrapy會将其擴充成絕對的

process_request:處理request

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 = (
        # 提取比對 'category.php' (但不比對 'subsection.php') 的連結并跟進連結(沒有callback意味着follow預設為True)
        Rule(LinkExtractor(allow=('category\.php', ), deny=('subsection\.php', ))),

        # 提取比對 'item.php' 的連結并使用spider的parse_item方法進行分析
        Rule(LinkExtractor(allow=('item\.php', )), callback='parse_item'),
    )

    def parse_item(self, response):
        self.log('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()').extract()
        item['description'] = response.xpath('//td[@id="item_description"]/text()').extract()
        return item      

參考文章:

scrapy系列(四)——CrawlSpider解析 Spiders-爬取規則(Crawling rules)