• <noscript id="e0iig"><kbd id="e0iig"></kbd></noscript>
  • <td id="e0iig"></td>
  • <option id="e0iig"></option>
  • <noscript id="e0iig"><source id="e0iig"></source></noscript>
  • Scrapy爬蟲框架入門

    Scrapy爬蟲框架入門

    1.Scrapy概述

    Scrapy是Python開發的一個非常流行的網絡爬蟲框架,可以用來抓取Web站點并從頁面中提取結構化的數據,被廣泛的用于數據挖掘、數據監測和自動化測試等領域。下圖展示了Scrapy的基本架構,其中包含了主要組件和系統的數據處理流程(圖中帶數字的紅色箭頭)。

    2.組件

    1. Scrapy引擎(Engine):Scrapy引擎是用來控制整個系統的數據處理流程。
    2. 調度器(Scheduler):調度器從Scrapy引擎接受請求并排序列入隊列,并在Scrapy引擎發出請求后返還給它們。
    3. 下載器(Downloader):下載器的主要職責是抓取網頁并將網頁內容返還給蜘蛛(Spiders)。
    4. 蜘蛛(Spiders):蜘蛛是有Scrapy用戶自定義的用來解析網頁并抓取特定URL返回的內容的類,每個蜘蛛都能處理一個域名或一組域名,簡單的說就是用來定義特定網站的抓取和解析規則。
    5. 條目管道(Item Pipeline):條目管道的主要責任是負責處理有蜘蛛從網頁中抽取的數據條目,它的主要任務是清理、驗證和存儲數據。當頁面被蜘蛛解析后,將被發送到條目管道,并經過幾個特定的次序處理數據。每個條目管道組件都是一個Python類,它們獲取了數據條目并執行對數據條目進行處理的方法,同時還需要確定是否需要在條目管道中繼續執行下一步或是直接丟棄掉不處理。條目管道通常執行的任務有:清理HTML數據、驗證解析到的數據(檢查條目是否包含必要的字段)、檢查是不是重復數據(如果重復就丟棄)、將解析到的數據存儲到數據庫(關系型數據庫或NoSQL數據庫)中。
    6. 中間件(Middlewares):中間件是介于Scrapy引擎和其他組件之間的一個鉤子框架,主要是為了提供自定義的代碼來拓展Scrapy的功能,包括下載器中間件和蜘蛛中間件。

    3.數據處理流程

    Scrapy的整個數據處理流程由Scrapy引擎進行控制,通常的運轉流程包括以下的步驟:

    1. 引擎詢問蜘蛛需要處理哪個網站,并讓蜘蛛將第一個需要處理的URL交給它。
    2. 引擎讓調度器將需要處理的URL放在隊列中。
    3. 引擎從調度那獲取接下來進行爬取的頁面。
    4. 調度將下一個爬取的URL返回給引擎,引擎將它通過下載中間件發送到下載器。
    5. 當網頁被下載器下載完成以后,響應內容通過下載中間件被發送到引擎;如果下載失敗了,引擎會通知調度器記錄這個URL,待會再重新下載。
    6. 引擎收到下載器的響應并將它通過蜘蛛中間件發送到蜘蛛進行處理。
    7. 蜘蛛處理響應并返回爬取到的數據條目,此外還要將需要跟進的新的URL發送給引擎。
    8. 引擎將抓取到的數據條目送入條目管道,把新的URL發送給調度器放入隊列中。

    上述操作中的2-8步會一直重復直到調度器中沒有需要請求的URL,爬蟲停止工作。

    4.安裝和使用Scrapy

    pip install scrapy -i https://pypi.douban.com/simple
    
    1. 創建scrapy項目:

       		  終端輸入   scrapy startproject  項目名稱
       	   `scrapy startproject douban`
      
    2. 創建爬蟲文件:

       	(1)跳轉到spiders文件夾   cd 目錄名字/目錄名字/spiders
       	(2)scrapy genspider 爬蟲名字 網頁的域名
      
       		 `cd douban/douban/spiders`
      
       		 `scrapy genspider movie movie.douban.com`
      

    scrapy genspider 創建的爬蟲名字不能你 startproject 的項目重名

    項目組成

    ?  scrapydemo: tree             
    .
    └── douban
        ├── douban
        │   ├── __init__.py
        │	├── 自定義的爬蟲文件.py       ---> 由我們自己創建,是實現爬蟲核心功能的文件
        │   ├── items.py			---> 定義數據結構的地方,是一個繼承自scrapy.Item的類
        │   ├── middlewares.py		---> 中間件   代理
        │   ├── pipelines.py		---> 管道文件,里面只有一個類,用于處理下載數據的后續處理
        │   ├── __pycache__
        │   ├── settings.py			 ---> 配置文件  比如:是否遵守robots協議,User-Agent定義等
        │   └── spiders
        │       ├── __init__.py
        │       └── __pycache__
        └── scrapy.cfg
    

    說明:Windows系統的命令行提示符下有tree命令,但是Linux和MacOS的終端是沒有tree命令的,可以用下面給出的命令來定義tree命令,其實是對find命令進行了定制并別名為tree。

    alias tree="find . -print | sed -e 's;[^/]*/;|____;g;s;____|; |;g'"

    Linux系統也可以通過yum或其他的包管理工具來安裝tree。

    yum install tree

    爬蟲文件的基本組成:
      		繼承scrapy.Spider類
                    name = 'movie'    --->   運行爬蟲文件時使用的名字
                    allowed_domains   --->  爬蟲允許的域名,在爬取的時候,如果不是此域名之下的url,會被過濾掉
                    start_urls	--->  聲明了爬蟲的起始地址,可以寫多個url,一般是一個
                    parse(self, response) ---> 解析數據的回調函數
                           response.text
                           response.body ---> 響應的是二進制文件
                           response.xpath()-> xpath方法的返回值類型是selector列表
                           extract()             ---> 提取的是selector對象的是data
                           extract_first()       ---> 提取的是selector列表中的第一個數據
    

    5.開始爬蟲

    1. 在items.py文件中定義字段,這些字段用來保存數據,方便后續的操作。

    # -*- coding: utf-8 -*-
    
    # Define here the models for your scraped items
    #
    # See documentation in:
    # https://doc.scrapy.org/en/latest/topics/items.html
    
    import scrapy
    
    
    class DoubanItem(scrapy.Item):
    
        name = scrapy.Field()
        year = scrapy.Field()
        score = scrapy.Field()
        director = scrapy.Field()
        classification = scrapy.Field()
        actor = scrapy.Field()
    

    2. 在spiders文件夾中編寫自己的爬蟲。

    (venv) $ scrapy genspider movie movie.douban.com
    
    # -*- coding: utf-8 -*-
    import scrapy
    from scrapy.selector import Selector
    from scrapy.linkextractors import LinkExtractor
    from scrapy.spiders import CrawlSpider, Rule
    
    from douban.items import DoubanItem
    
    
    class MovieSpider(CrawlSpider):
        name = 'movie'
        allowed_domains = ['movie.douban.com']
        start_urls = ['https://movie.douban.com/top250']
        rules = (
            Rule(LinkExtractor(allow=(r'https://movie.douban.com/top250\?start=\d+.*'))),
            Rule(LinkExtractor(allow=(r'https://movie.douban.com/subject/\d+')), callback='parse_item'),
        )
    
        def parse_item(self, response):
            sel = Selector(response)
            item = DoubanItem()
            item['name']=sel.xpath('//*[@id="content"]/h1/span[1]/text()').extract()
            item['year']=sel.xpath('//*[@id="content"]/h1/span[2]/text()').re(r'\((\d+)\)')
            item['score']=sel.xpath('//*[@id="interest_sectl"]/div/p[1]/strong/text()').extract()
            item['director']=sel.xpath('//*[@id="info"]/span[1]/a/text()').extract()
            item['classification']= sel.xpath('//span[@property="v:genre"]/text()').extract()
            item['actor']= sel.xpath('//*[@id="info"]/span[3]/a[1]/text()').extract()
            return item
    

    說明:上面我們通過Scrapy提供的爬蟲模板創建了Spider,其中的rules中的LinkExtractor對象會自動完成對新的鏈接的解析,該對象中有一個名為extract_link的回調方法。Scrapy支持用XPath語法和CSS選擇器進行數據解析,對應的方法分別是xpath和css,上面我們使用了XPath語法對頁面進行解析

    3. 運行爬蟲

    venv)$ scrapy crawl movie
    

    可以在控制臺看到爬取到的數據,如果想將這些數據保存到文件中,可以通過-o參數來指定文件名,Scrapy支持我們將爬取到的數據導出成JSON、CSV、XML、pickle、marshal等格式。

    (venv)$ scrapy crawl moive -o result.json

    4. 在pipelines.py中完成對數據進行持久化的操作。

    # -*- coding: utf-8 -*-
    
    # Define your item pipelines here
    #
    # Don't forget to add your pipeline to the ITEM_PIPELINES setting
    # See: https://doc.scrapy.org/en/latest/topics/item-pipeline.html
    import pymongo
    
    from scrapy.exceptions import DropItem
    from scrapy.conf import settings
    from scrapy import log
    
    
    class DoubanPipeline(object):
    
        def __init__(self):
            connection = pymongo.MongoClient(settings['MONGODB_SERVER'], settings['MONGODB_PORT'])
            db = connection[settings['MONGODB_DB']]
            self.collection = db[settings['MONGODB_COLLECTION']]
    
        def process_item(self, item, spider):
            #Remove invalid data
            valid = True
            for data in item:
              if not data:
                valid = False
                raise DropItem("Missing %s of blogpost from %s" %(data, item['url']))
            if valid:
            #Insert data into database
                new_moive=[{
                    "name":item['name'][0],
                    "year":item['year'][0],
                    "score":item['score'],
                    "director":item['director'],
                    "classification":item['classification'],
                    "actor":item['actor']
                }]
                self.collection.insert(new_moive)
                log.msg("Item wrote to MongoDB database %s/%s" %
                (settings['MONGODB_DB'], settings['MONGODB_COLLECTION']),
                level=log.DEBUG, spider=spider) 
            return item
    

    利用Pipeline我們可以完成以下操作:

    • 清理HTML數據,驗證爬取的數據。
    • 丟棄重復的不必要的內容。
    • 將爬取的結果進行持久化操作。

    5. 修改settings.py文件對項目進行配置

    .......
    USER_AGENT = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_3) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.54 Safari/536.5'
    
    MONGODB_SERVER = 'xxx.xxx.xxx.xxx'
    MONGODB_PORT = 27017
    MONGODB_DB = 'douban'
    MONGODB_COLLECTION = 'movie'
    
    ITEM_PIPELINES = {
        'douban.pipelines.DoubanPipeline': 400,  # 優先級 數字越低優先級越高
    }
    
    ROBOTSTXT_OBEY = True    # 遵不遵守root協議
    
    版權聲明:本文為fair_fair原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。
    本文鏈接:https://blog.csdn.net/fair_fair/article/details/105213789

    智能推薦

    Scrapy爬蟲框架入門(上) - 慕課網爬蟲

    更多文章請關注公眾號「我偶像龜叔」 Scrapy 是一個為了爬取網站數據,提取結構性數據而編寫的應用框架。可以應用在包括數據挖掘,信息處理或存儲歷史數據等一系列的程序中。 五大組件: 引擎(Scrapy Engine):負責Spider、ItemPipeline、Downloader、Scheduler中間的通訊,信號、數據傳遞等。 調度器(Scheduler):調度器從引擎接受request并將...

    Python爬蟲day7—Scrapy框架入門

    Scrapy爬蟲框架入門 概述 Scrapy是Python開發的一個非常流行的網絡爬蟲框架,可以用來抓取Web站點并從頁面中提取結構化的數據,被廣泛的用于數據挖掘、數據監測和自動化測試等領域。下圖展示了Scrapy的基本架構,其中包含了主要組件和系統的數據處理流程(圖中帶數字的紅色箭頭)。 組件 Scrapy引擎(Engine):Scrapy引擎是用來控制整個系統的數據處理流程。 調度器(Sche...

    Python3爬蟲之Scrapy框架入門

    Python3爬蟲之Scrapy框架 Scrapy架構圖 Scrapy Engine(引擎): 負責Spider、ItemPipeline、Downloader、Scheduler中間的通訊,信號、數據傳遞等。 Scheduler(調度器): 它負責接受引擎發送過來的Request請求,并按照一定的方式進行整理排列,入隊,當引擎需要時,交還給引擎。 Downloader(下載器):負責下載Scra...

    Python 爬蟲:Scrapy 框架入門初探【 Xpath 改寫】

    目錄 安裝 Scrapy 初試 Scrapy 第1步:創建項目 第2步:編寫代碼 第3步:運行爬蟲 第4步:保存數據 結果展示 Scrapy 是一種用于抓取網站和提取結構化數據的應用程序框架,可用于廣泛的有用應用程序,如數據挖掘、信息處理或歷史存檔等。 安裝 Scrapy 從 PyPI 安裝: 使用 Anaconda 或 Miniconda 安裝: 安裝后可在命令行查看是否成功: 初試 Scrap...

    Scrapy爬蟲框架入門(中) - Item Pipeline

    更多文章請關注公眾號「我偶像龜叔」 當Item在Spider中被收集之后,它將會被傳遞到Item Pipeline,此時這里可以看作框架模型(model)。 item pipeline常見實現示例: 將爬取結果保存到 數據庫 中 下載項目圖片(item返回包含圖片字段) 數據清理、查重、驗證 … 本次案例會延伸上一篇文章,閱讀之前可以回顧上一篇文章。 Scrapy爬蟲框架入門(上) ...

    猜你喜歡

    HTML中常用操作關于:頁面跳轉,空格

    1.頁面跳轉 2.空格的代替符...

    freemarker + ItextRender 根據模板生成PDF文件

    1. 制作模板 2. 獲取模板,并將所獲取的數據加載生成html文件 2. 生成PDF文件 其中由兩個地方需要注意,都是關于獲取文件路徑的問題,由于項目部署的時候是打包成jar包形式,所以在開發過程中時直接安照傳統的獲取方法沒有一點文件,但是當打包后部署,總是出錯。于是參考網上文章,先將文件讀出來到項目的臨時目錄下,然后再按正常方式加載該臨時文件; 還有一個問題至今沒有解決,就是關于生成PDF文件...

    電腦空間不夠了?教你一個小秒招快速清理 Docker 占用的磁盤空間!

    Docker 很占用空間,每當我們運行容器、拉取鏡像、部署應用、構建自己的鏡像時,我們的磁盤空間會被大量占用。 如果你也被這個問題所困擾,咱們就一起看一下 Docker 是如何使用磁盤空間的,以及如何回收。 docker 占用的空間可以通過下面的命令查看: TYPE 列出了docker 使用磁盤的 4 種類型: Images:所有鏡像占用的空間,包括拉取下來的鏡像,和本地構建的。 Con...

    requests實現全自動PPT模板

    http://www.1ppt.com/moban/ 可以免費的下載PPT模板,當然如果要人工一個個下,還是挺麻煩的,我們可以利用requests輕松下載 訪問這個主頁,我們可以看到下面的樣式 點每一個PPT模板的圖片,我們可以進入到詳細的信息頁面,翻到下面,我們可以看到對應的下載地址 點擊這個下載的按鈕,我們便可以下載對應的PPT壓縮包 那我們就開始做吧 首先,查看網頁的源代碼,我們可以看到每一...

    精品国产乱码久久久久久蜜桃不卡