python | 爬蟲筆記 - (八)Scrapy入門教程
阿新 • • 發佈:2018-09-30
RoCE yield ini 配置 自己 數據存儲 2.3 rom 提取數據
內容:爬取 http://quotes.toscrape.com
流程框架:抓取第一頁-獲取內容和下一頁連接-翻頁爬取-保存爬取結果
一、簡介
Scrapy是一個基於Twisted 的異步處理框架,是針對爬蟲過程中的網站數據爬取、結構性數據提取而編寫的應用框架。 可以應用在包括數據挖掘,信息處理或存儲歷史數據等一系列的程序中。1.1 安裝
pip3 install Scrapy
1.2 框架介紹
組成: Engine 引擎,處理整個系統的數據流處理、觸發事務 Item 項目,定義爬取結果的數據結構 Scheduler 調度器 Downloader 下載器 Spider 定義爬取邏輯和網頁解析規則 Item Pipeline 項目管道,清洗、驗證和存儲數據 Downloader Middlewares 下載器中間件 Spider Middlewares 蜘蛛中間件二、上手項目
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入門教程