Scrapy網絡爬蟲:2. 一個簡單的Scrapy爬蟲項目(步驟、源碼)

Scrapy網絡爬蟲:2. 一個簡單的Scrapy爬蟲項目(步驟、源碼)

Scrapy網絡爬蟲

本文主要目的是構建一個簡單的Scrapy爬蟲項目,從quotes.toscrape.com這個專門供爬蟲練習的網站上爬取名人名言,並存儲為json文件。從而瞭解Scrapy爬蟲項目的主要構建過程。

構建一個簡單的Scrapy爬蟲項目主要有以下幾個步驟:

1. 新建項目(Project):新建一個Scrapy項目。

2. 數據封裝(Items):確定要爬取哪些數據。

3. 爬蟲開發(Spider):開發爬取網頁的爬蟲。

4. 數據存儲(Pipeline):設計管道存儲爬取內容。

1. 新建項目(Project)

命令行切換至目標目錄(存儲代碼),執行下面命令:

scrapy startproject tutorial

其中tutorial為目錄名稱。可以看到,在當前目錄下創建了一個tutorial目錄幷包含以下文件:

tutorial/

|--- scrapy.cfg# 項目配置文件

|--- tutorial/# 項目Python模塊,在此目錄引入代碼

|---__init__.py

|---items.py# items定義文件

|---middlewares.py # 中間件定義文件

|---pipelines.py # 管道定義文件

|---settings.py # 項目參數文件

|--- spiders/ # spider存儲目錄

|---__init__.py

2. 數據封裝(Items)

在Scrapy中,items是保存抓取內容的容器,用法與Python中的字典類似,不同之處在於item中的鍵值是預先定義好的,用scrapy.item.Field對象來定義。接下來,我們開始來構建item模型(model)。我們想要的內容有:

名言(quote)

作者(author)

標籤(tags)

修改tutorial目錄下的items.py文件,在items.py文件中添加我們自己的class,命名為QuoteItem,並繼承自scrapy.item。

class QuoteItem(scrapy.Item):

text = scrapy.Field()

author = scrapy.Field()

tags = scrapy.Field()

3. 爬蟲開發(Spider)

Spider是用戶自己編寫的類,用來從一個域(或域組)中抓取信息。它定義了用於下載的URL列表、跟蹤鏈接的方案、解析網頁內容的方式。Spider類繼承scrapy.spider.BaseSpider,常用的屬性主要有三個:

name:爬蟲名稱,同一個Scrapy項目可以有多個爬蟲,每個爬蟲必須有一個唯一的名字。

start_urls:起始URL列表。爬蟲從這裡開始抓取數據。後繼URL將會從這些起始URL下載的頁面中構建出來。

parse():網頁解析的方法,調用的時候傳入從每一個URL傳回的Response對象作為唯一參數,負責解析並匹配抓取的數據(解析為item),跟蹤更多的URL。

下面是爬蟲類的代碼:命名為QuoteSpider.py,保存在tutorial\spiders目錄下

class QuoteSpider(Spider):

# 每個爬蟲的唯一名字

name = "quotes"

# 起始URL列表

start_urls = [

'http://quotes.toscrape.com/page/1/',

]

# 頁面解析,後續URL生成

def parse(self, response):

for quote in response.css('div.quote'):

# 解析HTML頁面,並將數據保存至item中

yield {

'text': quote.css('span.text::text').extract_first(),

'author': quote.css('span small::text').extract_first(),

'tags': quote.css('div.tags a.tag::text').extract(),

}

# 提取下一頁連接,並生成後續Request對象

next_page = response.css('li.next a::attr(href)').extract_first()

if next_page is not None:

yield response.follow(next_page, callback=self.parse)

4.存儲內容(Pipeline)

保存信息的最簡單的方法是通過Feed exports,主要有四種:JSON,JSON lines,CSV,XML。運行爬蟲時-o指定輸出文件,-t指定輸出文件類型。

scrapy crawl quotes -o items.json -t json

執行結果:

{'downloader/request_bytes': 2873,

'downloader/request_count': 11, # 請求了多少個頁面

'downloader/request_method_count/GET': 11, # GET請求數

'downloader/response_bytes': 24812,

'downloader/response_count': 11, # 響應數

'downloader/response_status_count/200': 10, # 成功響應數

'downloader/response_status_count/404': 1, # 失敗響應數

'finish_reason': 'finished', # 爬蟲終止原因

'finish_time': datetime.datetime(2018, 1, 3, 5, 29, 21, 336000),

'item_scraped_count': 100, # 生成的item數量

'log_count/DEBUG': 112,

'log_count/INFO': 8,

'request_depth_max': 9, # 爬取深度,一共有十個頁面,從第一個請求開始經歷了9次next。

'response_received_count': 11,# 收到的響應數

'scheduler/dequeued': 10,

'scheduler/dequeued/memory': 10,

'scheduler/enqueued': 10,

'scheduler/enqueued/memory': 10,

'start_time': datetime.datetime(2018, 1, 3, 5, 29, 16, 373000)}


分享到:


相關文章: