2017-06-08 122 views
2

我想制作一个通用的抓取工具,可以抓取和抓取任何类型的网站(包括AJAX网站)的所有数据。我已经广泛搜索了互联网,但找不到任何适当的链接可以解释我如何Scrapy和Splash一起可以刮AJAX网站(其中包括分页,表单数据和点击按钮之前页面显示)。我提到的每个链接都告诉我,Javascript网站可以使用Splash渲染,但没有关于使用Splash渲染JS网站的很好的教程/解释。请不要给我有关使用浏览器的解决方案(我想以编程方式执行所有操作,欢迎使用无头浏览器,但我想使用Splash)。如何使用Scrapy和Splash来抓取基于AJAX的网站?

class FlipSpider(CrawlSpider): 
    name = "flip" 
    allowed_domains = ["www.amazon.com"] 

    start_urls = ['https://www.amazon.com/s/ref=nb_sb_noss?url=search-alias%3Daps&field-keywords=mobile'] 

    rules = (Rule(LinkExtractor(), callback='lol', follow=True), 

    def parse_start_url(self,response): 

     yield scrapy.Request(response.url, self.lol, meta={'splash':{'endpoint':'render.html','args':{'wait': 5,'iframes':1,}}}) 

    def lol(self, response): 
     """ 
     Some code 
+1

您是否遵守[飞溅DOC(https://github.com/scrapy-plugins/scrapy-splash#installation)?你确切的问题是什么? –

+0

是的,我做过。 Splash doc只是提到我们可以使用的命令。我想知道如何使用它们来运行一个网站的JavaScript来获取动态内容... – Rohan

+0

那么如果你没有关于飞溅特定的问题或问题,我不会复制粘贴文档...如果你参考对于文档,您应该可以抓取基于JavaScript的网站 –

回答

0

可以效仿行为,就像一个ckick,或滚动,通过书面方式一的JavaScript功能,并告诉飞溅,当它呈现你的网页来执行该脚本。

小为例:

你定义一个的JavaScript功能,其选择在所述页面和元件然后点击它:

(来源:splash doc

-- Get button element dimensions with javascript and perform mouse click. 
_script = """ 
function main(splash) 
    assert(splash:go(splash.args.url)) 
    local get_dimensions = splash:jsfunc([[ 
     function() { 
      var rect = document.getElementById('button').getClientRects()[0]; 
      return {"x": rect.left, "y": rect.top} 
     } 
    ]]) 
    splash:set_viewport_full() 
    splash:wait(0.1) 
    local dimensions = get_dimensions() 
    splash:mouse_click(dimensions.x, dimensions.y) 

    -- Wait split second to allow event to propagate. 
    splash:wait(0.1) 
    return splash:html() 
end 
""" 

然后,当你request,你修改endpoint并将其设置为"execute",并将"lua_script": _script添加到参数

例:

def parse(self, response): 
    yield SplashRequest(response.url, self.parse_elem, 
         endpoint="execute", 
         args={"lua_source": _script}) 

你会发现约飞溅脚本的所有信息here

+0

谢谢!很好的解释。我想知道我们是否可以使用scrapy + splash在网页上执行所有JavaScript? – Rohan

1

与飞溅和分页的问题是以下几点:

我没能产品Lua脚本提供一个新的网页(点击分页链接后),其格式为响应。而不是纯粹的HTML。

所以,我的解决方案如下 - 点击链接并提取新生成的网址,并将抓取工具指向此新网址。

所以,我有分页链接在页面上我执行

yield SplashRequest(url=response.url, callback=self.get_url, endpoint="execute", args={'lua_source': script}) 

与以下的Lua脚本

def parse_categories(self, response): 
script = """ 
      function main(splash) 
       assert(splash:go(splash.args.url)) 
       splash:wait(1) 
       splash:runjs('document.querySelectorAll(".next-page")[0].click()') 
       splash:wait(1) 
       return splash:url() 
      end 
      """ 

和GET_URL功能

def get_url(self,response): 
    yield SplashRequest(url=response.body_as_unicode(), callback=self.parse_categories) 

这样我就能够循环查询。

同样的方法,如果你不指望新的URL你的Lua脚本可以产生纯粹的HTML,你必须使用正则表达式(这是不好的) - 但这是我能做到的最好的。