首页 > 解决方案 > 将 Scrapy spider 作为脚本运行不会获得所有代码,但来自项目的 scrapy spider 会

问题描述

我有一个简单的蜘蛛,它从页面上的脚本中抓取一些东西。

我像这样刮掉脚本

jsData = json.loads(response.xpath('//script[@type="application/ld+json"]//text()').extract_first())

当我从项目中的蜘蛛中运行它时,我会获取所有数据,但如果我从常规脚本而不是项目中运行它,它不会从脚本中获取所有数据。这是为什么?

这是我的脚本蜘蛛

import scrapy
import json
from scrapy.crawler import CrawlerProcess


class MySpider(scrapy.Spider):
    name = "target"
    start_urls = ['https://www.target.com/p/madden-nfl-22-xbox-one-series-x/-/A-83744898#lnk=sametab']

    def parse(self, response):
        jsData = json.loads(response.xpath('//script[@type="application/ld+json"]//text()').extract_first())
        NAME_SELECTOR = jsData['@graph'][0]

        yield {
            'name': NAME_SELECTOR,
        }


process = CrawlerProcess()

process.crawl(MySpider)
process.start()

它给了我

...'offers': {'@type': 'Offer', 'priceCurrency': 'USD', 'availability': 'InStock', 'availableDeliveryMethod': 'ParcelService', 'potentialAction': {'@type': 'BuyAction'}, 'url': 'https://www.target.com/p/madden-nfl-22-xbox-one-series-x/-/A-83744898'}}}

我的项目蜘蛛代码是

import scrapy
import json

class targetSpider(scrapy.Spider):
    name = "target"
    start_urls = ['https://www.target.com/p/madden-nfl-22-xbox-one-series-x/-/A-83744898#lnk=sametab']

    def parse(self, response):
        jsData = json.loads(response.xpath('//script[@type="application/ld+json"]//text()').extract_first())
        test = jsData['@graph'][0]

        yield {
            'test': test
        }

它给了我

...'offers': {'@type': 'Offer', 'price': '59.99', 'priceCurrency': 'USD', 'availability': 'PreOrder', 'availableDeliveryMethod': 'ParcelService', 'potentialAction': {'@type': 'BuyAction'}, 'url': 'https://www.target.com/p/madden-nfl-22-xbox-one-series-x/-/A-8
3744898'}}}

标签: javascriptpythonscrapy

解决方案


这是关于javascript的。类似'price': '59.99'的内容由 javascript 加载。并且Downloader在 Scrapy 中默认不支持运行 javascript。

您的问题的可能原因

  • 您的一个蜘蛛settings.py启用了一些外部下载器中间件(如 Selenium、Splash、Playwright),而另一个没有。
  • 以 ,开头的脚本CrawlerProcess()没有在项目根目录下运行,导致settings.py加载失败。

更新:对不起,我忘了我们需要在使用时手动加载设置CrawlerProcess()从脚本运行scrapy


推荐阅读