• <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

    Scrapy 是用 Python 實現的一個為了爬取網站數據、提取結構性數據而編寫的應用框架。
    Scrapy架構圖(綠線是數據流向)
    在這里插入圖片描述
    Scrapy Engine(引擎): 負責Spider、ItemPipeline、Downloader、Scheduler中間的通訊,信號、數據傳遞等。

    Scheduler(調度器): 它負責接受引擎發送過來的Request請求,并按照一定的方式進行整理排列,入隊,當引擎需要時,交還給引擎。

    Downloader(下載器):負責下載Scrapy Engine(引擎)發送的所有Requests請求,并將其獲取到的Responses交還給Scrapy Engine(引擎),由引擎交給Spider來處理,

    Spider(爬蟲):它負責處理所有Responses,從中分析提取數據,獲取Item字段需要的數據,并將需要跟進的URL提交給引擎,再次進入Scheduler(調度器).

    Item Pipeline(管道):它負責處理Spider中獲取到的Item,并進行進行后期處理(詳細分析、過濾、存儲等)的地方。

    Downloader Middlewares(下載中間件):你可以當作是一個可以自定義擴展下載功能的組件。

    Spider Middlewares(Spider中間件):你可以理解為是一個可以自定擴展和操作引擎和Spider中間通信的功能組件(比如進入Spider的Responses;和從Spider出去的Requests)

    第二,scrapy爬蟲流程

    Scrapy的運作流程
    代碼寫好,程序開始運行…

    1 引擎:Hi!Spider, 你要處理哪一個網站?
    2 Spider:老大要我處理xxxx.com。
    3 引擎:你把第一個需要處理的URL給我吧。
    4 Spider:給你,第一個URL是xxxxxxx.com。
    5 引擎:Hi!調度器,我這有request請求你幫我排序入隊一下。
    6 調度器:好的,正在處理你等一下。
    7 引擎:Hi!調度器,把你處理好的request請求給我。
    8 調度器:給你,這是我處理好的request
    9 引擎:Hi!下載器,你按照老大的下載中間件的設置幫我下載一下這個request請求
    10 下載器:好的!給你,這是下載好的東西。(如果失敗:sorry,這個request下載失敗了。然后引擎告訴調度器,這個request下載失敗了,你記錄一下,我們待會兒再下載)
    11 引擎:Hi!Spider,這是下載好的東西,并且已經按照老大的下載中間件處理過了,你自己處理一***意!這兒responses默認是交給def parse()這個函數處理的)
    12 Spider:(處理完畢數據之后對于需要跟進的URL),Hi!引擎,我這里有兩個結果,這個是我需要跟進的URL,還有這個是我獲取到的Item數據。
    13 引擎:Hi !管道 我這兒有個item你幫我處理一下!調度器!這是需要跟進URL你幫我處理下。然后從第四步開始循環,直到獲取完老大需要全部信息。
    14 管道調度器:好的,現在就做!
    注意!只有當調度器中不存在任何request了,整個程序才會停止,(也就是說,對于下載失敗的URL,Scrapy也會重新下載。)

    第三,制作 Scrapy 爬蟲 步驟:

    1.新建項目 (scrapy startproject xxx):新建一個新的爬蟲項目
    2.明確目標 (編寫items.py):明確你想要抓取的目標
    3.制作爬蟲 (spiders/xxspider.py):制作爬蟲開始爬取網頁
    4.存儲內容 (pipelines.py):設計管道存儲爬取內容

    第四,安裝

    Windows 安裝方式
    升級 pip 版本:

    pip install --upgrade pip
    

    通過 pip 安裝 Scrapy 框架:

    pip install Scrapy
    

    Ubuntu 安裝方式:
    安裝非 Python 的依賴:

    sudo apt-get install python-dev python-pip libxml2-dev libxslt1-dev zlib1g-dev libffi-dev libssl-dev
    

    通過 pip 安裝 Scrapy 框架:

    sudo pip install scrapy
    

    Mac OS 安裝方式:
    對于Mac OS系統來說,由于系統本身會引用自帶的python2.x的庫,因此默認安裝的包是不能被刪除的,但是你用python2.x來安裝Scrapy會報錯,用python3.x來安裝也是報錯,我最終沒有找到直接安裝Scrapy的方法,所以我用另一種安裝方式來說一下安裝步驟,解決的方式是就是使用virtualenv來安裝。

    $ sudo pip install virtualenv
    $ virtualenv scrapyenv
    $ cd scrapyenv
    $ source bin/activate
    $ pip install Scrapy
    

    安裝后,只要在命令終端輸入 scrapy,提示類似以下結果,代表已經安裝成功。
    在這里插入圖片描述

    第五,案例

    一、在開始爬蟲必須創建一個新的Scrapy項目。進入自定義的項目目錄中,運行下列命令:

    scrapy startproject mySpider
    

    其中, mySpider 為項目名稱,可以看到將會創建一個 mySpider 文件夾,目錄結構大致如下:

    下面來簡單介紹一下各個主要文件的作用:

    mySpider/
        scrapy.cfg
        mySpider/
            __init__.py
            items.py
            pipelines.py
            settings.py
            spiders/
                __init__.py
                ...
    

    這些文件分別是:

    1.scrapy.cfg: 項目的配置文件。
    2.mySpider/: 項目的Python模塊,將會從這里引用代碼。
    3.mySpider/items.py: 項目的目標文件。
    4.mySpider/pipelines.py: 項目的管道文件。
    5.mySpider/settings.py: 項目的設置文件。
    6.mySpider/spiders/: 存儲爬蟲代碼目錄。
    二、明確目標(mySpider/items.py)
    我們打算抓取 http://www.itcast.cn/channel/teacher.shtml 網站里的所有講師的姓名、職稱和個人信息。

    打開 mySpider 目錄下的 items.py。

    Item 定義結構化數據字段,用來保存爬取到的數據,有點像 Python 中的 dict,但是提供了一些額外的保護減少錯誤。

    可以通過創建一個 scrapy.Item 類, 并且定義類型為 scrapy.Field 的類屬性來定義一個 Item(可以理解成類似于 ORM 的映射關系)。

    接下來,創建一個 ItcastItem 類,和構建 item 模型(model)。

    import scrapy
    
    class ItcastItem(scrapy.Item):
       name = scrapy.Field()
       title = scrapy.Field()
       info = scrapy.Field()
    

    三、制作爬蟲
    爬蟲分兩步,
    1,爬數據
    在當前目錄下輸入命令,將在mySpider/spider目錄下創建一個名為itcast的爬蟲,并指定爬取域的范圍:

    scrapy genspider itcast "itcast.cn"
    

    打開 mySpider/spider目錄里的 itcast.py,默認增加了下列代碼:

    import scrapy
    
    class ItcastSpider(scrapy.Spider):
        name = "itcast"
        allowed_domains = ["itcast.cn"]
        start_urls = (
            'http://www.itcast.cn/',
        )
    
        def parse(self, response):
            pass
    

    其實也可以由我們自行創建itcast.py并編寫上面的代碼,只不過使用命令可以免去編寫固定代碼的麻煩

    要建立一個Spider, 你必須用scrapy.Spider類創建一個子類,并確定了三個強制的屬性 和 一個方法。

    name = “” :這個爬蟲的識別名稱,必須是唯一的,在不同的爬蟲必須定義不同的名字。

    allow_domains = [] 是搜索的域名范圍,也就是爬蟲的約束區域,規定爬蟲只爬取這個域名下的網頁,不存在的URL會被忽略。

    start_urls = () :爬取的URL元祖/列表。爬蟲從這里開始抓取數據,所以,第一次下載的數據將會從這些urls開始。其他子URL將會從這些起始URL中繼承性生成。

    parse(self, response) :解析的方法,每個初始URL完成下載后將被調用,調用的時候傳入從每一個URL傳回的Response對象來作為唯一參數,主要作用如下:

    負責解析返回的網頁數據(response.body),提取結構化數據(生成item)
    生成需要下一頁的URL請求。
    將start_urls的值修改為需要爬取的第一個url

    start_urls = ("http://www.itcast.cn/channel/teacher.shtml",)
    

    修改parse()方法:

    def parse(self, response):
        filename = "teacher.html"
        open(filename, 'w').write(response.body)
    

    然后運行一下看看,在mySpider目錄下執行:

    scrapy crawl itcast
    

    是的,就是 itcast,看上面代碼,它是 ItcastSpider 類的 name 屬性,也就是使用 scrapy genspider命令的唯一爬蟲名。

    運行之后,如果打印的日志出現 [scrapy] INFO: Spider closed (finished),代表執行完成。 之后當前文件夾中就出現了一個 teacher.html 文件,里面就是我們剛剛要爬取的網頁的全部源代碼信息。

    注意: Python2.x默認編碼環境是ASCII,當和取回的數據編碼格式不一致時,可能會造成亂碼;我們可以指定保存內容的編碼格式,一般情況下,我們可以在代碼最上方添加

    import sys
    reload(sys)
    sys.setdefaultencoding("utf-8")
    

    這三行代碼是 Python2.x 里解決中文編碼的萬能鑰匙,經過這么多年的吐槽后 Python3 學乖了,默認編碼是Unicode了…
    2. 取數據

    爬取整個網頁完畢,接下來的就是的取過程了,首先觀察頁面源碼:

    <div class="li_txt">
        <h3>  xxx  </h3>
        <h4> xxxxx </h4>
        <p> xxxxxxxx </p>
    

    是不是一目了然?直接上 XPath 開始提取數據吧。

    xpath 方法,我們只需要輸入的 xpath 規則就可以定位到相應 html 標簽節點
    不會 xpath 語法沒關系,Chrome 給我們提供了一鍵獲取 xpath 地址的方法(右鍵->檢查->copy->copy xpath),如下圖:
    在這里插入圖片描述
    這里給出一些 XPath 表達式的例子及對應的含義:

    /html/head/title: 選擇HTML文檔中 標簽內的 元素<br/> /html/head/title/text(): 選擇上面提到的 <title> 元素的文字<br/> //td: 選擇所有的 <td> 元素<br/> //div[@class=“mine”]: 選擇所有具有 class=“mine” 屬性的 div 元素<br/> 舉例我們讀取網站 http://www.itcast.cn/ 的網站標題,修改 itcast.py 文件代碼如下:</td>

    # -*- coding: utf-8 -*-
    import scrapy
    
    # 以下三行是在 Python2.x版本中解決亂碼問題,Python3.x 版本的可以去掉
    import sys
    reload(sys)
    sys.setdefaultencoding("utf-8")
    
    class Opp2Spider(scrapy.Spider):
        name = 'itcast'
        allowed_domains = ['itcast.com']
        start_urls = ['http://www.itcast.cn/']
    
        def parse(self, response):
            # 獲取網站標題
            context = response.xpath('/html/head/title/text()')   
           
            # 提取網站標題
            title = context.extract_first()  
            print(title) 
            pass
    

    執行以下命令:

    $ scrapy crawl itcast
    ...
    ...
    傳智播客官網-好口碑IT培訓機構,一樣的教育,不一樣的品質
    ...
    ...
    

    我們之前在 mySpider/items.py 里定義了一個 ItcastItem 類。 這里引入進來:

    from mySpider.items import ItcastItem
    

    然后將我們得到的數據封裝到一個 ItcastItem 對象中,可以保存每個老師的屬性:

    from mySpider.items import ItcastItem
    
    def parse(self, response):
        #open("teacher.html","wb").write(response.body).close()
    
        # 存放老師信息的集合
        items = []
    
        for each in response.xpath("//div[@class='li_txt']"):
            # 將我們得到的數據封裝到一個 `ItcastItem` 對象
            item = ItcastItem()
            #extract()方法返回的都是unicode字符串
            name = each.xpath("h3/text()").extract()
            title = each.xpath("h4/text()").extract()
            info = each.xpath("p/text()").extract()
    
            #xpath返回的是包含一個元素的列表
            item['name'] = name[0]
            item['title'] = title[0]
            item['info'] = info[0]
    
            items.append(item)
    
        # 直接返回最后數據
        return items
    

    我們暫時先不處理管道,后面會詳細介紹。

    保存數據
    scrapy保存信息的最簡單的方法主要有四種,-o 輸出指定格式的文件,命令如下:

    scrapy crawl itcast -o teachers.json
    

    json lines格式,默認為Unicode編碼

    scrapy crawl itcast -o teachers.jsonl
    

    csv 逗號表達式,可用Excel打開

    scrapy crawl itcast -o teachers.csv
    

    xml格式

    scrapy crawl itcast -o teachers.xml
    

    思考
    如果將代碼改成下面形式,結果完全一樣。

    請思考 yield 在這里的作用(Python yield 使用淺析):

    # -*- coding: utf-8 -*-
    import scrapy
    from mySpider.items import ItcastItem
    
    # 以下三行是在 Python2.x版本中解決亂碼問題,Python3.x 版本的可以去掉
    import sys
    reload(sys)
    sys.setdefaultencoding("utf-8")
    
    class Opp2Spider(scrapy.Spider):
        name = 'itcast'
        allowed_domains = ['itcast.com']
        start_urls = ("http://www.itcast.cn/channel/teacher.shtml",)
    
        def parse(self, response):
            #open("teacher.html","wb").write(response.body).close()
    
            # 存放老師信息的集合
            items = []
    
            for each in response.xpath("//div[@class='li_txt']"):
                # 將我們得到的數據封裝到一個 `ItcastItem` 對象
                item = ItcastItem()
                #extract()方法返回的都是unicode字符串
                name = each.xpath("h3/text()").extract()
                title = each.xpath("h4/text()").extract()
                info = each.xpath("p/text()").extract()
    
                #xpath返回的是包含一個元素的列表
                item['name'] = name[0]
                item['title'] = title[0]
                item['info'] = info[0]
    
                items.append(item)
    
            # 直接返回最后數據
            return items
    

    第六,總結

    最開始下載scrapy模塊時要注意是否跟操作系統兼容,不兼容則要考慮換python版本,不過這種情況比較少,還有就是我們在安裝時會出現下載不了的情況,具體情況請移步博文主頁,里面有詳細記錄以及解決辦法,希望對大家有用!!!

    版權聲明:本文為liuxiaobao666原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。
    本文鏈接:https://blog.csdn.net/liuxiaobao666/article/details/111086650

    智能推薦

    Python爬蟲day7—Scrapy框架入門

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

    Python爬蟲學習教程:Scrapy爬蟲框架入門

    Python爬蟲學習教程:Scrapy概述 Scrapy是Python開發的一個非常流行的網絡爬蟲框架,可以用來抓取Web站點并從頁面中提取結構化的數據,被廣泛的用于數據挖掘、數據監測和自動化測試等領域。下圖展示了Scrapy的基本架構,其中包含了主要組件和系統的數據處理流程(圖中帶數字的紅色箭頭)。 組件 Scrapy引擎(Engine):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壓縮包 那我們就開始做吧 首先,查看網頁的源代碼,我們可以看到每一...

    Linux C系統編程-線程互斥鎖(四)

    互斥鎖 互斥鎖也是屬于線程之間處理同步互斥方式,有上鎖/解鎖兩種狀態。 互斥鎖函數接口 1)初始化互斥鎖 pthread_mutex_init() man 3 pthread_mutex_init (找不到的情況下首先 sudo apt-get install glibc-doc sudo apt-get install manpages-posix-dev) 動態初始化 int pthread_...

    統計學習方法 - 樸素貝葉斯

    引入問題:一機器在良好狀態生產合格產品幾率是 90%,在故障狀態生產合格產品幾率是 30%,機器良好的概率是 75%。若一日第一件產品是合格品,那么此日機器良好的概率是多少。 貝葉斯模型 生成模型與判別模型 判別模型,即要判斷這個東西到底是哪一類,也就是要求y,那就用給定的x去預測。 生成模型,是要生成一個模型,那就是誰根據什么生成了模型,誰就是類別y,根據的內容就是x 以上述例子,判斷一個生產出...

    styled-components —— React 中的 CSS 最佳實踐

    https://zhuanlan.zhihu.com/p/29344146 Styled-components 是目前 React 樣式方案中最受關注的一種,它既具備了 css-in-js 的模塊化與參數化優點,又完全使用CSS的書寫習慣,不會引起額外的學習成本。本文是 styled-components 作者之一 Max Stoiber 所寫,首先總結了前端組件化樣式中的最佳實踐原則,然后在此基...

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