程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

[華為雲在線課程][Python網絡爬蟲][Scrapy框架介紹][七][學習筆記]

編輯:Python

1.爬蟲框架介紹

1.1.框架的概念

  • 框架是為了為解決一類問題而開發的程序,框架兩個字可以分開理解,框:表示制定解決問題的邊界,明確要解決的問題;架:表達的是能夠提供一定的支撐性和可擴展性;從而實現解決這類問題達到快速開發的目的。
  • 框架是一個半成品,已經對基礎的代碼進行了封裝並提供相應的API,開發者在使用框架時直接調用封裝好的API可以省去很多代碼編寫,從而提高工作效率和開發速度。

1.2.為什麼爬蟲需要使用框架

  • 在Python所編寫的爬蟲程序中,我們可以使用之前介紹的HTTP請求庫來完成90%的爬蟲需求。但是,由於一些其他的因素,比如爬取效率低、所需數據量非常大和開發效率等,所以我們會使用到一些框架來滿足這些需求。
  • 由於框架中封裝了一些通用的工具,可以節省開發者的時間,增加開發效率。

1.3.Scrapy

  • Scrapy是Python開發的一個快速、高層次的web數據抓取框架,用於抓取web站點並從頁面中提取結構化的數據。
  • Scrapy使用了Twisted異步網絡框架,可以加快我們的下載速度。只需要少量的代碼,就能夠實現數據快速的抓取。

1.4.Scrapy-Redis

  • Redis:是一個開源的使用ANSI C語言編寫、遵守BSD協議、支持網絡、可基於內存亦可持久化的日志型、Key-Value數據庫,並提供多種語言的API。
  • Scrapy-Redis是為了更方便地實現Scrapy分布式爬取,而提供了一些以redis為基礎的組件(僅有組件)。通過Scrapy-Redis可以快速地實現簡單分布式爬蟲程序,該組件本質上提供了三大功能:
    • scheduler,調度器
    • dupefilter,URL去重規則
    • item pipeline,數據持久化

1.5.PySpider

  • PySpider是一個簡單易用且強大的Python主流爬蟲框架。
  • PySprider帶有強大的WebUI、腳本編輯器、任務監控器、項目管理器以及結果處理器,它支持多種數據庫後端、多種消息隊列、JavaScript渲染頁面的爬取,使用起來非常方便。
  • PySprider的可擴展程度不足,可配置化程度不高。

2.Scrapy框架

2.1.爬蟲工作流程

2.2.Scrapy架構

2.3.異步非阻塞

  • 異步:調用在發出之後,這個調用就直接返回,不管有無結果;異步是過程。
  • 非阻塞:關注的是程序在等待調用結果(消息,返回值)時的狀態,指在不能立刻得到結果之前,該調用不會阻塞當前線程。

2.4.Scrapy組件

  • 引擎(Engine):用來處理整個系統的數據流處理,觸發事務(框架核心)。
  • 調度器(Scheduler):用來接受引擎發過來的請求,壓入隊列中,並在引擎再次請求的時候返回。可以想象成一個URL(抓取網頁的網址或者說是鏈接)的優先隊列,由它來決定下一個要抓取的網址是什麼,同時去除重復的網址。
  • 下載器(Downloader):用於下載網頁內容,並將網頁內容返回給spider(Scrapy下載器是建立在Twisted這個高效的異步模型上的)。
  • 爬蟲(Spiders):spider是爬蟲程序主體,用於從特定的網頁中提取自己需要的信息,即所謂的實體(item)。用戶也可以從中提取鏈接,讓Scrapy繼續抓取下一個頁面。
  • 管道(Pipeline):負責處理爬蟲從網頁中提取的實體,主要的功能是持久化實體、驗證實體的有效性、清除不需要的信息。當頁面被爬蟲解析後,將被發送到項目管道,並經過幾個特定的次序處理數據。
  • 下載器中間件(Downloader Middlewares):位於Scrapy引擎和下載器之間的框架,主要是處理Scrapy引擎與下載器之間的請求及響應。
  • 爬蟲中間件(Spider Middlewares):介於Scrapy引擎和爬蟲之間的組件,主要工作是處理spider的響應輸入和請求輸出。
  • 調度中間件(Scheduler Middlewares):介於Scrapy引擎和調度之間的中間件,從Scrapy引擎發送到調度的請求和響應。

2.5.創建Scrapy工程

  • 創建Scrapy項目的命令:scrapy startproject + <項目名字>
    • scrapy startproject MySprider
  • 工程結構

2.6.項目解析 - scrapy.cfg

  • scrapy.cfg:Scrapy的項目配置文件,其內定義了項目的配置文件路徑、部署相關信息等內容。
    • settings:項目中的全局配置文件。
    • deploy:項目部署配置。

2.7.項目解析 - middlewares

  • middlewares.py:可以分為爬蟲中間件和下載中間件。
    • MyspiderSpiderMiddleware:爬蟲中間件是可以自定義requests請求和進行response過濾,一般不需要手寫。
    • MyspiderDownloaderMiddleware可以自定義的下載擴展,比如設置代理等。

2.8.項目解析 - settings

  • settings.py:項目的全局配置文件。
  • 常用字段:
    • USER_AGENT:設置user-agent參數(默認未開啟)。
    • ROBOTSTXT_OBEY:是否遵守robots協議,默認是遵守(默認開啟)。
    • CONCURRENT_REQUESTS:設置並發請求的數量(默認是16個)。
    • DOWNLOAD_DELAY:下載延遲(默認無延遲)。
    • COOKIES_ENABLED:是否開啟cookie,即每次請求帶上前一次的cookie(默認是開啟)。
    • DEFAULT_REQUEST_HEADERS:設置默認請求頭(默認未設置)。
    • SPIDER_MIDDLERWARES:爬蟲中間件,設置過程和管道相同(默認未開啟)
    • DOWNLOADER_MIDDLEWARES:下載中間件(默認未開啟)。
    • ITEM_PIPELINES:開啟管道。

2.9.項目解析 - items,pipelines

  • items.py:定義item數據結構,即自己要爬取的內容,所有item的定義都可以放在這裡。
  • pipelines.py:定義item pipeline的實現用於保存數據。
    • 不同的pipeline可以處理不同爬蟲的數據,通過spider.name屬性來區分。
    • 不同的pipeline能夠對一個或多個爬蟲進行不同的數據處理的操作,比如一個進行數據清洗,一個進行數據的保存。
    • process_item(self,item,spider):實現對item數據的處理。
    • open_spider(self,spider):在爬蟲開啟的時候僅執行一次。
    • close_spider(self,spider):在爬蟲關閉的時候僅執行一次。

2.10.Scrapy爬蟲執行流程

2.11.ScrapyShell

  • ScrapyShell是Scrapy提供的一個終端工具,能夠通過它查看Scrapy中對象的屬性和方法,以及測試Xpath。
  • 在命令行內輸入:scrapy shell <網站的url>,進入Python的交互式終端。
  • 進入交互式命令行:scrapy shell http://xxxx.xxx
  • 進入交互式命令行後:
    • response.xpath():直接測試xpath規則是否正確。
    • response.url:當前響應的url地址。
    • response.request.url:當前響應對應的請求的url地址。
    • response.headers:響應頭
    • response.body:響應體,也就是html代碼,默認是byte類型。
    • response.requests.headers:當前響應的請求頭。

2.12.Scrapy日志

2.13.Scrapy日志解析

  • Scrapy在運行時會默認打印一些日志信息。
    • [scrapy.utils.log] INFO:scrapy工程的settings信息。
    • [scrapy.middleware] INFO:工程啟動的擴展程序、下載中間件、管道。
    • [scrapy.extension.telnet] DEBUG:爬蟲運行時能夠用talnet命令進行控制。
    • [scrapy.statscollectors] INFO:爬蟲結束時的一些統計信息。

2.14.爬蟲分類

  • Scrapy框架中的爬蟲分為兩類:Spider和Crawlspider。
  • Spider類的設計原則是只爬取start_url列表中的網頁。
  • Crawlspider是Spider的派生類(一個子類),CrawlSpider類定義了一些規則(rule)能夠匹配滿足條件的URL地址,組裝成Request對象後自動發送給引擎,同時能夠指定callback函數。

2.15.創建spider

  • 使用命令:scrapy genspider + <爬蟲名字> + <允許爬取的域名>
    • scrapy genspider baidu www.baidu.com

2.16.Spider參數解析

  • 使用命令創建spider後會自動生成一些代碼:
    • BaiduSpider:當前的爬蟲類。
    • name:爬蟲的唯一標識名。
    • allowed_domains:url范圍。
    • start_urls:起始爬取的url。
    • parse:數據定位。

2.17.定義parse

parse方法定義了response的處理過程:

  • Scrapy中的response可以直接使用xpath進行數據定位

2.18.Scrapy.Request

scrapy.Request(url[,callback,method=“GET”,headers,body,cookies,meta,dont_filter=False]):scrapy中用於發送請求的類。

  • callback:當前請求url的響應的處理函數。
  • method:指定POST或GET請求。
  • headers:接收一個字典,其中不包括cookies。
  • cookies:接收一個字典,專門放置cookies。
  • body:接收一個字典,為POST的數據。
  • dont_filter:過濾url,不會對已請求過的url再次請求。
  • meta:實現數據在不同的解析函數中傳遞。

2.19.運行爬蟲

在項目目錄下執行scrapy crawl +spider

  • scrapy crawl quote
  • 運行後會打印scrapy的項目日志,沒有開啟管道設置數據處理的方法,爬取的數據也會在日志文件中。

2.20.Crawlspider爬蟲創建

創建crawlspider:

  • scrapy genspider -t crawl 爬蟲名字 爬取范圍
  • scrapy genspider -t crawl crawl_baidu www.baidu.com

2.21.Crawlspider參數解析

相比於Spider,CrawlSpider中多了rules屬性。少了parse方法。

  • rules:滿足匹配規則的url。
  • Rule表示規則。
  • LinkExtractor:連接提取器,可以通過正則、xpath來進行匹配。
  • callback:表示經過連接提取器提取出來的url地址響應的回調函數。

2.22.Scrapy中間件

  • Scrapy中的中間件主要功能為在爬蟲運行過程中進行一些處理,如對於非200的響應後續處理、發送請求時headers字段和cookie的處理。
  • Scrapy中的中間件根據功能可以分為兩類:下載中間件、爬蟲中間件。

2.23.下載中間件

  • 主要功能在請求到網頁後,頁面被下載時進行一些處理。
  • 下載中間件Downloader Middlewares:
    • process_request(self,request,spider):當每個request通過下載中間件時,該方法被調用。
    • process_response(self,request,response,spider):當下載器完成http請求,傳遞響應給引擎時調用。

2.24.爬蟲中間件

  • 主要功能是在爬蟲運行過程中進行一些處理。
  • 爬蟲中間件Spider Middleware:
    • process_spider_input:接收一個response對象並處理。
    • process_spider_exception:spider出現的異常時被調用。

2.25.中間件使用注意事項

  • Scrapy中的中間件寫在工程項目中的middlewares.py文件中。
  • 中間件在寫好以後需要在settings.py文件中開啟。
    • SPIDER_MIDDLEWARES:爬蟲中間件
    • DOWNLOADER_MIDDLEWARES:下載中間件

  1. 上一篇文章:
  2. 下一篇文章:
相關文章
    没有相关文章
Copyright © 程式師世界 All Rights Reserved