scrapy-3 利用框架,抓取图片

先到项目的目录下

/root/Scrapy/boge/boge
首先安装图片库的支持  Ubuntu apt-get install libjpeg-dev libfreetype6-dev zlib1g-dev 
                   centos yum install libjpeg-devel freetype-devel zlib-devel
#############################################################################################################################
###PIL  pip install PIL --allow-external PIL --allow-unverified PIL 不得不吐槽下这个库 真是难用,各种报错,我们就不用这个库了。。。。#
#############################################################################################################################

安装Pillow  ==========>   pip install Pillow  这个靠谱,建议用这个

root@Scrapy:~/Scrapy/boge/boge#cat items.py

from scrapy.item import Item, Field

class BogeItem(Item):
    # define the fields for your item here like:
    # name = Field()
    image_urls = Field()                             我们定义的菜单,类似字典的形式
    images = Field()


root@Scrapy:~/Scrapy/boge/boge# cat pipelines.py
#定义项目管道

class BogePipeline(object):
    def process_item(self, item, spider):
        return item

下面这部分重写的操作如果不熟悉源码就不要写进来了
###############################################################################################################################################
#import scrapy
#from scrapy.contrib.pipeline.images import ImagesPipeline
#from scrapy.exceptions import DropItem
#
#class MyImagesPipeline(ImagesPipeline):                                    重写ImagesPipeline,我们需要在这里重写下载的函数才能下载
#
#    def get_media_requests(self, item, info):    |     源码  def get_media_requests(self, item, info):
#        for image_url in item['image_urls']:     |              return [Request(x) for x in item.get(self.IMAGES_URLS_FIELD, [])]
#            yield scrapy.Request(image_url)      |     #我们在这里自己定义了item字典中的urls如何传给图片管道
#
#    def item_completed(self, results, item, info):                |源码 def item_completed(self, results, item, info):
#        image_paths = [x['path'] for ok, x in results if ok]      |        if self.IMAGES_RESULT_FIELD in item.fields:
#        if not image_paths:                                       |            item[self.IMAGES_RESULT_FIELD] = [x for ok, x in results if ok]
#            raise DropItem("Item contains no images")             |        return item
#        item['image_paths'] = image_paths                         |
#        return item                                               |
###############################################################################################################################################


root@Scrapy:~/Scrapy/boge/boge# cat settings.py
#开启图片管道以及定义图片的配置
BOT_NAME = 'boge'

SPIDER_MODULES = ['boge.spiders']
NEWSPIDER_MODULE = 'boge.spiders'

# Crawl responsibly by identifying yourself (and your website) on the user-agent
#USER_AGENT = 'boge (+http://www.yourdomain.com)'

ITEM_PIPELINES = {'scrapy.contrib.pipeline.images.ImagesPipeline': 1}
                                                                          #1,2表示优先级,启用图片管道,我查看了下源码ImagesPipeline是继承了
                                                                           FilesPipeline,所以这里不需要启用FilesPipeline
IMAGES_STORE = '/tmp/pic'
IMAGES_EXPIRES = 15
#IMAGES_MIN_HEIGHT = 110
#IMAGES_MIN_WIDTH = 110

/root/Scrapy/boge/boge/spiders


root@Scrapy:~/Scrapy/boge/boge/spiders# cat pa.py
#!/usr/bin/python
# -*- coding:utf-8 -*-
from scrapy import spider
from scrapy.selector import Selector                  #导入提取器
from boge.items import BogeItem                       #这里是导入了我们的item.py 里我们自己定义的类

class boge(spider.Spider):                            #重写Spider
    name = "moive"                                    #唯一的爬虫名字
    allowed_domains = ["blu-raydisc.tv"]              #允许的域,防止无限爬
    start_urls = [                                    #开始的urls
        "http://blu-raydisc.tv/",
    ]

    def parse(self, response):                        #处理模块
        sel = Selector(response)                      #实例化Selector,参数为reponse
        item = BogeItem()                             #实例化我们自己定义item,可以理解为实例化字典
        item['image_urls'] = sel.xpath('//img/@src').extract()             #提取图片,前面一章已经讲解了xapth
        return item                                   

好了,这里我们结构已经搭建好了。来运行一下如何

root@Scrapy:~/Scrapy/boge/boge/spiders# scrapy crawl moive
这里输出太多了,就不打印出来了

如果你想保存这些链接

root@Scrapy:~/Scrapy/boge/boge/spiders# scrapy crawl moive -o urls.txt -t json

以json的格式保存urls

下载图片

root@Scrapy:~/Scrapy/boge/boge/spiders# cat pa.py
#!/usr/bin/python
# -*- coding:utf-8 -*-
from scrapy import spider
from scrapy.selector import Selector
from boge.items import BogeItem
import os

class boge(spider.Spider):
    name = "moive"
    allowed_domains = ["blu-raydisc.tv"]
    start_urls = [
        "http://blu-raydisc.tv/",
    ]

    def parse(self, response):
        sel = Selector(response)
        item = BogeItem()
        item['image_urls'] = sel.xpath('//img/@src').extract()
#        item['image_urls'] = sel.xpath('//img/@src').re(r'.*[jpg|gif|png]$')
        item['images'] = sel.xpath('//img/@src').re(r'[^/]*.[jpg|png|gif]$')
#        [os.system('wget %s' %i) for i in item['image_urls']]   我们上面启用了下载管道,这句话就不科学了 果断注释掉
        return item

我们再次运行scrapy crawl moive
可以看到下载,但是我们这里由于在settings.py里设置了图片的规则,所以全部被过滤掉了。还有些报错,可以发现报错的scrapy会直接丢弃,不会造成阻塞。

我们到/tmp/pic目录下回发现一个full的目录,图片就存在这里了,这个路径是在settings.py里面设置的

好了,一个简单的爬虫就完成了,下次我就给大家带来  迭代爬取整个站点的爬虫

这里指是一个简单的实例,分享给大家。我也正在学习scrapy,如果有不对的地方希望大家指正一下。

 




















你可能感兴趣的:(scrapy-3 利用框架,抓取图片)