1. 程式人生 > >scrapy進階(CrawlSpider爬蟲__爬取整站小說)

scrapy進階(CrawlSpider爬蟲__爬取整站小說)

bool rap val 正則表達 attr 種類 python list false

# -*- coding: utf-8 -*-
import scrapy,re
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule
from crawlspider.items import CrawlspiderItem


class CrawlspidersSpider(CrawlSpider):
    name = ‘CrawlSpiders‘
    allowed_domains = [‘sbiquge.com‘]
    start_urls = [‘https://www.sbiquge.com/biqukan/‘]

    rules = (
        Rule(LinkExtractor(allow="/\d+?_\d+?/",unique=True),callback=‘parse_item‘,follow=False),
        # 註意使用restricted_xpath提取鏈接的時候只能到標簽就好了,千萬不要到具體的標簽屬性,那叫畫蛇添足。
        # 這個rule實例有callback屬性,那麽它就是從所有下載到的response裏面提取鏈接,並下載鏈接內容由回調函數處理數據
    )
    def parse_item(self, response):

        chap_list = response.xpath(‘.//*[@class="listmain"]/dl/dd‘)
        for chapter in chap_list:
            novel_name = chapter.xpath(‘//*[@id="book"]/div[1]/div/a[2]/text()‘).extract_first()
            chapter_name = chapter.xpath(‘./a/text()‘).extract_first()
            chapter_link = chapter.xpath(‘./a/@href‘).extract_first()
            if chapter_name:
                item = CrawlspiderItem(chapter_title=chapter_name,novel_name=novel_name)
                url = response.urljoin(chapter_link)
                request = scrapy.Request(url=url,callback=self.parse_body)
                request.meta[‘key‘] = item
                yield request

    def parse_body(self,response):
        item = response.meta[‘key‘]
        content_list = response.xpath(‘.//*[@id="content"]‘).re(‘([\u4e00-\u9fa5]|<br>)+?‘) # 匹配到的是一個列表
        # 利用re直接匹配小說的漢字內容.正則可以匹配標簽下的任何內容,這樣我們可以提取我們想要的數據
        content_str = ‘‘.join(content_list)
        content = re.sub(‘<br><br>‘,‘\n  ‘,content_str)
        # 對匹配的章節進行分段
        item[‘content‘] = content
        yield item

  

重點在於CrawlSpider的學習!!!!!!!!!!!!!

**通過前面的學習我們可以進行一些頁面的簡單自動話爬取,對於一些比較規則的網站,我們似乎可以用Spider類去應付,可是,對於一些較為復雜或者說鏈接的存放不規則的網站我們該怎麽去爬取呢,接下來的爬蟲就是要解決這個問題,而且還可以高度的自動化爬取鏈接和鏈接內容**
1
CrawlSpider類,是建立爬蟲的另外一個類。

*(順便說一下,我們可以繼承四種類來建立我們的scrapy爬蟲,他們是:Spider類,CrawlSpider類, CSVFeedSpider類和XMLFeedSpider類,今天我們講的就是CrawlSpider類建立的爬蟲)*
1
CrawlSpider類通過一些規則(rules),使對於鏈接(網頁)的爬取更具有通用性,換句話說,CrawlSpider爬蟲為通用性的爬蟲,而Spider爬蟲更像是為一些特殊網站制定的爬蟲。

那我們開始正式的講解一下CrawlSpider爬蟲。。。。

首先我們建立一個爬蟲工程:

scrapy startproject crawlspider
1
這個我們很熟悉,接下來創建一個CrawlSpider爬蟲

scrapy genspider -t crawl Crawlspider domain.com
1
註意上面,我們比Spider爬蟲建立時多了一個’-t crawl’,這是值爬蟲的類
這樣以後我們就可以在我們的spiders文件中找到這個爬蟲

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


class CrawlspiderSpider(CrawlSpider):
name = ‘crawlspider‘
allowed_domains = [‘domain.com‘]
start_urls = [‘http://domain.com/‘]

rules = (
Rule(LinkExtractor(allow=r‘Items/‘), callback=‘parse_item‘, follow=True),
)

def parse_item(self, response):
i = {}
#i[‘domain_id‘] = response.xpath(‘//input[@id="sid"]/@value‘).extract()
#i[‘name‘] = response.xpath(‘//div[@id="name"]‘).extract()
#i[‘description‘] = response.xpath(‘//div[@id="description"]‘).extract()
return i

上面是打開爬蟲後,自動生成的一段代碼,這段代碼可以說基本上對於CrawlSpider爬蟲的結構有一個構造,我們看到,有一個rules屬性,還有這個爬蟲繼承的類是CrawlSpider,這兩點就是與前幾篇講的Spider爬蟲的區別。其中rules屬性使這個爬蟲的核心

所以我們在開始講我們的實戰項目之前我們應該先講一下這個rules屬性。
rules屬性由幾個Rule對象構成,而Rule對象定義了提取鏈接等操作的規則

那麽Rule的構造又是怎樣的呢?
Rule對象有六個屬性,他們分別是:

LinkExtractor(…),用於提取response中的鏈接
callback=‘str’,回調函數,對提取的鏈接使用,用於提取數據填充item
cb_kwargs,傳遞給回調函數的參數字典
follow=True/False,對提取的鏈接是否需要跟進
process_links,一個過濾鏈接的函數
process_request,一個過濾鏈接Request的函數
上面的參數除了LinkExtractor外其它都是可選的,且當callback參數為None時,我們稱這個rule為一個‘跳板’,也就是只下載頁面,並不進行任何行為,通常作翻頁功能
我們需要解釋主要是LinkExtractor參數和follow參數:

一、LinkExtractor參數,明顯是用來提取鏈接的。那麽他是怎麽來定義提取鏈接的規則的呢?它有十個參數,用來定義提取鏈接的規則,分別是:
1. allow=‘re_str’:正則表達式字符串,提取response中符合re表達式的鏈接。
2. deny=‘re_str’:排除正則表達式匹配的鏈接
3. restrict_xpaths=‘xpath_str’:提取滿足xpath表達式的鏈接
4. restrict_css=‘css_str’:提取滿足css表達式的鏈接
5. allow_domains=‘domain_str’:允許的域名
6. deny_domains=‘domain_str’:排除的域名
7. tags=‘tag’/[‘tag1’,’tag2’,…]:提取指定標簽下的鏈接,默認會從a和area標簽下提取鏈接
8. attrs=[‘href’,’src’,…]:提取滿足屬性的鏈接
9. unique=True/False:鏈接是否去重
10.process_value:值處理函數,優先級要大於allow
以上的參數可以一起使用,以提取同時滿足條件的鏈接

二、follow參數:
為Boolean值,用於是否跟進鏈接的處理,在callback為None時,默認是跟進鏈接的,值為True;當callback不為空時,默認是False的,不跟進鏈接。當然我們可以根據需要賦值,

那麽,什麽叫跟進,什麽叫不跟進呢?
就是你前面定義的規則對於已經提取到的鏈接的頁面是不是在進行一次提取鏈接。
1
2
好!那麽rules到底是怎麽工作的呢?
這樣的,對於Rule提取的鏈接會自動調用parse函數,並返回該鏈接的response,然後將這個response給callback回調函數,通過回調函數的解析對item進行填充

對了,CrawlSpider爬蟲還有一個parse_start_url()方法,用於解析start_urls中的鏈接頁面,這個方法一般用於有跳板的爬蟲中,用於對首頁的解析

說了那麽多,我們來說說我們的爬蟲項目。用CrawlSpider爬蟲,爬取整站的小說

scrapy進階(CrawlSpider爬蟲__爬取整站小說)