初識scrapy,美空網圖片爬取實戰


      這倆天研究了下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,}     

 


 
      最后展示一下效果圖吧,祝各位玩的快樂 ^_^
               


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM