這倆天研究了下scrapy爬蟲框架,遂准備寫個爬蟲練練手。平時做的較多的事情是瀏覽圖片,對,沒錯,就是那種藝術照,我驕傲的認為,多看美照一定能提高審美,並且成為一個優雅的程序員。O(∩_∩)O~ 開個玩笑,那么廢話不多說,切入正題吧,寫一個圖片爬蟲。
設計思路:爬取目標為美空網模特照片,利用CrawlSpider提取每張照片的url地址,並將提取的圖片url寫入一個靜態html文本作為存儲,打開即可查看圖片。 我的環境是win8.1, python2.7+Scrapy 0.24.4,如何配環境我就不說了,大家自行百度一下。
參照官方文檔,我總結了建立爬蟲程序大致有四個步驟:
- 創建一個scrapy project
- 定義需要從網頁中提取的元素item
- 實現一個spider類,通過接口完成爬取url和提取item的功能
- 實現一個item pipeline類,完成Item的存儲功能。
接下來就很簡單了,參照着步驟一步步做就好,首先在終端里面建立一個項目,項目名咱就命名為moko吧。輸入指令scrapy startproject moko, scrapy會在當前目錄創建一個moko的文件目錄,里面有一些初使的文件,文件用處大伙感興趣查下文檔,我主要介紹我們這次用到的文件。
定義Item 在items.py里面定義我們要抓取的數據:
# -*- coding: utf-8 -*- # Define here the models for your scraped items # # See documentation in: # http://doc.scrapy.org/en/latest/topics/items.html import scrapy class MokoItem(scrapy.Item): # define the fields for your item here like: # name = scrapy.Field() url = scrapy.Field()
- 這里的url用來存儲最后結果的dict號,稍后會繼續解釋,名字是隨意命名的。比如說我還需要爬圖片作者的名字,那么我們就可以添加一項name = scrapy.Field(),依次類推。
- 接下來我們進入spiders文件夾,里面建立一個python文件,名字咱這里就取mokospider.py,添加核心代碼實現Spider:
-
Spider是一個繼承自scrapy.contrib.spiders.CrawlSpider的Python類,有三個必需的定義的成員
name: 名字,這個spider的標識,必須是唯一的,不同的爬蟲定義不同的名字
start_urls:一個url列表,spider從這些網頁開始抓取
parse():解析的方法,調用的時候傳入從每一個URL傳回的Response對象作為唯一參數,負責解析並匹配抓取的數據(解析為item),跟蹤更多的URL。
# -*- coding: utf-8 -*- #File name :spyders/mokospider.py #Author:Jhonny Zhang #mail:veinyy@163.com #create Time : 2014-11-29 ############################################################################# from scrapy.contrib.spiders import CrawlSpider,Rule from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor from moko.items import MokoItem import re from scrapy.http import Request from scrapy.selector import Selector class MokoSpider(CrawlSpider): name = "moko" allowed_domains = ["moko.cc"] start_urls=["http://www.moko.cc/post/aaronsky/list.html"] rules = (Rule(SgmlLinkExtractor(allow=('/post/\d*\.html')), callback = 'parse_img', follow=True),) def parse_img(self, response): urlItem = MokoItem() sel = Selector(response) for divs in sel.xpath('//div[@class="pic dBd"]'): img_url=divs.xpath('.//img/@src2').extract()[0] urlItem['url'] = img_url yield urlItem
咱們的項目命名為moko, 爬蟲允許的領域allowed_domains限制在moko.cc,也就是爬蟲的約束區域,規定爬蟲只爬取這個域名下的網頁。爬蟲起始地址從
http://www.moko.cc/post/aaronsky/list.html開始。然后設置爬取規則Rule,這是CrawlSpider區別於基礎爬蟲的地方,打個比方說,咱們從A網頁上開始爬,A網頁上面有很多超鏈接url,咱爬蟲就根據設定的規則,接着去爬符合規則的超鏈接url,如此反復下去。callback回調函數,遇到網頁調用這個回調函數處理,我之所以沒用parse這個默認名字,因為官方文檔里說爬蟲框架里可能會調用parse,造成沖突。
目標
http://www.moko.cc/post/aaronsky/list.html網頁上有很多圖片的鏈接 ,每個圖片的鏈接都有規律可循,比如說隨意點一個打開就是http://www.moko.cc/post/1052776.html,這里的http://www.moko.cc/post/都是一樣的,每個鏈接不同的部分也就是后面數字部分。於是這里我們利用正則表達式,填寫規則rules = (Rule(SgmlLinkExtractor(allow=('/post/\d*\.html')), callback = 'parse_img', follow=True),) 指當前網頁,所有符合/post/\d*\.html后綴的網頁都進行爬取,調用parse_img處理。
接下來定義解析函數parse_img,這地方比較關鍵,他傳入的參數是爬蟲打開url后返回的response對象,response對象里面內容說白了就是很大一些字符串,咱們就是利用爬蟲將我們需要的內容過濾出來。如何過濾呢???哈哈,有個牛逼的Selector方法,利用他的xpath()路徑表達公式來解析內容,解析前需要具體分析下web頁面,我們這里利用的工具就是firebug。截取的web核心代碼就是
我們需要的是src2部分!他在<div class="pic dBd">標簽下的<img>里面, 首先實例一個在Items.py里面定義的MokoItem()的對象urlItem,用牛逼的Selector傳入response,我這里用了一個循環,每次處理一個url,利用xpath路徑表達式解析取出url,至於xpath如何用,自行百度下。結果存儲到urlItem里面,這里用到了我們Items.py里面定義的url了!
然后定義一下pipelines,這部分管我們的內容存儲。
from moko.items import MokoItem class MokoPipeline(object): def __init__(self): self.mfile = open('test.html', 'w') def process_item(self, item, spider): text = '<img src="' + item['url'] + '" alt = "" />' self.mfile.writelines(text) def close_spider(self, spider): self.mfile.close()
建立一個test.html文件用來存儲結果。注意我的process_item里用到了一些html規則,作用是直接在html里面顯示圖片。結尾在定義一個關閉文件的方法,在爬蟲結束時候調用。
最后定義設置一下settings.py
BOT_NAME = 'moko' SPIDER_MODULES = ['moko.spiders'] NEWSPIDER_MODULE = 'moko.spiders' # Crawl responsibly by identifying yourself (and your website) on the user-agent #USER_AGENT = 'moko (+http://www.yourdomain.com)' ITEM_PIPELINES={'moko.pipelines.MokoPipeline': 1,}
最后展示一下效果圖吧,祝各位玩的快樂 ^_^
