久久精品国产亚洲高清|精品日韩中文乱码在线|亚洲va中文字幕无码久|伊人久久综合狼伊人久久|亚洲不卡av不卡一区二区|精品久久久久久久蜜臀AV|国产精品19久久久久久不卡|国产男女猛烈视频在线观看麻豆

    1. <style id="76ofp"></style>

      <style id="76ofp"></style>
      <rt id="76ofp"></rt>
      <form id="76ofp"><optgroup id="76ofp"></optgroup></form>
      1. 千鋒教育-做有情懷、有良心、有品質(zhì)的職業(yè)教育機(jī)構(gòu)

        手機(jī)站
        千鋒教育

        千鋒學(xué)習(xí)站 | 隨時(shí)隨地免費(fèi)學(xué)

        千鋒教育

        掃一掃進(jìn)入千鋒手機(jī)站

        領(lǐng)取全套視頻
        千鋒教育

        關(guān)注千鋒學(xué)習(xí)站小程序
        隨時(shí)隨地免費(fèi)學(xué)習(xí)課程

        當(dāng)前位置:首頁  >  技術(shù)干貨  > 20天學(xué)會爬蟲之Scrapy管道piplines

        20天學(xué)會爬蟲之Scrapy管道piplines

        來源:千鋒教育
        發(fā)布人:qyf
        時(shí)間: 2022-09-20 16:22:13 1663662133

          Item Pipline介紹

          對于Item pipline我們前面已經(jīng)簡單的使用過了,更加詳細(xì)的使用本文給大家一一道來。

          在我們開始學(xué)習(xí)Item Pipline之前,我們還是來看一下下面這張圖。

        Picture

          大家可以看到上圖最左側(cè)的就是Item Pipline。Item管道的主要任務(wù)就是負(fù)責(zé)處理有Spider從網(wǎng)頁中抽取的Item,因此Item Pipline的主要任務(wù)就是清洗、驗(yàn)證和存儲數(shù)據(jù)。 當(dāng)頁面被Spider解析后,將被發(fā)送到Item管道,Item Pipline獲取了Items中的數(shù)據(jù)并執(zhí)行對應(yīng)的方法,并決定是否需要在Item管道中繼續(xù)執(zhí)行下一步或是直接丟棄掉不處理。

          因此對于Item Pipline其主要的作用包括如下:

          • 清理HTML數(shù)據(jù)。

          • 驗(yàn)證爬取數(shù)據(jù),檢查爬取字段。

          • 查重并丟棄重復(fù)內(nèi)容。

          • 將爬取結(jié)果保存到數(shù)據(jù)庫。

          核心方法介紹

          Item管道主要有4個(gè)方法,分別是:

          (1)open_spider(spider)

          (2)close_spider(spider)

          (3)from_crawler(cls,crawler)

          (4)process_item(item,spider)

          open_spider(spider)【參數(shù)spider 即被開啟的Spider對象】

          是在開啟spider的時(shí)候觸發(fā)的,常用于初始化操作(常見的有:開啟數(shù)據(jù)庫連接,打開文件等)。該方法非必需實(shí)現(xiàn),可以根據(jù)需求定義。

          close_spider(spider) 【參數(shù)spider 即被關(guān)閉的Spider對象】

          是在 Spider 關(guān)閉的時(shí)候自動調(diào)用的,在這里我們可以做一些收尾工作,如關(guān)閉數(shù)據(jù)庫連接等,該方法非必需實(shí)現(xiàn),可以根據(jù)需求定義。

          from_crawler(cls,crawler)【參數(shù)一:Class類 參數(shù)二:crawler對象】

          該方法Spider啟用時(shí)調(diào)用,比open_spider()方法調(diào)用還要早,是一個(gè)類方法,用@classmethod標(biāo)識,是一種依賴注入的方式。它的參數(shù)有crawler,通過crawler對象,我們可以拿到Scrapy的所有核心組件,如全局配置的每個(gè)信息,然后創(chuàng)建一個(gè)Pipeline實(shí)例。參數(shù)cls就是Class,最后返回一個(gè)Class實(shí)例。

          process_item(item,spider) 【參數(shù)一:被處理的Item對象 參數(shù)二:生成該Item的Spider對象】

          該方法是必須要實(shí)現(xiàn)的方法,被定義的 Item Pipeline 會默認(rèn)調(diào)用這個(gè)方法對 Item 進(jìn)行處理。比如,我們可以進(jìn)行數(shù)據(jù)處理或者將數(shù)據(jù)寫入到數(shù)據(jù)庫等操作。它必須返回 Item 類型的值或者拋出一個(gè) DropItem 異常。

          • 如果返回的是 Item 對象,那么此 Item 會接著被低優(yōu)先級的 Item Pipeline 的 process_item () 方法進(jìn)行處理,直到所有的方法被調(diào)用完畢。

          • 如果拋出的是 DropItem 異常,那么此 Item 就會被丟棄,不再進(jìn)行處理。

          延伸擴(kuò)展:ImagesPipline

          爬蟲程序爬取的目標(biāo)通常不僅僅是文字資源,經(jīng)常也會爬取圖片資源。這就涉及如何高效下載圖片的問題。這里高效下載指的是既能把圖片完整下載到本地又不會對網(wǎng)站服務(wù)器造成壓力。此時(shí)你可以不在 pipeline 中自己實(shí)現(xiàn)下載圖片邏輯,可以通過 Scrapy 提供的圖片管道ImagesPipeline,這樣可以更加高效的操作下載圖片。

          ImagesPipeline 具有以下特點(diǎn):

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

          • 避免重新下載最近已經(jīng)下載過的圖片

          • 縮略圖生成

          • 檢測圖像的寬/高,確保它們滿足最小限制

          使用說明:

          在pipline.py中可以新定義一個(gè)類,比如:xxImagePipline,Scrapy 默認(rèn)生成的類是繼承Object, 要將該類修改為繼承ImagesPipeline。然后實(shí)現(xiàn)get_media_requests和item_completed這兩個(gè)函數(shù)

          其中,get_media_requests函數(shù)為每個(gè) url 生成一個(gè) Request。而item_completed(self, results, item, info)當(dāng)一個(gè)單獨(dú)項(xiàng)目中的所有圖片請求完成時(shí),該方法會被調(diào)用。

          處理結(jié)果會以二元組的方式返回給 item_completed() 函數(shù),即參數(shù):results。

          results參數(shù)二元組結(jié)果是:(success, imageinfoorfailure)

          其中success表示圖片是否下載成功;imageinfoorfailure是一個(gè)字典,包含三個(gè)屬性:

          url - 圖片下載的url。這是從 getmediarequests() 方法返回請求的url。

          path - 圖片存儲的路徑(類似 IMAGES_STORE)

          checksum - 圖片內(nèi)容的 MD5 hash

          如果需要file_path(request, response=None, info=None)

          request表示當(dāng)前下載對應(yīng)的request對象(request.dict查看屬性),該方法用來返回文件名

          response返回的是None

          info一樣的返回是一個(gè)對象(info.dict查看)

          同時(shí)需要結(jié)合settings.py的配置進(jìn)行設(shè)置,比如設(shè)置配置存放圖片的路徑以及自定義下載的圖片管道。

          # 可以避免下載最近已經(jīng)下載的圖片,90天的圖片失效期限

          IMAGES_EXPIRES = 90

          IMAGES_STORE = '設(shè)置存放圖片的路徑'

          # 如果需要也可以設(shè)置縮略圖

          # IMAGES_THUMBS = {

          # 'small': (50, 50), # (寬, 高)

          # 'big': (270, 270),

          # }

          # 配置自定義下載的圖片管道, 默認(rèn)是被注釋的

          ITEM_PIPELINES = {

          # yourproject.middlewares(文件名).middleware類

          '項(xiàng)目名.pipelines.xxImagePipeline': 數(shù)值,

          }

          并且Scrapy 框架下載圖片會用到這個(gè)Python Imaging Library (PIL)圖片加載庫,所以也要提前安裝好這個(gè)庫。

          pip install pillow

          案例

          本次我們爬取的網(wǎng)站是一個(gè)有很多治愈系圖片的網(wǎng)站,更加重要的是免費(fèi)的。鏈接是:http://www.designerspics.com

        Picture(1)

          我們要實(shí)現(xiàn)的在MongoDB中存儲,圖片的名字和下載地址,并將圖片下載到本地。因?yàn)槲覀兦懊娲鎯]有使用過MongoDB或者Redis等非關(guān)系型數(shù)據(jù)庫,所以本次案例我們使用MongoDB存儲。

          首先新建一個(gè)項(xiàng)目,命令如下:

          scrapy startproject designerspics

          接下來新建一個(gè) Spider,命令如下:

          scrapy genspider designer www.designerspics.com

          這樣我們就成功創(chuàng)建了一個(gè) Spider。

          接下來使用PyCharm打開爬蟲項(xiàng)目,開始編寫爬蟲。

        Picture(2)

          于是我們的爬蟲代碼就是(當(dāng)然現(xiàn)在爬取的只是第一頁,如果是多頁爬取則需要重寫start_requests(self)方法):

          import scrapy

          from designerspics.items import DesignerspicsItem

          class DesignerSpider(scrapy.Spider):

          name = 'designer'

          allowed_domains = ['www.designerspics.com']

          start_urls = ['http://www.designerspics.com/']

          def parse(self, response):

          title = response.xpath('//div[@class="photograph-wrapper"]/div/h5[1]/text()').extract()

          image_url = response.xpath('//div[@class="photograph-wrapper"]/div/div/a/img/@src').extract()

          for index, t in enumerate(title):

          item = DesignerspicsItem()

          item['title'] = t[2:]

          item['image_url'] = image_url[index]

          yield item

          如果多頁爬取則可以這樣寫,因?yàn)槊恳豁摰牡刂肥沁@樣的除了第一頁

          第一頁:http://www.designerspics.com/

          第二頁:http://www.designerspics.com/page/2/

          第三頁:http://www.designerspics.com/page/3/

          ...

          import scrapy

          from scrapy import Request

          from designerspics.items import DesignerspicsItem

          class DesignerSpider(scrapy.Spider):

          name = 'designer'

          allowed_domains = ['www.designerspics.com']

          # start_urls = ['http://www.designerspics.com/']

          def start_requests(self):

          # 爬取10頁內(nèi)容

          for i in range(1, 11):

          if i == 1:

          url = "http://www.designerspics.com/"

          yield Request(url, self.parse)

          else:

          url = 'http://www.designerspics.com/page/' + str(i)+"/"

          yield Request(url, self.parse)

          def parse(self, response):

          title = response.xpath('//div[@class="photograph-wrapper"]/div/h5[1]/text()').extract()

          image_url = response.xpath('//div[@class="photograph-wrapper"]/div/div/a/img/@src').extract()

          for index, t in enumerate(title):

          item = DesignerspicsItem()

          item['title'] = t[2:]

          item['image_url'] = image_url[index]

          yield item

          其中DesignerspicsItem類的代碼如下:

          import scrapy

          class DesignerspicsItem(scrapy.Item):

          # define the fields for your item here like:

          # name = scrapy.Field()

          collection = 'designerimages'

          title = scrapy.Field()

          image_url = scrapy.Field()

          此時(shí)開始定義Item Pipline,打開piplines.py文件

          import pymongo

          from scrapy import Request

          from scrapy.exceptions import DropItem

          from scrapy.pipelines.images import ImagesPipeline

          class DesignerspicsPipeline:

          def __init__(self, mongo_uri, mongo_db, mongo_port):

          self.mongo_uri = mongo_uri

          self.mongo_db = mongo_db

          self.mongo_port = mongo_port

          @classmethod

          def from_crawler(cls, crawler):

          return cls(mongo_uri=crawler.settings.get('MONGO_URI'),

          mongo_db=crawler.settings.get('MONGO_DB'),

          mongo_port=crawler.settings.get('MONGO_PORT')

          )

          def open_spider(self, spider):

          self.client = pymongo.MongoClient(host=self.mongo_uri, port=self.mongo_port)

          self.db = self.client[self.mongo_db]

          def process_item(self, item, spider):

          self.db[item.collection].insert(dict(item))

          return item

          def close_spider(self, spider):

          self.client.close()

          class ImagePipeline(ImagesPipeline):

          def file_path(self, request, response=None, info=None):

          url = request.url

          file_name = url.split('/')[-1]

          return file_name

          def item_completed(self, results, item, info):

          image_paths = [x['path'] for ok, x in results if ok]

          if not image_paths:

          raise DropItem('Image Downloaded Failed')

          return item

          def get_media_requests(self, item, info):

          yield Request(item['image_url'])

          此時(shí)需要在settings.py中配置:

          MONGO_URI = '127.0.0.1'

          MONGO_DB = 'designerimages'

          MONGO_PORT = 27017

          # 需要設(shè)置存儲圖片的路徑

          IMAGES_STORE = './images'

          啟動爬蟲:

          scrapy crawl designer

          來看一下成果吧!

        Picture(3)

          Mongo數(shù)據(jù)庫的數(shù)據(jù)展示一下:

        Picture(4)

          下篇預(yù)告:Scrapy分布式,歡迎分享!!!

        tags:
        聲明:本站稿件版權(quán)均屬千鋒教育所有,未經(jīng)許可不得擅自轉(zhuǎn)載。
        10年以上業(yè)內(nèi)強(qiáng)師集結(jié),手把手帶你蛻變精英
        請您保持通訊暢通,專屬學(xué)習(xí)老師24小時(shí)內(nèi)將與您1V1溝通
        免費(fèi)領(lǐng)取
        今日已有369人領(lǐng)取成功
        劉同學(xué) 138****2860 剛剛成功領(lǐng)取
        王同學(xué) 131****2015 剛剛成功領(lǐng)取
        張同學(xué) 133****4652 剛剛成功領(lǐng)取
        李同學(xué) 135****8607 剛剛成功領(lǐng)取
        楊同學(xué) 132****5667 剛剛成功領(lǐng)取
        岳同學(xué) 134****6652 剛剛成功領(lǐng)取
        梁同學(xué) 157****2950 剛剛成功領(lǐng)取
        劉同學(xué) 189****1015 剛剛成功領(lǐng)取
        張同學(xué) 155****4678 剛剛成功領(lǐng)取
        鄒同學(xué) 139****2907 剛剛成功領(lǐng)取
        董同學(xué) 138****2867 剛剛成功領(lǐng)取
        周同學(xué) 136****3602 剛剛成功領(lǐng)取
        相關(guān)推薦HOT
        什么是域控制器?

        一、域控制器的定義域控制器是指在Windows Server操作系統(tǒng)中部署Active Directory服務(wù)的服務(wù)器。Active Directory是微軟公司開發(fā)的目錄服務(wù),用...詳情>>

        2023-10-15 00:10:28
        深度學(xué)習(xí)模型權(quán)重h5、weights、ckpt、pth有什么區(qū)別?

        1.來源框架不同h5格式通常用于Keras和TensorFlow框架,weights用于Darknet框架,ckpt是TensorFlow框架的一種格式,而pth則主要用于PyTorch框架...詳情>>

        2023-10-15 00:05:17
        大數(shù)據(jù)測試工程師需要具備哪些技能?

        一、理解大數(shù)據(jù)概念大數(shù)據(jù)測試工程師需要理解大數(shù)據(jù)的基本概念和原理,如分布式存儲、MapReduce、實(shí)時(shí)計(jì)算等。他們還需要了解如何處理大規(guī)模的...詳情>>

        2023-10-14 23:43:03
        為什么SpringBoot的 jar 可以直接運(yùn)行?

        一、JAR文件的結(jié)構(gòu)與執(zhí)行方式Spring Boot的JAR包是Java Archive的縮寫,它是一種壓縮文件格式,可以將Java項(xiàng)目的類文件、資源文件以及依賴庫等...詳情>>

        2023-10-14 23:01:49
        站群服務(wù)器是什么?

        站群服務(wù)器的含義與用途站群服務(wù)器主要用于支持站群,即由一組相互鏈接的網(wǎng)站組成的群體。這些網(wǎng)站通常由同一組織或個(gè)人擁有,并且經(jīng)常會互相鏈...詳情>>

        2023-10-14 22:46:12
        快速通道
        平顺县| 溆浦县| 闵行区| 邢台县| 峨眉山市| 马尔康县| 长海县| 台山市| 墨竹工卡县| 博湖县| 蛟河市| 奇台县| 桓仁| 呼伦贝尔市| 文化| 云霄县| 惠安县| 尼玛县| 抚松县| 胶州市| 富川| 苗栗县| 西盟| 黄骅市| 岳阳市| 临江市| 固原市| 麦盖提县| 东乌珠穆沁旗| 枞阳县| 江陵县| 闻喜县| 九江市| 滦南县| 临湘市| 财经| 乳源| 鸡东县| 福州市| 岱山县| 阿坝|