終極大招——Scrapy框架

 

Scrapy框架

  Scrapy 是一個開源和協做的框架,其最初是爲了頁面抓取 (更確切來講, 網絡抓取 )所設計的,使用它能夠以快速、簡單、可擴展的方式從網站中提取所需的數據。但目前Scrapy的用途十分普遍,可用於如數據挖掘、監測和自動化測試等領域,也能夠應用在獲取API所返回的數據(例如 Amazon Associates Web Services ) 或者通用的網絡爬蟲。html

  Scrapy 是基於twisted框架開發而來,因此要使用 Scrapy 首先得安裝 twisted 。twisted 是一個流行的事件驅動的python網絡框架。所以 Scrapy 使用了一種非阻塞(又名異步)的代碼來實現併發。Scrapy 的官網地址爲:https://docs.scrapy.org/en/latest/topics/architecture.htmlpython

 

根據官網,咱們知道 Scrapy 總體架構大體由7部分組成:linux

  1. 引擎(EGINE):引擎負責控制系統全部組件之間的數據流,並在某些動做發生時觸發事件。有關詳細信息,以後會在數據流部分提到。
  2. 調度器(SCHEDULER):用來接受引擎發過來的請求, 壓入隊列中, 並在引擎再次請求的時候返回. 能夠想像成一個URL的優先級隊列, 由它來決定下一個要抓取的網址是什麼, 同時去除重複的網址。
  3. 爬蟲(SPIDERS):SPIDERS是開發人員自定義的類,用來解析responses,而且提取items,或者發送新的請求。
  4. 下載器(DOWLOADER):用於下載網頁內容, 並將網頁內容返回給EGINE,下載器是創建在twisted這個高效的異步模型上的。
  5. 項目管道(ITEM PIPLINES):在items被提取後負責處理它們,主要包括清理、驗證、持久化(好比存到數據庫)等操做。
  6. 下載器中間件(Downloader Middlewares):位於Scrapy引擎和下載器之間,主要用來處理從EGINE傳到DOWLOADER的請求request,已經從DOWNLOADER傳到EGINE的響應response,你可用該中間件作如下幾件事:
    1. 在將請求發送到下載器以前處理請求(即在Scrapy將請求發送到網站以前)。
    2. 在傳遞給蜘蛛以前改變接收到的響應;
    3. 發送新的請求,而不是將接收到的響應傳遞給蜘蛛;
    4. 向蜘蛛傳遞響應而不須要獲取網頁;
    5. 去除某些請求
  7. 爬蟲中間件(Spider Middlewares):位於EGINE和SPIDERS之間,主要工做是處理SPIDERS的輸入(即responses)和輸出(即requests)。

                                    

由上圖的總體架構能夠看出,Scrapy中的數據流由執行引擎控制,以下所示:
  1. 引擎(Engine)獲取最初的請求由爬蟲(Spider)抓取。  
  2. 引擎(Engine)在調度程序(Scheduler)中調度請求,並要求抓取下一個請求。
  3. 調度程序(Scheduler)將下一個請求返回給引擎(Engine)。
  4. 引擎(Engine)將請求經過下載器中間件( Downloader Middlewares )發送到下載器( Downloader)(詳情請參閱process_request())。
  5. 一旦頁面完成下載,下載器( Downloader)會生成一個響應(使用該頁面)並經過下載器中間件( Downloader Middlewares )將其發送到引擎(Engine)。(詳情請參閱process_response())。
  6. 引擎(Engine)從下載器( Downloader)接收到響應後經過爬蟲中間件( Spider Middlewares )將其發送給爬蟲(Spider)進行處理。(詳情請參閱process_spider_input())。
  7. 爬蟲(Spider)處理響應,並經過爬蟲中間件( Spider Middlewares )將抓取的項目和新請求(後續)返回給引擎(Engine)。(詳情請參閱process_spider_output())
  8. 引擎(Engine)將已處理的項目發送到項目管道(ITEM PIPLINES),而後將已處理的請求發送到調度程序(Scheduler),而後詢問是否有下一個請求須要進行爬網。
  9. 如有請求則重複以上步驟,直到沒有更多的調度請求。

 

 Scrapy 安裝

 windows安裝:程序員

    一、pip3 install wheel #安裝後,便支持經過wheel文件安裝軟件,wheel文件官網:https://www.lfd.uci.edu/~gohlke/pythonlibs
    3、pip3 install lxml
    4、pip3 install pyopenssl
    五、下載並安裝pywin32:https://sourceforge.net/projects/pywin32/files/pywin32/
    六、下載twisted的wheel文件:http://www.lfd.uci.edu/~gohlke/pythonlibs/#twisted
    七、執行pip3 install 下載目錄\Twisted-17.9.0-cp36-cp36m-win_amd64.whl
  #以上步驟是由於scrapy是基於twisted實現的,因此要先安裝twisted
    八、pip3 install scrapy

 linux安裝:ajax

pip3 install scrapy

  

命令行工具

  安裝完scrapy後咱們最關心的就是如何建立一個新的項目,而後展開爬蟲行動。這裏就須要用到命令行工具,首先咱們來講建立項目。shell

startproject #建立項目

  命令行分爲全局命令(Global commands)和項目命令(Project-only commands)。全局命令指在任何位置均可以調用,而項目命令只能在項目中使用。數據庫

#1 查看幫助
    scrapy -h
    scrapy <command> -h

#2 有兩種命令:其中Project-only必須切到項目文件夾下才能執行,而Global的命令則不須要
    Global commands:
        startproject #建立項目
        genspider    #建立爬蟲程序
        settings     #若是是在項目目錄下,則獲得的是該項目的配置
        runspider    #運行一個獨立的python文件,沒必要建立項目
        shell        #scrapy shell url地址  在交互式調試,如選擇器規則正確與否
        fetch        #獨立於程單純地爬取一個頁面,能夠拿到請求頭
        view         #下載完畢後直接彈出瀏覽器,以此能夠分辨出哪些數據是ajax請求
        version      #scrapy version 查看scrapy的版本,scrapy version -v查看scrapy依賴庫的版本
    Project-only commands:
        crawl        #運行爬蟲,必須建立項目才行,確保配置文件中ROBOTSTXT_OBEY = False
        check        #檢測項目中有無語法錯誤
        list         #列出項目中所包含的爬蟲名
        edit         #編輯器,通常不用
        parse        #scrapy parse url地址 --callback 回調函數  #以此能夠驗證咱們的回調函數是否正確
        bench        #scrapy bentch壓力測試
全局命令和項目命令

  剛纔咱們用到的建立項目的命令是一條全局命令,一般咱們會在指定位置建立項目,因此咱們先cd 文件路徑 切到指定位置後再執行「scrapy startproject 項目名」就能建立一個爬蟲項目。windows

建立項目示例:瀏覽器

#cd 項目所在路徑
scrapy startproject AMAZON#這裏以爬取亞馬遜舉例
#這時候會有一出現AMAZON的文件夾和一個scrapy.cfg文件,scrapy.cfg裏面寫的是項目的部署信息,爬蟲相關的配置信息在settings.py文件中

cd AMAZON#切到項目路徑下
scrapy genspider amazon www.amazon.cn#建立一隻叫amazon的蜘蛛,爬取的網頁的域名爲www.amazon.cn
#這時候在AMAZON文件夾下的spiders文件夾下就會多一個amazon.py文件

#amazon.py中:
# -*- coding: utf-8 -*-
import scrapy

#繼承了scrapy.Spider類的自定義類
class AmazonSpider(scrapy.Spider):
    name = 'amazon'#爬蟲名字,不可改
    allowed_domains = ['www.amazon.cn']#域名
    start_urls = ['http://www.amazon.cn/']#不設置url時默認爬這個網頁

    def parse(self, response):
    #解析操做
        pass

"""
  爬蟲是一項不違法但也容易違法的行爲,有些公司會不想讓你爬,因此有一個ROBOTSTXT_OBEY協議,規定了如該公司的網站不容許你爬的話會另外開一個
  專門接口放入不重要的信息用於給你爬取。在settings,py中有一條ROBOTSTXT_OBEY的配置,默認爲True就是遵循該協議,咱們處理爬取的數據的行爲
  不違法的狀況下能夠將其設置爲False,以爬取全部數據
"""

 

注意:Scrapy默認只能在CMD中執行爬蟲程序,若想在Pycharm中運行需在settings.py文件同級的目錄下新建entrypoint.py,裏面寫入網絡

#在項目目錄下新建:entrypoint.py
from scrapy.cmdline import execute
execute(['scrapy', 'crawl', 'amazon','--nolog'])#執行這條會打印默認的日誌信息
# execute(['scrapy', 'crawl', 'amazon',])#執行這條爲不打印日誌信息
#一、執行全局命令:請確保不在某個項目的目錄下,排除受該項目配置的影響
scrapy startproject MyProject

cd MyProject
scrapy genspider baidu www.baidu.com

scrapy settings --get XXX #若是切換到項目目錄下,看到的則是該項目的配置

scrapy runspider baidu.py

scrapy shell https://www.baidu.com
    response
    response.status
    response.body
    view(response)
    
scrapy view https://www.taobao.com #若是頁面顯示內容不全,不全的內容則是ajax請求實現的,以此快速定位問題

scrapy fetch --nolog --headers https://www.taobao.com

scrapy version #scrapy的版本

scrapy version -v #依賴庫的版本


#二、執行項目命令:切到項目目錄下
scrapy crawl baidu
scrapy check
scrapy list
scrapy parse http://quotes.toscrape.com/ --callback parse
scrapy bench
CMD中執行項目的命令(通常咱們都在pycharm中操做)
import sys,os
sys.stdout=io.TextIOWrapper(sys.stdout.buffer,encoding='gb18030')
關於windows編碼問題

 

項目文件的結構以及各文件的做用以下圖所示

      

 

spiders文件夾做用

  spiders文件夾的內容是由程序員自定義的多個類組成,用於爬取一個或多個網址,具體包括如何執行爬取任務而且如何從頁面中提取結構化的數據。換句話說,Spiders是你爲了一個特定的網址或一組網址自定義爬取和解析頁面行爲的地方。

  Spiders中的類封裝了發起請求的方法和回調函數的方法,回調函數能夠是多個但每個請求都必須一個綁定回調函數以處理抓取到的網頁的內容。

  默認生成的「def start_requests(self):」 只執行一次默認從start_urls列表中得到url地址來生成Request請求,默認的回調函數是parse方法。回調函數在下載完成返回response時自動觸發。

  回調函數用於解析response並返回值,返回值可使4種,一般Scrapy用自帶的Selectors解析內容,固然咱們也可使用Beutifulsoup,lxml或其餘的。返回Item對象的話會經過項目管道(Item Pipeline)組件存到數據庫或以文件的形式導出。

四種返回值:

    1. 包含解析數據的字典
    2. Item對象
    3. 新的Request對象(新的Requests也須要指定一個回調函數)
    4. 可迭代對象(包含Items或Request)                   

Spiders給咱們提供了5個類

scrapy.spiders.Spider #scrapy.Spider等同於scrapy.spiders.Spider,使咱們用的最多的類
scrapy.spiders.CrawlSpider
scrapy.spiders.XMLFeedSpider
scrapy.spiders.CSVFeedSpider
scrapy.spiders.SitemapSpider

#可鏈式操做
from scrapy.spiders import Spider,CrawlSpider,XMLFeedSpider,CSVFeedSpider,SitemapSpider
相關文章
相關標籤/搜索