一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

Scrapy用ImagePipeline爬取網(wǎng)頁圖片...

 天使之翼 ` 2020-11-22

  https://blog.csdn.net/Wilson_Iceman/article/details/79200796之前的那個(gè)系列文章只是講到了如何使用Scrapy來爬取文本數(shù)據(jù),今天我們來介紹如何用Scrapy來爬取圖片數(shù)據(jù)。

Scrapy爬取圖片數(shù)據(jù)需要用到ImagePipeline這個(gè)類,此類提供一種方便的方式來下載和存儲圖片,待會大家看例子的時(shí)候就可以看到爬取圖片要比爬取文本簡單的多,這當(dāng)然要?dú)w功于ImagePipeline這個(gè)類。

這個(gè)類的主要特征如下:

  • 將下載圖片轉(zhuǎn)換成通用的JPG和RGB文件格式
  • 避免重復(fù)下載
  • 可以生成縮略圖
  • 圖片大小可以實(shí)現(xiàn)自動過濾
下面我們來看一下ImagePipeline的工作流程
  • 爬取一個(gè)item,將圖片的urls存入image_urls字段
  • 從Spider返回的item,傳遞到Item Pipeline,
當(dāng)Item傳遞到ImagePipeline后,將調(diào)用Scrapy調(diào)度器和下載器完成image_urls中的URL的調(diào)度和下載。ImagePipeline會自動高優(yōu)先級抓取這些url,與此同時(shí),item會被鎖定直到圖片抓取完畢才解鎖。
  • 這些圖片下載完成后,圖片下載路徑、url和校驗(yàn)等信息會被填充到images字段中。
好了,讓我們趕緊開始吧。
啟動一個(gè)項(xiàng)目,項(xiàng)目名稱為douban_img
scrapy startproject douban_img
首先我們來看items.py
  1. # -*- coding: utf-8 -*-
  2. # Define here the models for your scraped items
  3. #
  4. # See documentation in:
  5. # https://doc./en/latest/topics/items.html
  6. import scrapy
  7. class DoubanImgItem(scrapy.Item):
  8. # define the fields for your item here like:
  9. # name = scrapy.Field()
  10. image_urls = scrapy.Field()
  11. image_paths = scrapy.Field()
爬取圖片一定需要image_urls這個(gè)字段,否則無法完成圖片的抓取。
接下看最主要的spider文件,新建一個(gè)文件download_douban.py。
  1. from scrapy.spider import Spider
  2. import re
  3. from scrapy import Request
  4. from douban_img.items import DoubanImgItem
  5. class download_douban(Spider):
  6. name = 'download-douban'
  7. default_headers = {
  8. 'Accept' : 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',
  9. 'Accept' : 'gzip, deflate, sdch, br',
  10. 'Accept-Language': 'zh-CN,zh;q=0.8,en;q=0.6',
  11. 'Cache-Control' : 'max-age=0',
  12. 'Connection' : 'keep-alive',
  13. 'Host' : 'www.douban.com',
  14. 'User-Agent' : 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36'
  15. }
  16. def __init__(self, url='1656889999', *args, **kwargs):
  17. self.allowed_domains = ['douban.com']
  18. self.start_urls = ['https://www.douban.com/photos/album/%s/' % (url)]
  19. # self.url = url
  20. def start_requests(self):
  21. for url in self.start_urls:
  22. yield Request(url = url, headers = self.default_headers, callback = self.parse)
  23. def parse(self, response):
  24. list_imgs = response.xpath('//div[@class="photolst clearfix"]//img/@src').extract()#注意這里不能再使用extract()[0]
  25. # print (list_imgs)
  26. if list_imgs:
  27. item = DoubanImgItem()
  28. item['image_urls'] = list_imgs
  29. yield item
這里一開始還是引包,看過我之前scrapy系列文章的朋友這里應(yīng)該很熟悉了。接下來定義一個(gè)類download_douban,在里面定義我們的爬蟲名稱,以及開始爬蟲的urls。這里建立了一個(gè)default_headers,由于我們只是爬取幾張圖片,因此簡單偽裝一下即可,并不需要登錄。在parse解析函數(shù)中,最主要的就是把得到圖片的urls傳入item的image_urls字段。這里需要提醒一下大家,ImagePipeline要求['image_urls']字段必須是一個(gè)列表,就算只有一個(gè)url,也必須是一個(gè)列表,因此這里使用extract()而不是extract().[0],我在這里卡了好長時(shí)間。
接下來看pipelines.py文件
  1. # -*- coding: utf-8 -*-
  2. # Define your item pipelines here
  3. #
  4. # Don't forget to add your pipeline to the ITEM_PIPELINES setting
  5. # See: https://doc./en/latest/topics/item-pipeline.html
  6. from scrapy.pipelines.images import ImagesPipeline
  7. from scrapy.exceptions import DropItem
  8. from scrapy import Request
  9. from scrapy import log
  10. class DoubanImgPipeline(object):
  11. def process_item(self, item, spider):
  12. return item
  13. class DoubanDownImgloadPipeline(ImagesPipeline):
  14. """docstring for DoubanDownloadPipeline"""
  15. default_headers = {
  16. 'accept' : 'image/webp,image/*,*/*;q=0.8',
  17. 'accept-encoding' : 'gzip, deflate, sdch, br',
  18. 'accept-language' : 'zh-CN,zh;q=0.8,en;q=0.6',
  19. 'cookie' : 'bid=yQdC/AzTaCw',
  20. 'referer' : 'https://www.douban.com/photos/photo/2370443040/',
  21. 'User-Agent' : 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36'
  22. }
  23. def get_media_requests(self, item, info):
  24. for image_url in item['image_urls']:
  25. self.default_headers['referer'] = image_url
  26. yield Request(image_url, headers = self.default_headers)
  27. def item_completed(self, results, item, info):
  28. image_paths = [x['path'] for ok, x in results if ok]
  29. if not image_paths:
  30. raise DropItem("Item contains no images")
  31. item['image_paths'] = image_paths
  32. return item
在這個(gè)py文件中,我們定義了DoubanDownImgloadPipeline這個(gè)類,這個(gè)類繼承于ImagesPipeline。在這里定義了兩個(gè)函數(shù),一個(gè)是根據(jù)傳入的urls來發(fā)起請求,請求完成后直接調(diào)用item_completed函數(shù)來處理得到的圖片。get_media_requests函數(shù)中,發(fā)起請求的時(shí)候,不需要指定回調(diào)函數(shù),ImagePipeline會自動調(diào)用item_completed函數(shù)來處理。
最后我們看一個(gè)settings.py文件,對該項(xiàng)目進(jìn)行一些配置。
首先還是配置一個(gè)User-agent
USER_AGENT = 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36'
使用我們自己定義的pipeline
  1. ITEM_PIPELINES = {
  2. 'douban_img.pipelines.DoubanDownImgloadPipeline': 300,
  3. }
設(shè)置圖片存放的目錄以及有效期
  1. IMAGES_STORE = 'D:\\doubanimgs'
  2. IMAGES_EXPIRES = 90
配置結(jié)束后保存,返回到命令行運(yùn)行一下
scrapy crawl download-douban
下面是運(yùn)行結(jié)果截圖

這個(gè)程序比較簡單,我們只是抓取了某個(gè)相冊中第一頁的圖片,有興趣的朋友可以試試把該相冊中的所有圖片都抓取下來,可以用到上一篇文章提到的結(jié)構(gòu),當(dāng)然這種情況就需要登錄豆瓣了。
好了,以上就是今天的全部內(nèi)容。
與您共勉!
 
 
 












    本站是提供個(gè)人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多

    欧美精品中文字幕亚洲| 女人精品内射国产99| 丝袜破了有美女肉体免费观看| 久热久热精品视频在线观看| 国产欧美日韩在线一区二区| 五月综合激情婷婷丁香| 女人高潮被爽到呻吟在线观看 | 欧美日韩国产自拍亚洲| 亚洲第一视频少妇人妻系列| 亚洲综合色在线视频香蕉视频| 精品熟女少妇一区二区三区| 伊人欧美一区二区三区| 国产高清在线不卡一区| 亚洲视频一区自拍偷拍另类| 人妻偷人精品一区二区三区不卡| 久久99这里只精品热在线| 欧美日韩综合综合久久久| 高清一区二区三区大伊香蕉| 亚洲专区一区中文字幕| 国产精品香蕉免费手机视频| 欧美日韩亚洲巨色人妻| 精品国产一区二区欧美| 日韩日韩日韩日韩在线| 亚洲国产日韩欧美三级| 99久久精品视频一区二区| 九九热国产这里只有精品| 国产自拍欧美日韩在线观看| 福利新区一区二区人口| 高清在线精品一区二区| 欧美日韩综合在线第一页| 永久福利盒子日韩日韩| 中文字幕区自拍偷拍区| 免费特黄一级一区二区三区| 国产毛片不卡视频在线| 国产精品视频久久一区| 午夜福利精品视频视频| 五月激情五月天综合网| 亚洲中文字幕在线视频频道| 激情内射亚洲一区二区三区| 好吊妞视频只有这里有精品| av中文字幕一区二区三区在线|