这俩天研究了下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,}

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

初识scrapy,美空网图片爬取实战的更多相关文章

  1. Python爬虫入门教程 3-100 美空网数据爬取

    美空网数据----简介 从今天开始,我们尝试用2篇博客的内容量,搞定一个网站叫做"美空网"网址为:http://www.moko.cc/, 这个网站我分析了一下,我们要爬取的图片在 ...

  2. Requests 校花网图片爬取

    纪念我们闹过的矛盾,只想平淡如水 import requestsimport reurl = 'http://www.xiaohuar.com/list-1-%s.html'for i in rang ...

  3. python爬虫调用搜索引擎及图片爬取实战

    实战三-向搜索引擎提交搜索请求 关键点:利用搜索引擎提供的接口 百度的接口:wd="要搜索的内容" 360的接口:q="要搜索的内容" 所以我们只要把我们提交给 ...

  4. Scrapy教程--豆瓣电影图片爬取

    一.先上效果 二.安装Scrapy和使用 官方网址:https://scrapy.org/. 安装命令:pip install Scrapy 安装完成,使用默认模板新建一个项目,命令:scrapy s ...

  5. 爬虫实战--基于requests和beautifulsoup的妹子网图片爬取(福利哦!)

    #coding=utf-8 import requests from bs4 import BeautifulSoup import os all_url = 'http://www.mzitu.co ...

  6. Python爬虫入门教程 4-100 美空网未登录图片爬取

    美空网未登录图片----简介 上一篇写的时间有点长了,接下来继续把美空网的爬虫写完,这套教程中编写的爬虫在实际的工作中可能并不能给你增加多少有价值的技术点,因为它只是一套入门的教程,老鸟你自动绕过就可 ...

  7. scrapy之360图片爬取

    #今日目标 **scrapy之360图片爬取** 今天要爬取的是360美女图片,首先分析页面得知网页是动态加载,故需要先找到网页链接规律, 然后调用ImagesPipeline类实现图片爬取 *代码实 ...

  8. 爬虫07 /scrapy图片爬取、中间件、selenium在scrapy中的应用、CrawlSpider、分布式、增量式

    爬虫07 /scrapy图片爬取.中间件.selenium在scrapy中的应用.CrawlSpider.分布式.增量式 目录 爬虫07 /scrapy图片爬取.中间件.selenium在scrapy ...

  9. [Python_scrapy图片爬取下载]

    welcome to myblog Dome地址 爬取某个车站的图片 item.py 中 1.申明item 的fields class PhotoItem(scrapy.Item): # define ...

随机推荐

  1. 《Python基础篇》之初识Python一

    Python简介 python的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解释程序,作为ABC语言 ...

  2. Effective Java2读书笔记-创建和销毁对象(一)

    第1条:考虑用静态工厂方法代替构造器 通常情况下,我们创建一个对象采取new的形式,但是还有一种方法也是经常使用到的,它的名称叫做静态工厂方法. 例如,java中基本类型boolean的包装类Bool ...

  3. 十一、外观(Facade)模式--结构模式(Structural Pattern)

    外部与一个子系统的通信必须通过一个统一的门面(Facade)对象进行,这就是门面模式.门面模式要求一个子系统的外部与其内部的通信必须通过一个统一的门面(Facade)对象进行. 门面模式提供一个高层次 ...

  4. USB-CSW之旅

    前面总结了usb mass storage的枚举过程,如果所有枚举正常,那么会进入bulkonly协议定义的数据交流,在这个数据包里面还包含了SCSI的协议. Bulkonly协议usbmassbul ...

  5. 你真的会玩SQL吗?透视转换

    原文:你真的会玩SQL吗?透视转换 透视转换是一种行列互转的技术,在转过程中可能执行聚合操作,应用非常广泛. 本章与 你真的会玩SQL吗?数据聚合 内容比较重要,还涉及到 你真的会玩SQL吗?Case ...

  6. 关于随机数字K线极值的统计结果

    如果有组随机数字,如数字彩票.我们对号码进行平均二分后,统计期出现的结果分布,对结果分布进行K线累加,得到一条折线. 这条折线的顶点和底点的统计上服从以下规则: 令总期数为N,统计区间为M,则在N期内 ...

  7. 【转】android 电池(三):android电池系统

    关键词:android电池系统电池系统架构 uevent power_supply驱动 平台信息: 内核:linux2.6/linux3.0系统:android/android4.0 平台:S5PV3 ...

  8. iterator的简单用法

    // 给你写了个简单的例子,不知道合不合你的题意? vector<int>vertical; ; i<; i++) { vertical.push_back(i); } vector ...

  9. java实现写大量数据到文件中

    生成.txt文件 生成.csv文件 生成.xls文件 import java.io.BufferedWriter; import java.io.File; import java.io.FileOu ...

  10. 华为Java笔试题

    华为Java笔试题+数据库题 一. 单项选择题 1.Java是从( )语言改进重新设计. A.Ada B.C++ C.Pasacal D.BASIC 2.下列语句哪一个正确( ) A. Java程序经 ...