鱼C论坛

 找回密码
 立即注册
查看: 952|回复: 4

关于scrapy框架的imagespipeline的应用!!求大佬帮忙看看!!

[复制链接]
发表于 2020-5-3 16:09:25 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 qingzhaobing 于 2020-5-3 16:18 编辑

我是跟着一个教程学着写的爬取起汽车之家宝马5系的图片.
items.py设置如下:
  1. import scrapy
  2. class BmwItem(scrapy.Item):
  3.     category = scrapy.Field()
  4.     image_urls = scrapy.Field()
  5.     images = scrapy.Field()
复制代码

setting.py设置如下:
  1. import os

  2. BOT_NAME = 'bmw'

  3. SPIDER_MODULES = ['bmw.spiders']
  4. NEWSPIDER_MODULE = 'bmw.spiders'

  5. ROBOTSTXT_OBEY = False

  6. DEFAULT_REQUEST_HEADERS = {
  7.    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
  8.    'Accept-Language': 'en',
  9.    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.122 Safari/537.36'

  10. }
  11. ITEM_PIPELINES = {
  12.    # 'bmw.pipelines.BmwPipeline': 300,
  13.     'scrapy.pipelines.images.ImagesPipeline': 1,
  14. }
  15. IMAGES_STORE = os.path.join(os.path.dirname(os.path.dirname(__file__)),'images')
复制代码


Spider爬虫代码如下:
  1. import scrapy
  2. from bmw.items import BmwItem

  3. class Bmw5Spider(scrapy.Spider):
  4.     name = 'bmw5'
  5.     allowed_domains = ['car.autohome.com.cn']
  6.     start_urls = ['https://car.autohome.com.cn/pic/series/65.html']

  7.     def parse(self, response):
  8.         uiboxs = response.xpath('//div[@class="uibox"]')[1:]
  9.         for uibox in uiboxs:
  10.             category = uibox.xpath('.//div[@class="uibox-title"]/a/text()').get()
  11.             urls = uibox.xpath('.//img/@src').getall()
  12.             #for url in urls:
  13.                 #url = response.urljoin(url)
  14.             # map函数:将urls中的每一项传递给表达式生成新的url,再按顺序生成新的urls列表对象.
  15.             # 注意:这里生成出来的是对象,还要用list方法转换成列表
  16.             urls = list(map(lambda url:response.urljoin(url),urls))
  17.             item = BmwItem(category=category,image_urls=urls)
  18.             yield item
  19.             
复制代码


pipelines.py设置如下:
  1. import os
  2. import urllib.request

  3. class BmwPipeline:
  4.     def __init__(self):
  5.         self.path = os.path.join(os.path.dirname(os.path.dirname(__file__)),'images')
  6.         
  7.         if not os.path.exists(self.path):
  8.             os.mkdir(self.path)
  9.                        
  10.     def process_item(self, item, spider):
  11.         category = item['category']
  12.         urls = item['image_urls']

  13.         category_path = os.path.join(self.path,category)
  14.         if not os.path.exists(category_path):
  15.             os.mkdir(category_path)
  16.             
  17.         for url in urls:
  18.             image_name = url.split('_')[-1]
  19.             urllib.request.urlretrieve(url,os.path.join(category_path,image_name))

  20.         return item
复制代码


运行 scrapy crawl bmw5后代码如下:
  1. 2020-05-03 16:03:48 [scrapy.utils.log] INFO: Scrapy 2.1.0 started (bot: bmw)
  2. 2020-05-03 16:03:48 [scrapy.utils.log] INFO: Versions: lxml 4.5.0.0, libxml2 2.9.5, cssselect 1.1.0, parsel 1.5.2, w3lib 1.21.0, Twisted 20.3.0, Python 3.8.2 (tags/v3.8.2:7b3ab59, Feb 25 2020, 22:45:29) [MSC v.1916 32 bit (Intel)], pyOpenSSL 19.1.0 (OpenSSL 1.1.1g  21 Apr 2020), cryptography 2.9.2, Platform Windows-10-10.0.16299-SP0
  3. 2020-05-03 16:03:48 [scrapy.utils.log] DEBUG: Using reactor: twisted.internet.selectreactor.SelectReactor
  4. 2020-05-03 16:03:48 [scrapy.crawler] INFO: Overridden settings:
  5. {'BOT_NAME': 'bmw',
  6. 'NEWSPIDER_MODULE': 'bmw.spiders',
  7. 'SPIDER_MODULES': ['bmw.spiders']}
  8. 2020-05-03 16:03:48 [scrapy.extensions.telnet] INFO: Telnet Password: b0c17134dd3780b7
  9. 2020-05-03 16:03:48 [scrapy.middleware] INFO: Enabled extensions:
  10. ['scrapy.extensions.corestats.CoreStats',
  11. 'scrapy.extensions.telnet.TelnetConsole',
  12. 'scrapy.extensions.logstats.LogStats']
  13. 2020-05-03 16:03:49 [scrapy.middleware] INFO: Enabled downloader middlewares:
  14. ['scrapy.downloadermiddlewares.httpauth.HttpAuthMiddleware',
  15. 'scrapy.downloadermiddlewares.downloadtimeout.DownloadTimeoutMiddleware',
  16. 'scrapy.downloadermiddlewares.defaultheaders.DefaultHeadersMiddleware',
  17. 'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware',
  18. 'scrapy.downloadermiddlewares.retry.RetryMiddleware',
  19. 'scrapy.downloadermiddlewares.redirect.MetaRefreshMiddleware',
  20. 'scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware',
  21. 'scrapy.downloadermiddlewares.redirect.RedirectMiddleware',
  22. 'scrapy.downloadermiddlewares.cookies.CookiesMiddleware',
  23. 'scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware',
  24. 'scrapy.downloadermiddlewares.stats.DownloaderStats']
  25. 2020-05-03 16:03:49 [scrapy.middleware] INFO: Enabled spider middlewares:
  26. ['scrapy.spidermiddlewares.httperror.HttpErrorMiddleware',
  27. 'scrapy.spidermiddlewares.offsite.OffsiteMiddleware',
  28. 'scrapy.spidermiddlewares.referer.RefererMiddleware',
  29. 'scrapy.spidermiddlewares.urllength.UrlLengthMiddleware',
  30. 'scrapy.spidermiddlewares.depth.DepthMiddleware']
复制代码


后来我又把pipelines.py的设置改为如下:(这里是我自己根据感觉改的,跟教程不一样)
  1. import os
  2. import urllib.request
  3. from scrapy.pipelines.images import ImagesPipelines

  4. class ImagesPipelines:
  5.     def __init__(self):
  6.         self.path = os.path.join(os.path.dirname(os.path.dirname(__file__)),'images')
  7.         
  8.         if not os.path.exists(self.path):
  9.             os.mkdir(self.path)
  10.                        
  11.     def process_item(self, item, spider):
  12.         category = item['category']
  13.         urls = item['image_urls']

  14.         category_path = os.path.join(self.path,category)
  15.         if not os.path.exists(category_path):
  16.             os.mkdir(category_path)
  17.             
  18.         for url in urls:
  19.             image_name = url.split('_')[-1]
  20.             urllib.request.urlretrieve(url,os.path.join(category_path,image_name))

  21.         return item
复制代码


运行结果还是一样,没有启用管道.

如果我没理解错的话,这里运行结果甚至连item里的参数都没传过去.

但是教程里也是这样设置的,没有重新改写ImagesPipeline类里的get_media_requests(self, item, info)和item_completed(self, results, item, info)

为什么教程里使用默认的ImagesPipeline能下载图片,我一模一样的代码就不行..

求大佬指点指点,万分感谢!!!
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-5-3 16:59:55 | 显示全部楼层
求求来大佬 看看这里 拯救一下弱小无助的萌新
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-5-3 19:00:56 | 显示全部楼层
求求来个大佬 救救急!!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-5-3 23:47:57 | 显示全部楼层
救救孩子吧...求大佬康康
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-5-4 16:50:51 | 显示全部楼层
就没有人吗...
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-6-18 17:37

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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