My_JIE 发表于 2019-2-21 17:04:43

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
#############################################################################################################################
###PILpip 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 )]
#            yield scrapy.Request(image_url)      |   #我们在这里自己定义了item字典中的urls如何传给图片管道
#
#    def item_completed(self, results, item, info):                |源码 def item_completed(self, results, item, info):
#      image_paths = for ok, x in results if ok]      |      if self.IMAGES_RESULT_FIELD in item.fields:
#      if not image_paths:                                       |            item =
#            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'.*我们再次运行scrapy crawl moive可以看到下载,但是我们这里由于在settings.py里设置了图片的规则,所以全部被过滤掉了。还有些报错,可以发现报错的scrapy会直接丢弃,不会造成阻塞。我们到/tmp/pic目录下回发现一个full的目录,图片就存在这里了,这个路径是在settings.py里面设置的好了,一个简单的爬虫就完成了,下次我就给大家带来迭代爬取整个站点的爬虫这里指是一个简单的实例,分享给大家。我也正在学习scrapy,如果有不对的地方希望大家指正一下。


)
      item['images'] = sel.xpath('//img/@src').re(r'[^/]*.我们再次运行scrapy crawl moive可以看到下载,但是我们这里由于在settings.py里设置了图片的规则,所以全部被过滤掉了。还有些报错,可以发现报错的scrapy会直接丢弃,不会造成阻塞。我们到/tmp/pic目录下回发现一个full的目录,图片就存在这里了,这个路径是在settings.py里面设置的好了,一个简单的爬虫就完成了,下次我就给大家带来迭代爬取整个站点的爬虫这里指是一个简单的实例,分享给大家。我也正在学习scrapy,如果有不对的地方希望大家指正一下。


)
#      ]   我们上面启用了下载管道,这句话就不科学了 果断注释掉
      return item我们再次运行scrapy crawl moive可以看到下载,但是我们这里由于在settings.py里设置了图片的规则,所以全部被过滤掉了。还有些报错,可以发现报错的scrapy会直接丢弃,不会造成阻塞。我们到/tmp/pic目录下回发现一个full的目录,图片就存在这里了,这个路径是在settings.py里面设置的好了,一个简单的爬虫就完成了,下次我就给大家带来迭代爬取整个站点的爬虫这里指是一个简单的实例,分享给大家。我也正在学习scrapy,如果有不对的地方希望大家指正一下。


Miss_love 发表于 2020-12-31 09:51:42

支持分享
页: [1]
查看完整版本: scrapy-3 利用框架,抓取图片