Python 刮-在同一个蜘蛛中刮取文本和图像

Python 刮-在同一个蜘蛛中刮取文本和图像,python,web-scraping,scrapy,Python,Web Scraping,Scrapy,这是一个非常棒的地方。问题:我有一个html页面,其中既包含我想要刮取的信息,也包含我想要跟随的url,以获取我想要通过刮取图像管道下载和保存的图像的图像url 我的方法是: 1.像往常一样使用解析方法清除所有细节 2.在初始页面中找到url,创建一个请求,该请求具有第二个解析方法作为回调,我在其中构建image_url列表 因此,我有以下设置: settings.py ... ITEM_PIPELINES = { 'crawlbot.pipelines.MybotPipeline':

这是一个非常棒的地方。问题:我有一个html页面,其中既包含我想要刮取的信息,也包含我想要跟随的url,以获取我想要通过刮取图像管道下载和保存的图像的图像url

我的方法是: 1.像往常一样使用解析方法清除所有细节 2.在初始页面中找到url,创建一个请求,该请求具有第二个解析方法作为回调,我在其中构建image_url列表

因此,我有以下设置:

settings.py

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

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

这不起作用,尽管我对Scrapy和Python都知之甚少,但第二个解析方法应该返回一个image_URL列表。所以我有两个问题:1。有更好的方法来解决我的问题吗?也许整个问题都在于试图对一只蜘蛛做太多?2.如果方法正确,我做错了什么?

请参见查找示例:您只需为
image\u URL
变量赋值。对于图像管道,您需要
生成
带有
image\u URL
字段的项目。
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)