Scrapy - скрести как текст, так и изображения в одном пауке - PullRequest
0 голосов
/ 21 октября 2019

Скрап супер нуб тут. Проблема: у меня есть html-страница, содержащая как информацию, которую я хочу очистить, так и URL-адрес, по которому я хочу получить URL-адреса изображений для изображений, которые я хочу загрузить и сохранить через конвейер изображений scrapy.

MyПодход для достижения этой цели: 1. Очистите все детали как обычно с помощью метода разбора 2. Найдите URL-адрес на начальной странице, создайте запрос со вторым методом разбора в качестве обратного вызова, где я создаю список image_urls.

Итак, у меня есть следующие настройки:

settings.py

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

IMAGES_STORE = '/url/to/images' #valid path to actual folder
...
pipelines.py

import pymongo

class MybotPipeline(object):
    def __init__(self):
        self.conn = pymongo.MongoClient('localhost', 27017)
        db = self.conn['libraries']
        self.collection = db['books']

    def process_item(self, item, spider):
        self.collection.insert(dict(item))
        return item
items.py

import scrapy

class MybotItem(scrapy.Item):
    url = scrapy.Field()
    title = scrapy.Field()
    images = scrapy.Field()
    image_urls = scrapy.Field()
    description = scrapy.Field()
crawler.py

import scrapy
from scrapy.spiders import CrawlSpider


class MySpider(CrawlSpider):
    name = 'myspider'
    allowed_domains = ['books.com']

    def start_requests(self):
        urls = [
            'https://www.books.com/some/url'
        ]

        custom_settings = {
            'DEPTH_LIMIT': 1
        }

        for url in urls:
            yield scrapy.Request(url=url, callback=self.parse_item)

    def parse_details(self, response):
        for image in enumerate(response.xpath('//div[contains(@class, "jumbotron")]/div')):
            image_urls = image.xpath('div[contains(@class, "jumbotron-image")]/img/@src').getall()


    def parse_item(self, response):
        for idx, list_item in enumerate(response.xpath('//div[contains(@class, "slider-wrapper")]')):
            anchor = list_item.xpath('div[contains(@class, "slider-section")]/div/a')
            slider_thumbnail = anchor.xpath('div[contains(@class, "slider-thumbnail")]')
            description = slider_thumbnail.xpath('div[contains(@class, "description-box")]')

            yield {
                'url': anchor.xpath('@href').get(),
                'description': description
            }

            details_page_urls = anchor.xpath('@href').getall()
            for details_page in details_page_urls:
                yield scrapy.Request(url=details_page, callback=self.parse_details)

Это не работает, хотя с моим небольшим знанием как Scrapy, так и Python, второй метод синтаксического анализа должен вернутьсписок image_urls. Итак, у меня есть 2 вопроса: 1. есть ли лучший подход для моего случая? Может быть, вся проблема в том, чтобы сделать слишком много с одним пауком? 2. Если подход в порядке, что я делаю не так?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...