Скрап супер нуб тут. Проблема: у меня есть 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. Если подход в порядке, что я делаю не так?