在Splash和Scrapy中将页面滚动自动缩小

时间:2017-07-22 19:44:46

标签: scrapy scrapy-splash

我正在抓取一个使用延迟加载产品图片的网站。

由于这个原因,我加入scrapy-splash以便javascript也可以使用splash呈现,我可以提供wait参数。以前我有一个,但是由于原始scrapy.Request返回占位符图像而不是原始图像的时间。

我已经尝试了等待29.0秒,但我的爬虫仍然很难获得10个项目(它应该根据计算带来280个项目)。我有一个项目pipleline,用于检查项目中的图像是否为空,因此我raise DropItem

我不确定,但我也注意到它不仅是wait问题。当我向下滚动时,看起来图像被加载。

我正在寻找的是一种在我的请求中自动滚动到最低行为的方法。

这是我的代码 的蜘蛛

  def parse(self, response):
        categories = response.css('div.navigation-top-links a.uppercase::attr(href)').extract()
        for category in categories:
            link = urlparse.urljoin(self.start_urls[0], category)
            yield SplashRequest(link, callback=self.parse_products_listing, endpoint='render.html',
                                       args={'wait': 0.5})

管道

class ScrapperPipeline(object):
    def process_item(self, item, spider):
        if not item['images']:
            raise DropItem

        return item

设置

IMAGES_STORE = '/scrapper/images'

SPLASH_URL = 'http://172.22.0.2:8050'

DUPEFILTER_CLASS = 'scrapy_splash.SplashAwareDupeFilter'


ITEM_PIPELINES = {
   'scrapper.pipelines.ScrapperPipeline': 300,
    'scrapy.pipelines.images.ImagesPipeline': 1
}


DOWNLOADER_MIDDLEWARES = {
    'scrapy.downloadermiddleware.useragent.UserAgentMiddleware': None,
    'scrapy_splash.SplashMiddleware': 725,
    'scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware': 810,
    # 'custom_middlewares.middleware.ProxyMiddleware': 210,
}

1 个答案:

答案 0 :(得分:2)

如果你开始使用启动,这个答案应该给你一些指导:https://stackoverflow.com/a/40366442/7926936

你也可以在DownloaderMiddleware中使用selenium,这是我的Twitter剪贴板的一个例子,它将获得页面的前200条推文:

fs.lstat

在while循环中,我在每个循环中等待新推文,直到页面中加载了200条推文并且最长等待时间为10秒。