Scrapy

  步驟
    1.創建工程和 Spider 模版
      scrapy startproject 名稱
      cd 名稱
      scrapy genspider 爬蟲名稱 爬取的地址
      進一步修改 spiders/爬蟲文件
    2.編寫 Spider
      配置 爬蟲文件
      修改對返回頁面的處理
      修改對新增URL爬取請求的處理
    3.編寫 ITEM Pinpelines
      配置 pipelines.py 文件
      定義對爬取項(Seraped Item)的處理類
 
  配置併發鏈接選項
    settings.py
      CONCURRENT_REQUESTS Downloader 最大併發請求下載數量,默認爲32
      CONCURRENT_ITEMS Item Pinpeline 最大併發 ITEM 處理數量,默認100
      CONCURRENT_REQUESTS_PER_DOMAIN 每一個目標域名最大的併發請求數量,默認8
      CONCURRENT_REQUESTS_PER_IP 每一個目標IP最大併發請求數量,默認0,非0有效
 
  requests vs Scrapy
    相同點
      二者均可以進行頁面請求和爬取,Python爬蟲的兩個重要技術路線
      二者可用性都好,文檔豐富,入門簡單
      二者都沒有處理js,提交表單,應對驗證碼等功能(可擴展)
 
  全局命令
    startproject
      語法: scrapy startproject <project_name>
      這個命令是scrapy最爲經常使用的命令之一,它將會在當前目錄下建立一個名爲 <project_name>的項目。
 
    settings
      語法: scrapy settings [options]
      該命令將會輸出Scrapy默認設定,固然若是你在項目中運行這個命令將會輸出項目的設定值。
 
    runspider
      語法: scrapy runspider <spider_file.py>
      在未建立項目的狀況下,運行一個編寫在Python文件中的spider。
 
    shell
      語法: scrapy shell [url]
      以給定的URL(若是給出)或者空(沒有給出URL)啓動Scrapy shell。
      例如,scrapy shell http://www.baidu.com將會打開百度URL,
      而且啓動交互式命令行,能夠用來作一些測試。
 
    fetch
      語法: scrapy fetch <url>
      使用Scrapy下載器(downloader)下載給定的URL,並將獲取到的內容送到標準輸出。簡單的來講,就是打印url的html代碼。
 
    view
      語法: scrapy view <url>
      在你的默認瀏覽器中打開給定的URL,並以Scrapy spider獲取到的形式展示。 有些時候spider獲取到的頁面和普通用戶看到的並不相同,一些動態加載的內容是看不到的, 所以該命令能夠用來檢查spider所獲取到的頁面。
 
    version
      語法: scrapy version [-v]
      輸出Scrapy版本。配合 -v 運行時,該命令同時輸出Python, Twisted以及平臺的信息。
 
  --項目命令
    crawl
      語法: scrapy crawl <spider_name>
      使用你項目中的spider進行爬取,即啓動你的項目。這個命令將會常常用到,咱們會在後面的內容中常常使用。
 
    check
      語法: crapy check [-l] <spider>
      運行contract檢查,檢查你項目中的錯誤之處。
 
    list
      語法: scrapy list
      列出當前項目中全部可用的spider。每行輸出一個spider。
 
    genspider
      語法: scrapy genspider [-t template] <name> <domain>
      在當前項目中建立spider。該方法可使用提早定義好的模板來生成spider。您也能夠本身建立spider的源碼文件。
 
    view使用瀏覽器打開網頁
      scrapy view http://www.baidu.com
 
    shell命令, 進入scrpay交互環境
      #進入該url的交互環境
      scrapy shell http://www.dmoz.org/Computers/Programming/Languages/Python/Books/
      以後便進入交互環境
      咱們主要使用這裏面的response命令, 例如可使用
      response.xpath() #括號裏直接加xpath路徑
 
    runspider命令用於直接運行建立的爬蟲, 並不會運行整個項目
      scrapy runspider 爬蟲名稱
 
  爲何Scrapy 採用命令行建立和運行爬蟲?
    命令行(不是圖形界面)更容易自動化,合適腳本控制
    本質上, Scrapy 是給程序員用的,功能(而不是界面)更重要
 
  生成的工程目錄
    python123demo/ 外層目錄
    scrapy.cfg 部署 Scrapy 爬蟲的配置文件
    python123demo/ Scrapy 框架的用戶自定義 python代碼
      __init__.py 初始化腳本
      items.py Items 代碼模版(繼承類)
      middlewares.py Middlewares 代碼模版(繼承類)
      pipelines.py Pipelines 代碼模版(繼承類)
      settings.py Scrapy 爬蟲的配置文件
      spiders/ Spiders 代碼模版目錄(繼承類)
        __init__.py 初始文件,無需修改
        __pycache__/ 緩存目錄,無需修改
 
 
    parse() 用於處理響應,解析內容造成字典,發現新的URL爬取請求
 
Scrapy 爬蟲的數據類型
  Request 類
    class scrapy.http.Request()
      Request 對象表示一個HTTP請求
      由 Spider 生成,由 Downloader 執行
 
    .url Request 對應的請求URL
    .method 對應的請求方法,‘GET’'POST'等
    .headers 字典類型風格的請求頭
    .body 請求內容主體,字符串類型
    .meta 用戶添加的擴展信息,在 Scrapy 內部,模塊間傳遞信息使用
    .copy() 複製該請求
 
  Response 類
    class scrapy.http.Response()
      Response 對象表示一個HTTP請求
      由 Downloader 生成,由 Spider 執行
 
    .url Response 對應的請求URL
    .status HTTP 狀態碼,默認200
    .headers Response 對應的頭部信息
    .body Response 對應的內容信息,字符串類型
    .flags 一組標記
    .request 產生 Response 類型對應的 Response 對象
    .copy() 複製該請求
 
  Item 類
    class scrapy.item.Request()
    Item 對象表示一個從HTML頁面中提取的信息內容
    由 Spider 生成,由 Item Pinpeline 執行
    Item 相似字典類型,能夠按照字典類型操做
 
CSS Selector 的基本使用
  <html>.css('a::attr(href)').extract()
 
Scrapy 爬蟲框架結構
  Downloader Middleware
    目的:實施 Engine,Scheduler,Downloader 之間進行用戶可配置的控制
    功能:修改,丟棄,新增請求或響應
 
  Spider
    解析 Downloader 返回的響應 (Response)
    產生爬取項 (scraped item)
    產生額外的爬取請求 (Request)
 
  Item Pinpelines
    以流水線方式處理 Spider 產生的爬取項
    有一組操做順序組成,相似流水線,每一個操做是一個 Item Pinpeline 類型
    可能操做包括:清理,檢驗和查重爬取項中的HTML數據,將數據存儲到數據庫
    須要用戶編寫配置代碼
 
  Spider Middleware
    目的:對請求和爬取項的再處理
    功能:修改,丟棄,新增請求或爬取項
    須要用戶編寫配置代碼
 
yield 關鍵字
  yield 生成器
    生成器是一個不斷產生值的函數
    包含yield語句的函數是一個生成器
    生成器每次產生一個值(yield語句),函數被凍結,被喚醒後在產生一個值
 
  爲什麼要有生成器?
    生成器相比一次列多全部內容的優點
      更節省存儲空間
      響應更迅速
      使用更靈活
相關文章
相關標籤/搜索