【问题标题】:Scrapy Spider Crawl 0 pagesScrapy Spider Crawl 0 页
【发布时间】:2017-03-19 04:52:52
【问题描述】:

我正在尝试使用 Scrapy 从网站中提取 json 数据,但我遇到了一些问题,例如当我运行我的蜘蛛时,没有给出错误并说爬取了 0 个页面。我还使用命令将 de 输出存储到 json 文件以查看输出。

以下代码是我的蜘蛛:

import scrapy

class WineSpider(scrapy.Spider):
name = "SpidyWine"
i = 0
url = 'https://maiscarrinho.com/api/search?q=vinho&pageNumber=%s&pageSize=10'
start_urls = [url % 1]

def parse(self, response):
data = json.loads(response.body)
for item in data['results']:
    yield {
        'Image': item.get('image')
    }
if data['Image']:
    i = i + 1
    yield scrapy.Request(self.url % i, callback=self.parse)

还有我的物品类别:

import scrapy

class MaiscarrinhoItem(scrapy.Item):

 image = scrapy.Field()
 price = scrapy.Field()
 supermarket = scrapy.Field()
 promotion = scrapy.Field()
 wineName = scrapy.Field()
 brand = scrapy.Field()

现在,我只是在我的蜘蛛中使用 Image 字段来让事情变得更容易。 另外,当我在我的蜘蛛中编写 if 语句时,我的想法是“处理”无限滚动,当 json api 具有“图像”时,意味着该页面有内容。

Output in Console

提前致谢

【问题讨论】:

  • 你能发布你的运行日志吗?您可以通过scrapy crawl myspider &> output.log获取它
  • @Granitosaurus 我编辑了我的帖子,你有图像,因为你的命令我的文件是空的。

标签: python json scrapy


【解决方案1】:

除了一个很小的错误之外,你做的一切都是正确的。

包含图片的字段名称是Image,而不是image

试试:

yield {
    'Image': item.get('Image')
}

settings.py 文件中的ITEM_PIPELINES 可能也有问题

【讨论】:

  • 谢谢,但不起作用。当我运行命令时: Scrapy crawl SpidyWine -o output.json 它存储“[”
  • 你能不能把你的scrapy字段改成'Image = scrapy.Field()`试试?如果这不起作用,请在设置文件中将您的管道 MaiscarrinhoItem 注释到 ITEM_PIPELINES 并运行。
  • 我按照您的建议更改了字段,但没有奏效。关于管道,您是在谈论 settings.py 中的 ITEM_PIPELINES 吗?默认情况下,这段代码已经在 cmets 中了。
  • 你能把你的ITEM_PIPELINESfrom settings.py 文件的行贴出来吗?如果您使用请求来执行与蜘蛛相同的操作,它会提供图像路径。
  • 以下代码是我在我的 settings.py 中关于ITEM_PIPELINES 的内容:# Configure item pipelines # See http://scrapy.readthedocs.org/en/latest/topics/item-pipeline.html #ITEM_PIPELINES = { # 'Maiscarrinho.pipelines.SomePipeline': 300, #} 你使用的是哪种外壳?我无法重现您在图片中显示的内容。
【解决方案2】:

很好地回答了我的问题,并在一段时间后深入研究了我的代码......我意识到这是关于标识错误和一些语法错误。

另一点是管道,我忘记将 de last name 更改为我的管道的真实名称,所以现在我有 'Maiscarrinho.pipelines.SomePipeline': 300 而不是 'Maiscarrinho.pipelines.MaiscarrinhoPipeline': 300

下面的代码正在提取我想要的图像,但还有一个问题。由于页面有无限滚动,我有一个条件来评估是否有一个名为 'Image 的元素,但由于某种原因,我没有得到想要的结果。它应该提取 40 页,每页有 10 张图像。

import scrapy
import json

class WineSpider(scrapy.Spider):
name = "SpidyWine"

url = 'https://maiscarrinho.com/api/search?q=vinho&pageNumber=%s&pageSize=10'
start_urls = [url % 1]
i = 1
def parse(self, response):
    data = json.loads(response.body.decode('utf-8'))
    for item in data['results']:
        yield {
            'Image': item.get('Image')
        }
        if item.get('Image'):
            WineSpider.i += 1
            yield scrapy.Request(self.url % WineSpider.i, callback=self.parse)

【讨论】:

    猜你喜欢
    • 2015-02-14
    • 1970-01-01
    • 2022-10-24
    • 2015-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-24
    • 1970-01-01
    相关资源
    最近更新 更多