2017-06-11 5 views
0

WICHTIGER HINWEIS: alle Antworten im Moment auf Stackoverflow sind in früheren Versionen von Scrapy und nicht mit der neuesten Version von scrapy 1.4Python + Scrapy Umbenennung heruntergeladenen Bilder

Völlig neue Arbeit Scrapy und Python, ich versuche, einige Seiten zu kratzen und die Bilder herunterzuladen. Die Bilder werden heruntergeladen, aber sie haben immer noch den ursprünglichen SHA-1 Namen als Dateinamen. Ich kann nicht herausfinden, wie Sie die Dateien umbenennen, sie haben tatsächlich alle die SHA-1-Dateinamen.

Versucht, sie als "Test" umzubenennen, und ich habe "Test" in den Ausgaben erscheinen, wenn ich scrapy crawl rambopics, zusammen mit den URL-Daten ausführen. Die Dateien werden jedoch nicht im Zielordner umbenannt. Hier ist ein Beispiel für die Ausgabe:

> 2017-06-11 00:27:06 [scrapy.core.scraper] DEBUG: Scraped from <200 
> http://www.theurl.com/> {'image_urls': 
> ['https://www.theurl.com/-a4Bj-ENjHOY/VyE1mGuJyUI/EAAAAAAAHMk/mw1_H-mEAc0QQEwp9UkTipxNCVR-xdbcgCLcB/s1600/Image%2B%25286%2525.jpg'], 
> 'image_name': ['test'], 'title': ['test'], 'filename': ['test'], 
> 'images': [{'url': 
> 'https://www.theurl.com/-a4Bj-ENjHOY/VyE1mGuJyUI/EAAAAAAAHMk/mw1_H-mEAc0QQEwp9UkTipxNCVR-xdbcgCLcB/s1600/Image%2B%25286%2525.jpg', 
> 'path': 'full/fcbec9bf940b48c248213abe5cd2fa1c690cb879.jpg', 
> 'checksum': '7be30d939a7250cc318e6ef18a6b0981'}]} 

Bisher habe ich versucht, viele verschiedene Lösungen alle auf Stackoverflow gebucht, gibt es einfach keine klare Antwort auf diese Frage für die neueste Version von scrapy im Jahr 2017, es sieht aus wie die Vorschläge sind wahrscheinlich fast alle veraltet. Ich benutze Scrapy 1.4 mit Python 3.6.

scrapy.cfg

# Automatically created by: scrapy startproject 
# 
# For more information about the [deploy] section see: 
# https://scrapyd.readthedocs.org/en/latest/deploy.html 

[settings] 
default = rambopics.settings 

[deploy] 
#url = http://localhost:6800/ 
project = rambopics 

items.py import Scrapy

class RambopicsItem(scrapy.Item): 
    # defining items: 
    image_urls = scrapy.Field() 
    images = scrapy.Field() 
    image_name = scrapy.Field() 
    title = scrapy.Field() 
    #pass -- dont realy understand what pass is for 

settings.py

BOT_NAME = 'rambopics' 

SPIDER_MODULES = ['rambopics.spiders'] 
NEWSPIDER_MODULE = 'rambopics.spiders' 


ROBOTSTXT_OBEY = True 


ITEM_PIPELINES = { 
    'scrapy.pipelines.images.ImagesPipeline': 1, 
} 

IMAGES_STORE = "W:/scraped/" 

pipelines.py

import scrapy 
from scrapy.pipelines.images import ImagesPipeline 

class RambopicsPipeline(ImagesPipeline): 


    def get_media_requests(self, item, info): 

     img_url = item['img_url'] 
     meta = { 
        'filename': item['title'], 
        'title': item['image_name'] 
       } 

     yield Request(url=img_url, meta=meta) 

(die Spinne) rambopics.py

from rambopics.items import RambopicsItem 
from scrapy.selector import Selector 
import scrapy 


class RambopicsSpider(scrapy.Spider): 
    name = 'rambopics' 
    allowed_domains = ['theurl.com'] 
    start_urls = ['http://www.theurl.com/'] 

    def parse(self, response): 

     for sel in response.xpath('/html'): 
      #img_name = sel.xpath("//h3[contains(@class, 'entry-title')]/a/text()").extract() 
      img_name = 'test' 
      #img_title = sel.xpath("//h3[contains(@class, 'entry-title')]/a/text()").extract() 
      img_title = 'test' 

     for elem in response.xpath("//div[contains(@class, 'entry-content')]"): 
      img_url = elem.xpath("a/@href").extract_first() 


      yield { 
        'image_urls': [img_url], 
        'image_name': [img_name], 
        'title': [img_title], 
        'filename': [img_name] 
       } 

Hinweis, ich weiß nicht, was der richtige Meta-Name zu verwenden ist für die letzte heruntergeladene Datei Name (Ich bin mir nicht sicher, ob es Dateiname, Bildname oder Titel ist).

+0

diese Frage bereits auf der Website hier beantwortet wird: https://stackoverflow.com/a/30002870/1675954 und hier: https://stackoverflow.com/a/6196180/1675954 Sie sind beide ziemlich umfassend Antworten. Überprüfen Sie, ob Ihre Basiseinstellungen richtig konfiguriert sind. Sie müssen vor dem Crawlen festgelegt werden. Siehe https://doc.scrapy.org/en/latest/topics/api.html#scrapy.settings.BaseSettings.set –

+0

Mögliches Duplikat von [Umbenennen von heruntergeladenen Bildern in Scrapy 0.24 mit Inhalt aus einem Artikelfeld unter Vermeidung von Dateinamenkonflikten? ] (https://stackoverflow.com/questions/29946989/renaming-downloaded-images-in-scrapy-0-24-with-content-from-an-item-field-while) –

+0

Bitte erläutern Sie genauer was ist nicht mit anderen Lösungen arbeiten. Gibt es bestimmte Fehler, die Sie bekommen? –

Antwort

0

Verwenden Sie file_path Methode zum Ändern des Namens von Bildern.

class SaveImagesPipeline(FilesPipeline): 
    def get_media_requests(self, item, info): 
     i = 1 
     for image_url in item['image_urls']: 
      filename = '{}_{}.jpg'.format(item['name_image'], i) 
      yield scrapy.Request(image_url, meta={'filename': filename}) 
      i += 1 
    return 

def file_path(self, request, response=None, info=None): 
    return request.meta['filename']