scrapy爬蟲框架

Wise-發表於2020-12-22

Scrapy簡介

Scrapy 是用 Python編寫而成用以爬取網站資料、提取結構性資料而編寫的應用框架。通過使用Scrapy框架,我們能夠簡單的爬取指定網站的內容或圖片。

Scrapy框架檔案結構

首先我們建立一個Scrapy專案,目錄結構如下所示。

cnblog/
    scrapy.cfg # 專案的配置檔案
    
    cnblog/
         __init__.py
         
        items.py # 定義你所要抓取的欄位
        
        pipelines.py # 管道檔案,當spider抓取到內容(item)以後,會被送到這裡,這些資訊(item)在這裡會被清洗,去重,儲存到檔案或者資料庫。
        
        middlewares.py # 中介軟體,主要是對功能的擴充,你可以新增一些自定義的功能,比如新增隨機user-agent, 新增proxy。
        
        settings.py # 設定檔案,用來設定爬蟲的預設資訊,相關功能開啟與否,比如是否遵循robots協議,設定預設的headers,設定檔案的路徑,中介軟體的執行順序等等。
        
        spiders/ # 在這個資料夾下編寫自己的spider
            __init__.py

Scrapy爬取部落格園

1.進入專案資料夾,建立自己的爬蟲檔案,如下的命令在終端執行。

cd cnblog
scrapy genspider cnblog_spider cnblogs.com

2.進入我們剛才建立的爬蟲檔案cnblog_spider,發現框架已經自動生成了爬蟲主要程式碼,只要補充自己想要爬取的專案即可,我希望爬取部落格園的文章連結以及題目,所以我補充瞭如下程式碼,順便進行輸出,可以直觀的看到專案是否執行成功。

        title = response.xpath('//a[@class="post-item-title"]/text()').extract()
        url = response.xpath('//a[@class="post-item-title"]/@href').extract()
        print(title)
        print(url)

3.在終端執行爬蟲專案。

scrapy crawl cnblog_spider

得到如下執行結果,至此一個簡單的爬蟲專案就執行成功了。

Scrapy實現檔案儲存

如果希望儲存我們爬取的資訊,則需要在items.py檔案中定義它們,item是儲存爬取到的資料的容器,其使用方法和dict字典類似,對於items中定義資訊,只需要根據提示補充程式碼即可。

class CnblogItem(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()
    title = scrapy.Field()
    url = scrapy.Field()

接下來需要在爬蟲檔案中匯入我們剛才在items中定義的CnblogItem類,使用字典的方法就可以給items進行賦值。最後yield生成器,將items傳遞給管道pipeline進行後續操作。

    def parse(self, response):
        items = CnblogItem()
        # extract()使得使提取內容轉換為Unicode字串,返回資料型別為list
        items['title'] = response.xpath('//a[@class="post-item-title"]/text()').extract()
        items['url'] = response.xpath('//a[@class="post-item-title"]/@href').extract()
        yield items # 生成器相當於用後銷燬,節省記憶體。

修改管道pipelines.py檔案,這裡本來有一個自定義的CnblogPipeline類,為了更好的介紹Scrapy框架的使用,我這裡又定義了一個PrintPipeline類。管道pipelines.py檔案的作用就是實現資料的輸出處理,也可以完成儲存的工作。

class CnblogPipeline:
    def process_item(self, item, spider):
        with open('cnblogs.txt','a',encoding='utf8') as f:
            title = item['title']
            url = item['url']
            # print(title)
            # print(url)
            for i,j in zip(title,url):
                f.write(i+':'+j+'\n')
        return item

class PrintPipeline:
    def process_item(self, item, spider):
        print('Printitem::'+item['title'])
        return item

最後需要在Seeting.py檔案中開啟ITEM_PIPELINES,同時新增在管道中新定義類PrintPipeline,並且標註優先順序。

ITEM_PIPELINES = {
   'cnblog.pipelines.CnblogPipeline': 300, # 數字代表優先順序
   'cnblog.pipelines.PrintPipeline': 500
}

至此,就可以執行Scrapy框架了!

執行完成!!!恭喜你,程式無Bug!!!

相關文章