51Testing软件测试论坛

标题: scrapy-3 利用框架,抓取图片 [打印本页]

作者: My_JIE    时间: 2019-2-21 17:04
标题: scrapy-3 利用框架,抓取图片

先到项目的目录下

  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,如果有不对的地方希望大家指正一下。



作者: Miss_love    时间: 2020-12-31 09:51
支持分享




欢迎光临 51Testing软件测试论坛 (http://bbs.51testing.com/) Powered by Discuz! X3.2