#python #scrapy
Вопрос:
Я пытаюсь очистить веб — сайт, используя scrapy для загрузки изображений. Когда я запускаю код, он работает очень хорошо, но он не загружает изображения даже после того, как я указал каталог nad конвейера изображений в своем settings.py
spider.py
import re import scrapy import os from scrapy.linkextractors import LinkExtractor from scrapy.spiders import CrawlSpider, Rule from ..items import ImagesItem class ImageSpiderSpider(CrawlSpider): name = 'image_spider' allowed_domains = ['books.toscrape.com'] # start_urls = ['http://books.toscrape.com/'] def start_requests(self): url = 'http://books.toscrape.com/' yield scrapy.Request(url=url) rules = ( Rule(LinkExtractor(allow=r'catalogue/'), callback='parse_image', follow=True), ) # save_location = os.getcwd() custom_settings = { "ITEM_PIPELINES": {'scrapy.pipelines.images.ImagesPipeline': 1}, "IMAGES_STORE": '.images_download/full' } def parse_image(self, response): if response.xpath('//div[@class="item active"]/img').get() is not None: img = response.xpath('//div[@class="item active"]/img/@src').get() """ Computing the Absolute path of the image file. "image_urls" require absolute path, not relative path """ m = re.match(r"^(?:../../)(.*)$", img).group(1) url = "http://books.toscrape.com/" img_url = "".join([url, m]) image = ImagesItem() image["image_urls"] = [img_url] # "image_urls" must be a list yield image
items.py
import scrapy class ImagesItem(scrapy.Item): image_urls = scrapy.Field() images = scrapy.Field()
settings.py
BOT_NAME = 'images' SPIDER_MODULES = ['images.spiders'] NEWSPIDER_MODULE = 'images.spiders' ROBOTSTXT_OBEY = True ITEM_PIPELINES = {"scrapy.pipelines.images.ImagesPipeline": 1} IMAGES_STORE = "/Home/PycharmProjects/scrappy/images/images_downloader"
Комментарии:
1. Я запустил ваш код, и он работал абсолютно нормально, и он загрузил изображения. Я попробовал и то, и другое с settings.py и custom_settings, и это сработало в обоих из них. (Я использовал PyCharm и scrapy 2.5.0).
2. Я не запускал его, но сначала вы должны проверить, существует ли папка, потому что она не создает ее автоматически, а если папка не существует, то она не загружается. Во — вторых: вы могли бы использовать
print()
, чтобы увидеть, какая часть кода выполняется и что у вас есть в переменных-это называется"print debuging"
3. Я не понимаю, почему вы используете
re.match
. И если вы хотите создать абсолютный URL-адрес, то у него естьabsolute_url = response.urljoin(relative_url)
4. вместо
os.getcwd()
этого вы можете использовать"."
—"IMAGES_STORE": "."
5. стандартная загрузка конвейера в подпапку
full
—IMAGES_STORE/full
— поэтому вам следует проверить, есть ли у вас подпапкаfull
Ответ №1:
Я не могу протестировать его как project
, но я протестировал ваш код как standalone
сценарий — и он работает для меня.
Я поместил весь этот код в один файл script.py
и запустил его как python script.py
import scrapy from scrapy.linkextractors import LinkExtractor from scrapy.spiders import CrawlSpider, Rule class ImagesItem(scrapy.Item): image_urls = scrapy.Field() images = scrapy.Field() class ImageSpiderSpider(CrawlSpider): name = 'image_spider' allowed_domains = ['books.toscrape.com'] start_urls = ['http://books.toscrape.com/'] rules = ( Rule(LinkExtractor(allow=r'catalogue/'), callback='parse_image', follow=True), ) custom_settings = { "ITEM_PIPELINES": {'scrapy.pipelines.images.ImagesPipeline': 1}, "IMAGES_STORE": '.', } def parse_image(self, response): img = response.xpath('//div[@class="item active"]/img/@src').get() if img: img_url = response.urljoin(img) #image = dict() image = ImagesItem() image["image_urls"] = [img_url] # "image_urls" must be a list yield image # --- run without project and save in `output.csv` --- from scrapy.crawler import CrawlerProcess c = CrawlerProcess({ #'USER_AGENT': 'Mozilla/5.0', # save in file CSV, JSON or XML 'FEEDS': {'output.csv': {'format': 'csv'}}, # new in 2.1 #'ITEM_PIPELINES': {'scrapy.pipelines.images.ImagesPipeline': 1}, # used standard ImagePipeline (download to IMAGES_STORE/full) #'IMAGES_STORE': '.', # this folder has to exist before downloading }) c.crawl(ImageSpiderSpider) c.start()
Он создает подпапку full
с изображениями, которые имеют имена, например 0a007ac89083ad8b68c56ec0f8df5a811e76607c.jpg
, потому что стандартный конвейер использует хэш-код в качестве имени.
Он также создает файл output.csv
со строками, такими как
image_urls,images http://books.toscrape.com/media/cache/b1/0e/b10eabab1e1c811a6d47969904fd5755.jpg,"[{'url': 'http://books.toscrape.com/media/cache/b1/0e/b10eabab1e1c811a6d47969904fd5755.jpg', 'path': 'full/d78460eb2aa4417e52a8d9850934e35ef6b6117f.jpg', 'checksum': 'e7f8ece4eab2ff898a20ce53b4b50dcb', 'status': 'downloaded'}]"
Ту же информацию я вижу также непосредственно в консоли
{'image_urls': ['http://books.toscrape.com/media/cache/ee/cf/eecfe998905e455df12064dba399c075.jpg'], 'images': [{'checksum': '693caff3d97645e73bd28da8e5974946', 'path': 'full/59d0249d6ae2eeb367e72b04740583bc70f81558.jpg', 'status': 'downloaded', 'url': 'http://books.toscrape.com/media/cache/ee/cf/eecfe998905e455df12064dba399c075.jpg'}]}