(一)Scrapy的命令行

最近一直都是在用自己寫的抓取框架做爬蟲,還是系統的整理一下Scrapy相關的知識,做一個old school 的爬蟲。
爬蟲的整個流程,就是發送網絡請求,處理返回的內容兩個過程。然後我們將這個流程細化;如何準備需要訪問的鏈接,需要訪問的鏈接應該是哪些鏈接;發送請求時我們帶上什麼,如何更快的發送更多請求;對返回的內容需要做哪些操作……

不講實例,只看實現。從Scrapy的源碼來讀Scrapy到底是如何執行這些流程,就當睡前讀物,畢竟技多不壓身。
Scrapy文檔:https://docs.scrapy.org/en/latest/
Scrapy官網:https://scrapy.org/
Scrapy目錄結構:scrapy目錄下的基本就是我要找到的各種實現,*.py文件再從各目錄下進行import全部模塊。
在這裏插入圖片描述

啓動部分:
從我記憶裏Scrapy的啓動方式一步步來看,首先看scrapy的命令行是怎麼運行起來的。cmdline.py和command.py兩個文件。command.py從commands文件夾中導入,commands文件夾下的就是常見的各種命令,描述着當我們在命令行下調用這些命令時會發生什麼。init.py文件裏是所以命令的基類ScrapyCommand。而這一些都是通過cmdline.py中來執行的,當我們最開始下載完Scrapy後在命令行輸入scrapy時。
在這裏插入圖片描述

我們可以從命令行裏看到上面的結果,而這一切都是在cmdline.py中進行操作的。當cmdline.py運行時,會調用execute方法。

(1)當不帶參數或帶上了錯誤參數
在這裏插入圖片描述
execute方法最開始會獲取最近的項目配置並加載,因爲我此前並不在某個項目下,所以輸出no active project。(圖中inproject是一個bool值,在utils\conf.py中尋找scrapy.cfg文件,如果不存在則往上一級查找,查看現在是否在某個項目下。)
cmds是對commands文件夾下的各個命令進行加載,cmdname是對當前參數中的命令進行驗證。
當不帶任何參數的時候,調用_print_commands方法。方法裏的代碼是不是似曾相識,就是我們直接在命令行輸入scrapy顯示的內容。

def _print_commands(settings, inproject):
    _print_header(settings, inproject)
    print("Usage:")
    print("  scrapy <command> [options] [args]\n")
    print("Available commands:")
    cmds = _get_commands_dict(settings, inproject)
    for cmdname, cmdclass in sorted(cmds.items()):
        print("  %-13s %s" % (cmdname, cmdclass.short_desc()))
    if not inproject:
        print()
        print("  [ more ]      More commands available when run from project directory")
    print()
    print('Use "scrapy <command> -h" to see more info about a command')

(2)當帶上正確參數
cmds中已經獲取cmd對象,根據傳入的參數獲取對應的cmd對象。注意的是兩個_run_print_help方法;第一個是執行cmd的process_options方法,對cmd對象的setting進行一些初始化的設置(如log文件位置,等級的一些設置);設置好之後給cmd設置crawler_process對象。第二個是_run_command方法,通過傳入的cmd執行對應的run方法。
在這裏插入圖片描述

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