1. 程式人生 > >Scrapy框架的學習(9.Scrapy中的CrawlSpider類的作用以及使用,實現優化的翻頁爬蟲)

Scrapy框架的學習(9.Scrapy中的CrawlSpider類的作用以及使用,實現優化的翻頁爬蟲)

1.CrawlSpider類通過一些規則(rules),使對於連結(網頁)的爬取更具有通用性,

      換句話說,CrawlSpider爬蟲為通用性的爬蟲,

        而Spider爬蟲更像是為一些特殊網站制定的爬蟲。它基於Spider並有一些獨特屬性

     rules:Rule物件的集合,用於匹配目標網站並排除干擾

     parse_start_url: 用於爬取起始響應,必須要返回Item

2. Scrapy中的爬蟲方法繼承四種類來建立我們的scrapy爬蟲,

    他們是:Spider類,CrawlSpider類, CSVFeedSpider類和XMLFeedSpider類

     

 3. 通過命令的方式生成一個CrawlSpider類的模板

     scrapy genspider -t crawl 爬蟲 域名

4. 通過爬取這個網站http://bxjg.circ.gov.cn/web/site0/tab5240/module14430/page1.htm 來使用CrawlSpider類進行爬蟲

   (1)建立好專案後,建立爬蟲(加入了-t crawl

) scrapy genspider -t crawl punish bxjg.circ.gov.cn

   (2)   可以使用rules規則,就可以不用再寫一個專門針對於下一頁的請求函數了

rules = (
        Rule(LinkExtractor(allow=r'/web/site0/tab5240/info\d+\.htm'), callback='parse_item'),
        Rule(LinkExtractor(allow=r'/web/site0/tab5240/module14430/page\d+\.htm'),follow=True),
    )

LinkExtractor 連線提取器,提取url 

     引數: 

        url allow : 可以寫入正則表示式

       callback: 提取出來的url地址的response交給callback處理 ,需要時再用,一般對應的網站詳情頁面要使用

         follow: 表示當前的url地址的響應是否重新經過rules來提取url地址,需要時再用

  (3)  然後 編寫爬蟲的程式碼 

# -*- coding: utf-8 -*-
import scrapy
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule
import re
'''繼承spider的crawlspider類'''
class PunishSpider(CrawlSpider):
    name = 'punish'
    allowed_domains = ['bxjg.circ.gov.cn']
    start_urls = ['http://bxjg.circ.gov.cn/web/site0/tab5240/module14430/page1.htm']
    '''
        可以定義提取url地址的規則
        LinkExtractor 連線提取器,提取url
        allow : 可以寫入正則表示式
        callback: 提取出來的url地址的response交給callback處理
        follow: 表示當前的url地址的響應是否重新經過rules來提取url地址
    '''
    rules = (
        Rule(LinkExtractor(allow=r'/web/site0/tab5240/info\d+\.htm'), callback='parse_item'),
        Rule(LinkExtractor(allow=r'/web/site0/tab5240/module14430/page\d+\.htm'),follow=True),
    )
    '''與Spider類不同,CrawlSpider類中的parse函式有特殊功能,不能定義'''
    def parse_item(self, response):
        item = {}
        item['title'] = re.findall("<!--TitleStart-->(.*?)<!--TitleEnd-->",response.body.decode())[0]
        item['publish_date'] = re.findall("釋出時間:(20\d{2}-\d{2}-\d{2})",response.body.decode())[0]
        print(item)

   (4)  在setting.py裡面設定   LOG_LEVEL = "WARNING" 以及開啟並設定 USER_AGENT,然後在終端執行程式

    scrapy crawl punish

    

(5) LinKExtractor更多常見的引數:

   

5.  再請求詳情頁的時候,我們也可以使用在Spider類中一樣,

    通過   yield scrapy.Request()   方法也可以實現,但是程式碼會寫的比使用Crawlspider類中的多