1. 程式人生 > >python | 爬蟲筆記 - (八)Scrapy入門教程

python | 爬蟲筆記 - (八)Scrapy入門教程

RoCE yield ini 配置 自己 數據存儲 2.3 rom 提取數據

一、簡介

Scrapy是一個基於Twisted 的異步處理框架,是針對爬蟲過程中的網站數據爬取、結構性數據提取而編寫的應用框架。 可以應用在包括數據挖掘,信息處理或存儲歷史數據等一系列的程序中。

1.1 安裝

pip3 install Scrapy

1.2 框架介紹

組成: Engine 引擎,處理整個系統的數據流處理、觸發事務 Item 項目,定義爬取結果的數據結構 Scheduler 調度器 Downloader 下載器 Spider 定義爬取邏輯和網頁解析規則 Item Pipeline 項目管道,清洗、驗證和存儲數據 Downloader Middlewares 下載器中間件 Spider Middlewares 蜘蛛中間件

二、上手項目

內容:爬取 http://quotes.toscrape.com 流程框架:抓取第一頁-獲取內容和下一頁連接-翻頁爬取-保存爬取結果

2.1 創建項目

通過命令行來創建項目
scrapy startproject tutorial
創建目錄如下

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

技術分享圖片

2.2 編寫一個Spider

Spider是用戶編寫用於從單個網站(或者一些網站)爬取數據的類。其包含了一個用於下載的初始URL,如何跟進網頁中的鏈接以及如何分析頁面中的內容, 提取生成 item 的方法。 為了創建一個Spider,必須繼承 scrapy.Spider 類, 且定義以下三個屬性: · name · start_urls · parse: 被調用時,每個初始URL完成下載後生成的 Response 對象將會作為唯一的參數傳遞給該函數。 該方法負責解析返回的數據(response data),提取數據(生成item)以及生成需要進一步處理的URL的 Request 對象。
scrapy genspider quotes quotes.toscrape.com

2.3 創建Item

Item 是保存爬取到的數據的容器;其使用方法和python字典類似, 並且提供了額外保護機制來避免拼寫錯誤導致的未定義字段錯誤。 在item中定義相應的字段。編輯 tutorial 目錄中的 items.py 文件
import scrapy

class QuoteItem(scrapy.Item):
    title = scrapy.Field()
    link = scrapy.Field()
    desc = scrapy.Field()

2.4 解析Response

parse()方法的參數 resposne 是 start_urls 裏面的鏈接爬取後的結果 。 所以在 parse()方法中,我們可以直接對 response 變量包含的內容進行解析,比如瀏覽請求結果的網頁源代碼,或者進一步分析源代碼內容,或者找出結果中的鏈接而得到下一個請求 。 分析網頁結構 進入項目的根目錄,執行下列命令啟動spider:
scrapy crawl quotes

2.5 使用item

Item可以理解為一個字典,不過在聲明的時候需要實例化。 然後依次用剛才解析的結果賦值 Item的每一個字段, 最後將 Item返回即可。
quotes = response.css(.quote)   #選擇quote的區塊
        for quote in quotes:
            item = QuoteItem()
            item[text] = quote.css(.text::text).extract_first()
            item[author] = quote.css(.author::text).extract_first()
            item[tags] = quote.css(.tags .tag::text).extract()
    yield item
首頁的所有內容被解析出來 ,並被賦值成了一個個 QuoteItem。
scrapy shell quotes.toscrape.com #可以在命令行交互

2.6 後續Request-多頁抓取

找到next按鈕,查看源代碼,可以根據鏈接構建下一個請求。 通過遞歸調用,回調函數調用自己,實現翻頁循環
next = response.css(.pager .next a::attr(href)).extract_first()
        url = response.urljoin(next)
        yield scrapy.Request(url=url, callback=self.parse) 

2.7 保存到文件

scrapy crawl quotes -o quotes.json #也可以保存成csv,xml等不同文件格式

2.8 使用Item Pipeline

通過item Pipeline可以實現更復雜的操作,比如將數據保存到MongoDB,或者篩選某些有用的item Pipeline功能主要包括: - 清理 HTML數據。 - 驗證爬取數據,檢查爬取字段 - 查重井丟棄重復內容。 - 將爬取結果保存到數據庫。 定義一個類並實現process_item()方法 兩個參數item和spider實例
from scrapy.exceptions import DropItem

class TextPipeline(object):
    def __init__(self):
        self.limit = 50

    def process_item(self, item, spider):
        if item[text]:
            if len(item[text]) > self.limit:
                item[text] = item[text][0:self.limit].rstrip() + ...  #設置長度50截斷字符串
            return item
        else:
            return DropItem(Missing Text)
處理後的item即可存入MongoDB,其中涉及另外幾個方法 - from_crawler 類方法@class,通過crawler可以拿到全局配置的信息,在setting.py中。比如在其中設置MongoDB的名稱和地址,然後通過這個方法獲取 - openspider - closespider 通過process_item方法執行數據插入操作 執行後可在數據庫中查看對應表格 本節對應代碼請見: 參考:https://scrapy-chs.readthedocs.io/zh_CN/latest/intro/tutorial.html

##本系列內容為《python3爬蟲開發實戰》學習筆記。本系列博客列表如下:

(零)學習路線

(一)開發環境配置

(二)爬蟲基礎

(三)基本庫使用

(四)解析庫使用

(五)數據存儲

(六)Ajax數據爬取

(七)動態渲染頁面爬取Selenium

持續更新...

python | 爬蟲筆記 - (八)Scrapy入門教程