51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 1489|回复: 2
打印 上一主题 下一主题

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

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2019-2-21 17:04:43 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

先到项目的目录下

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

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

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

  9. from scrapy.item import Item, Field

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


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

  17. class BogePipeline(object):
  18.     def process_item(self, item, spider):
  19.         return item

  20. 下面这部分重写的操作如果不熟悉源码就不要写进来了
复制代码

下面这部分重写的操作如果不熟悉源码就不要写进来了

  1. ###############################################################################################################################################
  2. #import scrapy
  3. #from scrapy.contrib.pipeline.images import ImagesPipeline
  4. #from scrapy.exceptions import DropItem
  5. #
  6. #class MyImagesPipeline(ImagesPipeline):                                    重写ImagesPipeline,我们需要在这里重写下载的函数才能下载
  7. #
  8. #    def get_media_requests(self, item, info):    |     源码  def get_media_requests(self, item, info):
  9. #        for image_url in item['image_urls']:     |              return [Request(x) for x in item.get(self.IMAGES_URLS_FIELD, [])]
  10. #            yield scrapy.Request(image_url)      |     #我们在这里自己定义了item字典中的urls如何传给图片管道
  11. #
  12. #    def item_completed(self, results, item, info):                |源码 def item_completed(self, results, item, info):
  13. #        image_paths = [x['path'] for ok, x in results if ok]      |        if self.IMAGES_RESULT_FIELD in item.fields:
  14. #        if not image_paths:                                       |            item[self.IMAGES_RESULT_FIELD] = [x for ok, x in results if ok]
  15. #            raise DropItem("Item contains no images")             |        return item
  16. #        item['image_paths'] = image_paths                         |
  17. #        return item                                               |
  18. ###############################################################################################################################################
复制代码
  1. root@Scrapy:~/Scrapy/boge/boge# cat settings.py
  2. #开启图片管道以及定义图片的配置
  3. BOT_NAME = 'boge'

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

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

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

  15. /root/Scrapy/boge/boge/spiders


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

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

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

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

  1. root@Scrapy:~/Scrapy/boge/boge/spiders# scrapy crawl moive
复制代码

这里输出太多了,就不打印出来了

如果你想保存这些链接
  1. root@Scrapy:~/Scrapy/boge/boge/spiders# scrapy crawl moive -o urls.txt -t json
复制代码
以json的格式保存urls下载图片
  1. root@Scrapy:~/Scrapy/boge/boge/spiders# cat pa.py
  2. #!/usr/bin/python
  3. # -*- coding:utf-8 -*-
  4. from scrapy import spider
  5. from scrapy.selector import Selector
  6. from boge.items import BogeItem
  7. import os

  8. class boge(spider.Spider):
  9.     name = "moive"
  10.     allowed_domains = ["blu-raydisc.tv"]
  11.     start_urls = [
  12.         "http://blu-raydisc.tv/",
  13.     ]

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


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


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


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏
回复

使用道具 举报

本版积分规则

关闭

站长推荐上一条 /1 下一条

小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

GMT+8, 2024-11-18 14:32 , Processed in 0.071107 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2024 Comsenz Inc.

快速回复 返回顶部 返回列表