scrapy-splash不会返回所有数据

dsf9zpds  于 2022-11-09  发布在  其他
关注(0)|答案(1)|浏览(185)

我试图创建一个可以从某个网站刮数据的刮刀,例如:
https://www.spicejet.com/search?from=BOM&to=BLR&tripType=1&departure=2022-04-20&adult=1&child=0&infant=0&currency=USD&redirectTo=/
问题是,它只收集了一些数据,但我真正需要的(航班的详细信息)并没有返回。
我需要这个div元素:其中包含了许多div,其中包含了航班的详细信息,但是当我使用scrapy-splash时,我只得到了这个div元素,而没有他的children元素--这些元素存储了数据。
我知道有几个类似的问题,但没有一个解决方案有帮助。
这就是代码:

class SpiceJetSpider(scrapy.Spider):

    name = "spiceJet"       
    flight_search_results = []
    custom_settings = {
        'BOT_NAME' : 'flightsCadgerScrapy',

        'SPIDER_MODULES' : ['flightsCadgerScrapy.spiders'],
        'NEWSPIDER_MODULE' : 'flightsCadgerScrapy.spiders',

        'SPLASH_URL' : 'http://localhost:8050',

        'DOWNLOADER_MIDDLEWARES' : {
            'scrapy_splash.SplashCookiesMiddleware': 723,
            'scrapy_splash.SplashMiddleware': 725,
            'scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware': 810,
        },

        'SPIDER_MIDDLEWARES' : {
            'scrapy_splash.SplashDeduplicateArgsMiddleware': 100,
        },

        'DUPEFILTER_CLASS' : 'scrapy_splash.SplashAwareDupeFilter',

        'HTTPCACHE_STORAGE' : 'scrapy_splash.SplashAwareFSCacheStorage'
    }

    def __init__(self, flight_search_request):
        self.url = 'https://www.spicejet.com/search?from=BOM&to=BLR&tripType=1&departure=2022-04-20&adult=1&child=0&infant=0&currency=USD&redirectTo=/'

    def start_requests(self):   
        yield SplashRequest(self.url, self.parse, args={'wait': 6})

    def parse(self, response):
        flight_obj = response.css('div').getall()
        self.flight_search_results.append(flight_obj)

        return self.flight_search_results

我得到的响应包含一个div列表,但我需要的那个是空的。
谢谢你!

qxgroojn

qxgroojn1#

加载大量javascript的网站的首选方法是使用scrapy-playwright。它比scrapy-splash更简单,更容易设置。请从here阅读更多关于它的使用。
下面的示例代码显示了如何使用它来获取页面的呈现html,然后可以解析该页面以获取所需的数据。

import scrapy

class SpiceJetSpider(scrapy.Spider):

    name = "spiceJet"
    custom_settings = dict(
        DOWNLOAD_HANDLERS={
            "https": "scrapy_playwright.handler.ScrapyPlaywrightDownloadHandler",
        },
        TWISTED_REACTOR = "twisted.internet.asyncioreactor.AsyncioSelectorReactor"
    )

    def start_requests(self):
        url = 'https://www.spicejet.com/search?from=BOM&to=BLR&tripType=1&departure=2022-04-20&adult=1&child=0&infant=0&currency=USD&redirectTo=/'
        yield scrapy.Request(url, meta={'playwright': True})

    def parse(self, response):
        # do all the parsing you need of the response here
        yield {
            "html": response.text
        }

相关问题