前言
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框架的基本使用。如果要實現生產級別的專案,還需對該框架內的一些具體設定,各種抽象爬取分析器進行深入研究。