Scrapy入門:簡單爬蟲項目梳理整個框架操作流程

1. 準備工作

只需要安裝 Scrapy 庫即可,我實用的是 Pycharm 軟件,安裝的話只需要在菜單setting/project/project interpreter中添加第三包,搜索 scrapy 即可進行安裝。
在這裏插入圖片描述
或簡單粗暴:

pip install scrapy

2. 準備工作

2.1 創建項目

創建一個 Scrapy 項目,項目文件可以直接實用 scrapy 命令生成:

scrapy startproject 文件名稱

這個命令在cmd命令中執行,如果提示權限問題,可以加 sudo 運行該命令。該命令可以直接執行,不管在那個路徑下,但是我還是建議放在非系統盤下的指定常用的文件下,便於日後的分類和管理。文件的結構如下:
在這裏插入圖片描述

2.2 簡單解釋所創文件的結構

  1. scrapy_test (項目的名字)
  2. items.py (Item的定義,定義爬取的數據結構)
  3. middlewares.py (Middlewares的定義,定義爬取時的中間件)
  4. pipelines.py (Pipelines的定義,定義數據管道)
  5. settings.py (配置文件)
  6. spiders (放置 Spider 的文件夾,裏面存放了 Spider 的實例)

3. 創建 Spider

Spider 是自己定義的類,Scrapy 用它來從網頁裏抓取內容,並解析抓取的結果。這個類提供的Spider類得繼承scrapy.Spider,還要定義Spider的名稱和起始的請求,以及怎樣處理爬取後的結果的方法。

使用命令創建(小技巧,直接用Pycharm打開剛纔所創建的項目,在下方的Terminal處執行命令):

scrapy genspider Spider名稱 網站域名
# scrapy genspider quotes.toscrape.com

執行後spiders文件夾下多了一個quotes.py,他就是剛剛創建的Spider,內容如下:

import scrapy

class QuotesSpider(scrapy.Spider):
    # 項目名 唯一 用來區分不同的 Spider
    name = 'quotes'
    # 允許爬取的域名 如果初始或後續的請求鏈接不是這個域名下的,則請求鏈接會被過濾掉
    allowed_domains = ['quotes.toscrape.com']
    # 包含了 Spider 在啓動時爬取的url列表,初始請求是由它來定的
    start_urls = ['http://quotes.toscrape.com/']

    # 被調用時 start_url 裏面的鏈接構成的請求完成下載執行後,返回的響應就會被作爲唯一的參數傳遞給這個函數。
    # 該方法負責解析返回的響應,提取數據或者進一步生成要處理的請求
    def parse(self, response):
    	pass

裏面所涉及的變量都有註釋解釋。

4. 分析目標網頁和你所要爬取的內容

該網頁用的是書中給出的網址

url = 'http://quotes.toscrape.com/'

該網頁沒有任何的反爬限制,即使你不更換請求頭也可以進行源碼的爬取,如下是網頁的源碼:
在這裏插入圖片描述
在這裏插入圖片描述
如源碼所示,所要爬取的信息都封裝在 class=“quote” 的 span 標籤中,看其中具體的,我們所要提取便是 text,author,tag三個信息,源碼過於簡單,不再多的敘述…

5. 創建 Item

Item是保存爬取數據的容器,它的使用方法和字典類似。不過相比字典,Item多了額外的保護機制,可以避免拼寫錯誤或者定義字段錯誤。

創建Item需要繼承 scrapy.Item 類,並且定義類型爲 scrapy.Field 的字段。由上分析源碼得知爬取的內容有 text、author、tags。

定義Item:
在這裏插入圖片描述

6. 使用Item,重寫Spider中parse()方法

在這裏插入圖片描述

7. 構造請求,使用回調函數實現連續抓取

上面的操作只能實現對初始請求隊列的抓取,那麼下一頁的內容該如何抓取呢?分析網頁源碼:
在這裏插入圖片描述
可以看到,在網頁的最下端有 Next 按鈕,而它的源碼便是下一頁的網頁鏈接,便通過這個按鈕來構造下一個請求。

構造請求時要用到 scrapy.Request 。所需要傳遞兩個參數時 url 和 callback

  1. url:請求鏈接
  2. callback:回調函數。回調函數 指定了該回調函數的請求完成之後,獲取到響應後,引擎會將該響應作爲參數傳遞給這個回調函數。其進行解析生成下一個請求

由於下一頁的網頁結構和第一頁的相同,便可以接着使用 parse()函數進行解析,在 parse() 方法後追加如下代碼便可實現回調函數,爬蟲的循環,直至把該網站所有網頁爬取完:

next = response.xpath('//li[@class="next"]/a/@href').extract_first()
        url = response.urljoin(next)
        # 兩個參數 url 和 callback
        # url : 請求鏈接
        # callback : 回調函數 指定了該回調函數的請求完成之後,獲取到響應後,引擎會將該響應作爲參數傳遞給這個回調函數。其進行解析生成下一個請求
        yield scrapy.Request(url=url,callback=self.parse)

8. 最終的 Spider

在這裏插入圖片描述

9. 運行整體架構

在下方的Terminal處執行命令:

scrapy crawl quotes

接下來就可看到運行的結果了(過長,只放兩張截圖):
在這裏插入圖片描述
在這裏插入圖片描述

10. 保存到文件

執行命令:

scrapy crawl -o quotes.json
# 保存爲 json 文件格式
'''
更多的文件格式
				quotes.jsonline
				quotes.csv
				quotes.xml
				quotes.pickle
				quotes.marshal
				ftp://user:[email protected]/path/to/quotes.csv
'''

11. 使用 Item Pipeline 進行數據的清洗

當然要將數據保存如數據庫當中也得在這個文件中進行方法的重寫。

'''
Item Pipeline 項目管道。當 Spider 中的Item對象生成後,會被自動送到 Item Pipeline 中進行處理
其作用:清理 HTML 數據;
        驗證爬取數據,檢查爬取字段;
        查重並丟棄重複的結果;
        將爬取的結果保存到數據庫。
實現 process_item() 方法,兩個參數 item 和 spider (spider 實例)
'''

在 pipeline.py 中進行方法的重寫:
在這裏插入圖片描述

以上就是Scrapy框架,從項目的創建到數據的爬取清洗的整個流程。

繼續努力,加油!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章