当前位置: 首页 > 知识库问答 >
问题:

抓取图像失败

乐正辰阳
2023-03-14

我正在尝试使用以下残片代码从网站抓取图像:

import urlparse
from PIL import Image
from scrapy.exceptions import DropItem, NotConfigured, IgnoreRequest
from scrapy.spider import BaseSpider
from scrapy.contrib.spiders import CrawlSpider, Rule
from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor
from scrapy.contrib.loader import XPathItemLoader
from scrapy.selector import HtmlXPathSelector
from scrapy.http.request import Request

from scrapy.contrib.pipeline.images import ImagesPipeline
from mobile.items import Website

class MobileSpider(CrawlSpider):
    name = "mobile"
    allowed_domains = ["mobile-store.ro"]
    start_urls = ["http://www.mobile-store.ro/produse/"]
    rules = (
        Rule(SgmlLinkExtractor(allow=r"/produs/d+"), follow=True),
        Rule(SgmlLinkExtractor(allow=r"/produse/d+"), callback='parse_item')
    )

    def parse(self, response, response2):
        hxs = HtmlXPathSelector(response)
        next_page = hxs.select("//ul[@class='products']/li/a/@href").extract()
        if not not next_page:
            yield Request(next_page[0], self.parse)
        sites = hxs.select('//div[@id="wrapper"]/div[@id="content"]')
        items = []

        for site in sites:
            item = Website()
            item['nume'] = site.select('//div[@class="summary"]/h1[@class="product_title entry-title"]/text()').extract()
            item['categorie'] = site.select('//div[@class="summary"]/div[@class="product_meta"]/span[@class="posted_in"]/a/text()').extract()
            item['brand'] = site.select('//div[@class="summary"]/div[@class="product_meta"]/span[@class="tagged_as"]/a/text()').extract()
            item['descriere'] = site.select('//div[@class="woocommerce_tabs"]/div[@id="tab-description"]/p/text()').extract()
            image_relative_url = site.select('//div[@class="ad-image-wrapper"]/div[@class="ad-image"]/img[@class="lightbox"]/@src').extract()
            item['image_urls'] = [urlparse.urljoin(response.url,image_relative_url)]
            #item['image_urls'] = site.select('//div[@class="ad-image-wrapper"]/div[@class="ad-image"]/img[@class="lightbox"]/@src').extract()
            item['pret'] = site.select('//div[@class="summary"]/div[1]/p[@class="price"]/span[@class="amount"]/text()').extract()
            item['url'] = response.url
            items.append(item)
        for item in items:
            yield item

settings.py:
SPIDER_MODULES = ['mobile.spiders']
NEWSPIDER_MODULE = 'mobile.spiders'
DEFAULT_ITEM_CLASS = 'mobile.items.Website'

ITEM_PIPELINES = ['scrapy.contrib.pipeline.images.ImagesPipeline']

items.py:
from scrapy.item import Item, Field

class Website(Item):
    nume = Field()
    descriere = Field()
    categorie = Field()
    brand = Field()
    pret = Field()
    url = Field()
    image_urls = Field()
    images = Field()
    image_paths = Field()

pipelines.py:
from mobile.contrib.pipeline.images import ImagesPipeline
from scrapy.exceptions import DropItem
from scrapy.http import Request

class MyImagesPipeline(ImagesPipeline):

    def get_media_requests(self, item, info):
        for image_url in item['image_urls']:
            yield Request(image_url)

    def item_completed(self, results, item, info):
        image_paths = [x['path'] for ok, x in results if ok]
        if not image_paths:
            raise DropItem("Item contains no images")
        item['image_paths'] = image_paths
        return item

当我尝试使用以下代码获取图像url时,会出现问题:

for site in sites:
        item = Website()
        item['nume'] = site.select('//div[@class="summary"]/h1[@class="product_title entry-title"]/text()').extract()
        item['categorie'] = site.select('//div[@class="summary"]/div[@class="product_meta"]/span[@class="posted_in"]/a/text()').extract()
        item['brand'] = site.select('//div[@class="summary"]/div[@class="product_meta"]/span[@class="tagged_as"]/a/text()').extract()
        item['descriere'] = site.select('//div[@class="woocommerce_tabs"]/div[@id="tab-description"]/p/text()').extract()
        image_relative_url = site.select('//div[@class="ad-image-wrapper"]/div[@class="ad-image"]/img[@class="lightbox"]/@src').extract()
        item['image_urls'] = [urlparse.urljoin(response.url2,image_relative_url)]
        #item['image_urls'] = site.select('//div[@class="ad-image-wrapper"]/div[@class="ad-image"]/img[@class="lightbox"]/@src').extract()
        item['pret'] = site.select('//div[@class="summary"]/div[1]/p[@class="price"]/span[@class="amount"]/text()').extract()
        item['url'] = response.url
        items.append(item)
    for item in items:
        yield item

它将返回页面url而不是图像url。所有其他字段都已正确爬网。关于如何解决此问题并正确获取图像url的任何线索?

共有1个答案

李疏珂
2023-03-14

这是因为图像(以及ad-image-wrapperdiv的全部内容)是通过javascript动态填充的。

倾销响应。parse方法中的body帮助我确定实际的图像链接最初保存在ad thumb列表中。因此,请尝试使用以下方法获取图像url:

image_relative_url = site.select('//ul[@class="ad-thumb-list"]/li[@class="first_item"]/a/@href').extract()
if image_relative_url:
    image_relative_url = image_relative_url[0]

希望这就是你所需要的。

 类似资料:
  • 我试图从TripAdvisor网站上获取评论。由于网站中的大多数图像都是动态加载的,所以我使用splashjavascript呈现服务来生成页面。 问题是有些图像已加载,有些未加载。 以下是我要爬网的评论的URL:https://www.tripadvisor.com.sg/ShowUserReviews-g294265-d1770798-r446535418-Marina_Bay_Sands-S

  • 使用Yii2 2.0.12,php 5.6.24和codec0019 2.3.3 在最近的一次升级中,一组到目前为止一直有效的验收测试失败了。升级是对最新版本的标准composer更新。测试场景如下所示: 测试通过表单添加记录 抓取新记录验证 测试通过表单添加第二条记录 抓取新记录验证 第二个抓取失败,因为它返回一个空记录。我将其追溯到“Command”对象的“queryInternal”方法,其

  • 所以我猜没有注册的ImageReader?我怎么能通过Jaspersoft Studio修复这样的东西? 编辑:我尝试使用java.io.InputStream作为这里建议的类类型,但结果是相同的错误。算是吧。一个很大的区别是,在Jaspersoft Studio中,如果出现错误,您可以将图像设置为显示为空白。如果我使用java.awt.Image,那么这个设置什么也不做。我仍然得到一个错误,报告

  • 问题内容: 我是Stackoverflow和OpenCV编程领域的新手。我已经使用Java的OpenCV绑定(opencv.org官员,而不是JavaCV)进行了一些项目,例如通过ORB和SURF功能识别对象,使用图像。一切都没问题。现在,我将转向视频流中的对象识别。我想从摄像头中获取视频流并应用对象识别。我不是Java专家,所以我在OpenCV中找到了VideoCapture类,但无法从摄像机获

  • 问题内容: 所以,我的问题相对简单。我有一只蜘蛛在多个站点上爬行,我需要它按照我在代码中写入的顺序返回数据。它发布在下面。 结果以随机顺序返回,例如,返回29,然后28,然后30。我已经尝试将调度程序的顺序从DFO更改为BFO,以防万一这是问题所在,但这并没有改变。 问题答案: 定义在方法中使用的URL 。下载页面时,将为你的方法调用每个起始URL的响应。但是你无法控制加载时间-第一个起始URL可

  • 我有一个困扰了我好几天的问题。。。我检查了类似的问题,但没有找到解决方案。 我使用NetBeans IDE。我建立项目jar文件,即“Clock.jar”,其中包含一个“时钟”命名文件夹,其中发现了一些图像、文本文件和所有项目类。下面的代码创建一个图像图标工作 但是下面读取文本文件的代码失败 正如您可能猜到的那样,引发了NullPointer异常,这意味着它可能找不到文件。 但是,为什么图像图标构