第三篇:爬蟲框架 - Scrapy

穆晨發表於2017-05-20

 前言

       Python提供了一個比較實用的爬蟲框架 - Scrapy。在這個框架下只要定製好指定的幾個模組,就能實現一個爬蟲。

       本文將講解Scrapy框架的基本體系結構,以及使用這個框架定製爬蟲的具體步驟。

Scrapy體系結構

       

       其具體執行流程如下:

       1. 工作管理員Scheduler將初始下載任務遞交給下載器Downloader;
       2. 下載器Downloader將下載好了的頁面傳遞給爬取分析器Spiders進行分析。

       爬取分析器分析的結果分為兩種:

       a) 本次爬取所得資料 -> 它將傳遞給工作管理員Scheduler;
       b) 需要進行下一級爬取的URL地址 -> 它將傳遞給資料管道進行相關的儲存工作。

基於Scrapy框架的豆瓣網電影資訊爬取器

       1. 執行以下命令建立一個新的工程:

1 scrapy startproject doubanMovieSpider

doubanMovieSpider是工程名,工程包裡將會有如下這些檔案:

1) scrapy.cfg: 專案配置檔案
2) items.py: 需要提取的資料結構定義檔案
3) pipelines.py:管道定義,用來對items裡面提取的資料做進一步處理,如儲存等
4) settings.py: 爬蟲配置檔案
5) spiders: 放置spider的目錄

該工程用於從豆瓣網爬取電影資訊(如電影名,評分等等)。

       2. 定義爬取結果資料結構Item --- 在items.py中編寫如下程式碼:

 1 # -*- coding: utf-8 -*-
 2 # ================================================
 3 #  作者: 方萌
 4 #  建立時間: 20**/**/**
 5 #  版本號: 1.0
 6 #  聯絡方式: 1505033833@qq.com
 7 # ================================================
 8 # scrapy框架模組
 9 import scrapy
10 class DoubanmoviespiderItem(scrapy.Item):
11     # 主題
12     title = scrapy.Field()
13     # 評分
14     rate = scrapy.Field()
15     # ID
16     id = scrapy.Field()

       Item其實從本質來說,就是Scrapy框架自己實現的字典,需要繼承scrapy.Item類。上述程式碼定義的字典表示要爬取的電影資訊有:電影主題,電影評分,以及電影ID。

       3. 實現爬取分析器Spider --- 在spiders目錄下增加一個python檔案MovieSpider.py:

       

       在這個檔案中自定義一個爬取分析器,該分析器為一個繼承自scrapy.spider.BaseSpider(或者Scrapy框架下其他抽象爬取器)的類,它起碼要實現以下幾個欄位:

1) name:spider的標識
2) start_urls:起始爬取URL
3) parse():爬取物件解析函式

實現程式碼如下:

 1 # -*- coding: utf-8 -*-
 2 # ================================================
 3 #  作者: 方萌
 4 #  建立時間: 20**/**/**
 5 #  版本號: 1.0
 6 #  聯絡方式: 1505033833@qq.com
 7 # ================================================
 8 # scrapy框架模組
 9 import scrapy
10 # json解析模組
11 import json
12 # 系統模組
13 import sys
14 # items模組
15 import doubanMovieSpider.items
16 # 爬蟲類
17 class MovieSpider(scrapy.spider.BaseSpider):
18     # 爬蟲名
19     name = "douban"
20     # 域名限定
21     allowed_domains = ["www.douban.com"]
22     # 爬取URL佇列
23     start_urls = [
24         "http://movie.douban.com/j/serch_subjects?type=movie&tag=%E7%83%AD%E9%97%A8&sort=recommend&page_limit=200&page_start=0"
25     ]
26     def parse(self, response):
27         """
28             函式功能:
29                 解析爬取到的資料
30             輸入:
31                 response -> 爬取返回資料物件
32             輸出:
33 34         """
35         # 將爬取到的電影資訊存入json容器
36         json_container = json.loads(response.body)
37         # 構建items。該模組具體含義請查詢相關文件。
38         items = []
39         for movie_elem in json_container['subjects']:
40             item = doubanMovieSpider.items.DoubanmoviespiderItem()
41             for key in movie_elem:
42                 if key == 'title':
43                     item['title'] = movie_elem[key]
44                     print movie_elem[key]
45                 if key == 'rate':
46                     item['rate'] = movie_elem[key]
47                 if key == 'id':
48                     item['id'] = movie_elem[key]
49                     items.append(item)
50         # 返回items
51         return items

       4. 實現PipeLine --- 修改items.py檔案:

 1 # -*- coding: utf-8 -*-
 2 # Define your item pipelines here
 3 #
 4 # Don't forget to add your pipeline to the ITEM_PIPELINES setting
 5 # See: http://doc.scrapy.org/en/latest/topics/item-pipeline.html
 6 class DoubanmoviespiderPipeline(object):
 7     def __init__(self):
 8         pass
 9     def process_item(self, item, spider):
10         pass

       PipeLine用來對Spider返回的Item列表進行儲存操作,可以寫入到檔案、或者資料庫等。

       我們可以在其中的__init__方法內編寫開啟檔案部分程式碼,在process_item方法內編寫具體的寫入函式(可直接將資料寫入進遠端資料庫);也可以不實現這個模組,scrapy會有其預設的寫入機制(本系統採用預設寫入機制)

       5. 在專案當前目錄下執行如下命令即可啟動此爬蟲系統:

1 scrapy crawl douban -o items.json -t json

       該命令表示啟動爬取分析器“douban”,並將爬取到的items以json格式儲存到items.json檔案中。“douban” 即是在爬取分析器中由name域指定的。

       下圖為爬取到的結果:

       

小結

       本文僅僅給出Scrapy框架的基本使用。如果要實現生產級別的專案,還需對該框架內的一些具體設定,各種抽象爬取分析器進行深入研究。

相關文章