国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Scrapy框架之利用ImagesPipeline下載圖片

lifefriend_007 / 390人閱讀

摘要:簡(jiǎn)介用類提供一種方便的方式來(lái)下載和存儲(chǔ)圖片。如圖片下載完畢后,處理結(jié)果會(huì)以二元組的方式返回給函數(shù)。如圖片結(jié)果則圖片名稱如果想進(jìn)行更改,請(qǐng)參考使用框架的下載圖片如何保持原文件名呢

1.ImagesPipeline簡(jiǎn)介

Scrapy用ImagesPipeline類提供一種方便的方式來(lái)下載和存儲(chǔ)圖片。

特點(diǎn):

將下載圖片轉(zhuǎn)換成通用的JPG和RGB格式

避免重復(fù)下載

縮略圖生成

圖片大小過(guò)濾


2.ImagesPipeline工作流程

當(dāng)使用圖片管道 ImagePipeline,典型的工作流程如下:

在一個(gè)爬蟲里,你抓取一個(gè)項(xiàng)目,把其中圖片的URL放入image_urls組內(nèi)。

項(xiàng)目從爬蟲內(nèi)返回,進(jìn)入項(xiàng)目管道。

當(dāng)項(xiàng)目進(jìn)入ImagePipeline, image_urls組內(nèi)的URLs將被Scrapy的調(diào)度器和下載器安排下載(這意味著調(diào)度器和中間件可以復(fù)用),當(dāng)優(yōu)先級(jí)更高,會(huì)在其他頁(yè)面被抓取前處理. 項(xiàng)目會(huì)在這個(gè)特定的管道階段保持"locker"的狀態(tài),直到完成圖片的下載(或者由于某些原因未完成下載)。

當(dāng)圖片下載完, 另一個(gè)組(images)將被更新到結(jié)構(gòu)中,這個(gè)組將包含一個(gè)字典列表,其中包括下載圖片的信息,比如下載路徑,源抓取地址(從image_urls組獲得)和圖片的校驗(yàn)碼. images列表中的圖片順序?qū)⒑驮磇mage_urls組保持一致.如果某個(gè)圖片下載失敗,將會(huì)記錄下錯(cuò)誤信息,圖片也不會(huì)出現(xiàn)在images組中。


3.操作過(guò)程

項(xiàng)目目錄結(jié)構(gòu):

要想成功爬取圖片,需要經(jīng)過(guò)以下幾個(gè)步驟:

(1) 在items.py中添加image_urls、images和image_paths字段,代碼如下:
class DoubanImgsItem(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()
    image_urls = Field()
    images = Field()
    image_paths = Field()
(2)在settings.py中設(shè)置條件和屬性,代碼如下:
# Configure item pipelines
# See http://scrapy.readthedocs.org/en/latest/topics/item-pipeline.html

# ImagePipeline的自定義實(shí)現(xiàn)類
ITEM_PIPELINES = {
    "douban_imgs.pipelines.DoubanImgDownloadPipeline": 300,
}
#設(shè)置圖片下載路徑
IMAGES_STORE = "D:doubanimgs"
# 過(guò)期天數(shù)
IMAGES_EXPIRES = 90  #90天內(nèi)抓取的都不會(huì)被重抓
(3)在spiders/download_douban.py中書寫ImageSpider的代碼:
# coding=utf-8
from scrapy.spiders import Spider
import re
from scrapy import Request
from ..items import DoubanImgsItem


class download_douban(Spider):
    name = "download_douban"

    default_headers = {
        "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",
        "Accept-Encoding": "gzip, deflate, sdch, br",
        "Accept-Language": "zh-CN,zh;q=0.8,en;q=0.6",
        "Cache-Control": "max-age=0",
        "Connection": "keep-alive",
        "Host": "www.douban.com",
        "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36",
    }

    def __init__(self, url="1638835355", *args, **kwargs):
        self.allowed_domains = ["douban.com"]
        self.start_urls = [
            "http://www.douban.com/photos/album/%s/" % (url)]
        self.url = url
        # call the father base function

        # super(download_douban, self).__init__(*args, **kwargs)

    def start_requests(self):

        for url in self.start_urls:
            yield Request(url=url, headers=self.default_headers, callback=self.parse)

    def parse(self, response):
        list_imgs = response.xpath("http://div[@class="photolst clearfix"]//img/@src").extract()
        if list_imgs:
            item = DoubanImgsItem()
            item["image_urls"] = list_imgs
            yield item
(4)在pipelines.py中自定義ImagePipeline代碼:
# -*- coding: utf-8 -*-

# Define your item pipelines here
#
# Don"t forget to add your pipeline to the ITEM_PIPELINES setting
# See: http://doc.scrapy.org/en/latest/topics/item-pipeline.html
from scrapy.pipelines.images import ImagesPipeline
from scrapy.exceptions import DropItem
from scrapy import Request
from scrapy import log


class DoubanImgsPipeline(object):
    def process_item(self, item, spider):
        return item


class DoubanImgDownloadPipeline(ImagesPipeline):
    default_headers = {
        "accept": "image/webp,image/*,*/*;q=0.8",
        "accept-encoding": "gzip, deflate, sdch, br",
        "accept-language": "zh-CN,zh;q=0.8,en;q=0.6",
        "cookie": "bid=yQdC/AzTaCw",
        "referer": "https://www.douban.com/photos/photo/2370443040/",
        "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36",
    }

    def get_media_requests(self, item, info):
        for image_url in item["image_urls"]:
            self.default_headers["referer"] = image_url
            yield Request(image_url, headers=self.default_headers)

    def item_completed(self, results, item, info):
        image_paths = [x["path"] for ok, x in results if ok]
        if not image_paths:
            raise DropItem("Item contains no images")
        item["image_paths"] = image_paths
        return item

在自定義ImagePipeline代碼中,作為重要的是要重載get_media_requests(self, item, info)item_completed(self, results, item, info)這兩個(gè)函數(shù)。

get_media_requests(self,item, info):

ImagePipeline根據(jù)image_urls中指定的url進(jìn)行爬取,可以通過(guò)get_media_requests為每個(gè)url生成一個(gè)Request。如:

for image_url in item["image_urls"]:
            self.default_headers["referer"] = image_url
            yield Request(image_url, headers=self.default_headers)

item_completed(self, results, item, info):

圖片下載完畢后,處理結(jié)果會(huì)以二元組的方式返回給item_completed()函數(shù)。這個(gè)二元組定義如下:

(success, image_info_or_failure)

其中,第一個(gè)元素表示圖片是否下載成功;第二個(gè)元素是一個(gè)字典。如:

 def item_completed(self, results, item, info):
        image_paths = [x["path"] for ok, x in results if ok]
        if not image_paths:
            raise DropItem("Item contains no images")
        item["image_paths"] = image_paths
        return item

4.爬取結(jié)果

運(yùn)行結(jié)果如下:

下載成功以后,你就會(huì)在剛才設(shè)置的保存圖片的路徑里看到下載完成的圖片:IMAGES_STORE = "D:doubanimgs"


5.擴(kuò)展

默認(rèn)情況下,使用ImagePipeline組件下載圖片的時(shí)候,圖片名稱是以圖片URL的SHA1值進(jìn)行保存的。

如:
圖片URL:http://www.example.com/image.jpg
SHA1結(jié)果:3afec3b4765f8f0a07b78f98c07b83f013567a0a
則圖片名稱:3afec3b4765f8f0a07b78f98c07b83f013567a0a.jpg

如果想進(jìn)行更改,請(qǐng)參考:使用scrapy框架的ImagesPipeline下載圖片如何保持原文件名呢?


文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/44408.html

相關(guān)文章

  • 21、 Python快速開發(fā)分布式搜索引擎Scrapy精講—爬蟲數(shù)據(jù)保存

    摘要:百度云搜索,搜各種資料搜網(wǎng)盤,搜各種資料注意數(shù)據(jù)保存的操作都是在文件里操作的將數(shù)據(jù)保存為文件是一個(gè)信號(hào)檢測(cè)導(dǎo)入圖片下載器模塊定義數(shù)據(jù)處理類,必須繼承初始化時(shí)打開文件為數(shù)據(jù)處理函數(shù),接收一個(gè),里就是爬蟲最后來(lái)的數(shù)據(jù)對(duì)象文章標(biāo)題是 【百度云搜索,搜各種資料:http://www.bdyss.cn】 【搜網(wǎng)盤,搜各種資料:http://www.swpan.cn】 注意:數(shù)據(jù)保存的操作都是在p...

    Alex 評(píng)論0 收藏0
  • Python圖片爬取方法總結(jié)

    摘要:當(dāng)項(xiàng)目進(jìn)入,組內(nèi)的將被的調(diào)度器和下載器這意味著調(diào)度器和下載器的中間件可以復(fù)用安排下載,當(dāng)優(yōu)先級(jí)更高,會(huì)在其他頁(yè)面被抓取前處理。這個(gè)組將包含一個(gè)字典列表,其中包括下載文件的信息,比如下載路徑源抓取地址從組獲得和圖片的校驗(yàn)碼。 1. 最常見爬取圖片方法 對(duì)于圖片爬取,最容易想到的是通過(guò)urllib庫(kù)或者requests庫(kù)實(shí)現(xiàn)。具體兩種方法的實(shí)現(xiàn)如下: 1.1 urllib 使用urllib...

    edagarli 評(píng)論0 收藏0
  • 20、 Python快速開發(fā)分布式搜索引擎Scrapy精講—編寫spiders爬蟲文件循環(huán)抓取內(nèi)容

    摘要:百度云搜索,搜各種資料搜網(wǎng)盤,搜各種資料編寫爬蟲文件循環(huán)抓取內(nèi)容方法,將指定的地址添加到下載器下載頁(yè)面,兩個(gè)必須參數(shù),參數(shù)頁(yè)面處理函數(shù)使用時(shí)需要方法,是庫(kù)下的方法,是自動(dòng)拼接,如果第二個(gè)參數(shù)的地址是相對(duì)路徑會(huì)自動(dòng)與第一個(gè)參數(shù)拼接導(dǎo) 【百度云搜索,搜各種資料:http://bdy.lqkweb.com】 【搜網(wǎng)盤,搜各種資料:http://www.swpan.cn】 編寫spiders爬...

    CntChen 評(píng)論0 收藏0
  • Scrapy 實(shí)戰(zhàn)之爬取妹子圖

    摘要:很多人學(xué)習(xí)爬蟲的第一驅(qū)動(dòng)力就是爬取各大網(wǎng)站的妹子圖片,比如比較有名的。最后我們只需要運(yùn)行程序,即可執(zhí)行爬取,程序運(yùn)行命名如下完整代碼我已上傳到微信公眾號(hào)后臺(tái),在癡海公眾號(hào)后臺(tái)回復(fù)即可獲取。本文首發(fā)于公眾號(hào)癡海,后臺(tái)回復(fù)即可獲取最新編程資源。 showImg(https://segmentfault.com/img/remote/1460000016780800); 閱讀文本大概需要 1...

    Achilles 評(píng)論0 收藏0
  • scrapy 實(shí)戰(zhàn)練習(xí)

    摘要:爬取百思不得姐首先一步一步來(lái),我們先從爬最簡(jiǎn)單的文本開始。將百思不得姐段子保存到中別忘了將管道加到配置文件中。雖然我只是簡(jiǎn)單的爬了百思不得姐,不過(guò)這些方法可以應(yīng)用到其他方面,爬取更多更有用的數(shù)據(jù)。 前一篇文章介紹了很多關(guān)于scrapy的進(jìn)階知識(shí),不過(guò)說(shuō)歸說(shuō),只有在實(shí)際應(yīng)用中才能真正用到這些知識(shí)。所以這篇文章就來(lái)嘗試?yán)胹crapy爬取各種網(wǎng)站的數(shù)據(jù)。 爬取百思不得姐 首先一步一步來(lái),我...

    betacat 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<