开发,设计,生活

网络爬虫系统

  • 2014-04-01 16:55:45 2014-06-18 08:58:48[U] 网络爬虫系统

    javascript 动态页面

    目前许多网站大量运用js脚本进行一些页面的处理,这些页面的抓取对爬虫是个挑战。 这类页面的抓取,我用到了下面的方法

    1. 分析页面(firebug/chrome调试工具 等),找到ajax获取的数据源,看是否可以直接发请求获取
    2. 调用浏览器引擎(webkit)获取最后 js 执行过完成的页面
    3. 调用无界面依赖的浏览器引擎(headless browser) casperjs,phantomjs 获取最后的页面


    使用 webkit 抓取

    安装需要的软件

    # Xvfb 模拟 Xwindows 
    sudo apt-get install xvfb
    # 安装 python webkit包
    

    添加增加下面的下载代码(增加的位置我后面说明)

    webview = webkit.WebView()
    webview.connect( 'load-finished', lambda v,f: gtk.main_quit() )
    webview.load_uri( request.url )
    gtk.main()
    renderedBody = str(webview.execute_script('document.documentElement.innerHTML'))
    # renderedBody 是执行后页面的内容
    

    注意的上面的代码我没有说明写在哪里,网上很多例子都是说写 下载中间件(DownloaderMiddleware)里,这是有些问题的

    1. scrapy 是基于twisted的异步网络框架。如果下载中间件中长时间阻塞,就会阻塞整个异步处理流程
    2. scrapy 本身的下载 delay 功能,是在中间件下面一层生效(中间件和下载器之间),也就是说如果在下载中间件这里中断处理流程,下载时间间隔功能将失去作用。
    3. 还有一个问题就是 上面的方案需要启动模拟的 x-server (xvfb)


    目前的方案

    1. casperjs,phantomjs 无界面浏览器(headless browser)
    2. 写一个 scrapy 的 下载handler,这是scrapy支持的插件,并且不影响其他框架功能的运行,下载器的开发我会在下一篇讲一下