如何使用python Scrapy刮掉延迟加载的图像

时间:2016-04-30 05:39:23

标签: python web-scraping scrapy scrapy-spider

以下是我用于抓取网页的代码。我想要抓取的网站有启用图像延迟加载,因此scrapy只能抓取100个图像中的10个,其​​余的都是placeholder.jpg。什么是在Scrapy中处理延迟加载图像的最佳方法?

谢谢!

class MasseffectSpider(scrapy.Spider):
name = "massEffect"
allowed_domains = ["amazon.com"]
start_urls = [
    'file://127.0.0.1/home/ec2-user/scrapy/amazon/amazon.html',
]


def parse(self, response):

for item in items:
    listing = Item()
    listing['image'] =  item.css('div.product img::attr(src)').extract()
    listing['url'] =  item.css('div.item-name a::attr(href)').extract()
    listings.append(listing)

似乎CasperJS等其他工具都有视口来加载图像。

casper.start('http://m.facebook.com', function() {

// The pretty HUGE viewport allows for roughly 1200 images.
// If you need more you can either resize the viewport or scroll down the viewport to load more DOM (probably the best approach).
this.viewport(2048,4096);

this.fill('form#login_form', {
    'email': login_username,
    'pass':  login_password
}, true);
});

2 个答案:

答案 0 :(得分:2)

问题是懒惰加载是由javascript进行的,scrapy无法处理,casperjs处理这个问题。

要使用scrapy进行此操作,您必须将其与Selenium或scrapyjs混合

答案 1 :(得分:1)

要在延迟加载中抓取图像,您必须跟踪返回图像的ajax请求。在此之后你在scrapy中击中了这个请求。从特定页面获取所有数据后。您必须通过scrapy请求中的meta将提取的数据发送到其他回调。如需进一步的帮助Scrapy request