上期主要介绍了如何将抓取地页面同步到服务端。

本期,主要介绍如何抓取通过js生成的页面。

  • 首先,scrapy 自身不能执行 js。我们必须给她写个插件

这里需要用到可以执行 js 的工具。

phantomjs 或者 python- splash

python-splash 这里不做介绍了。又兴趣的童鞋可以参考 这里 [HTML_REMOVED][HTML_REMOVED] scrapy- splash 简单易懂方便安装。

  • 接下来主要介绍下 scrapy + phantomjs

首先,在 settings.py 中加入一下配置:

# Enable or disable spider middlewares  
# See [http://scrapy.readthedocs.org/en/latest/topics/spi...](http://scrapy.readthedocs.org/en/latest/topics/spider-middleware.html)  
SPIDER_MIDDLEWARES = {  
    'andromeda.middlewares.downloader.PhantomJSDownloader': 100, #加入 phantomjs 下载中间件
}

PHANTOMJS_PATH    = '/usr/local/bin/phantomjs' # 指定 phantomjs 的路径
PHANTOMJS_SPIDER  = ['guoku']                  # 配置 那些 spider 需要用到 phantmjs 抓取

注:phantomjs 抓取页面开销很大。非必需,不建议采用

接着找到 middlewares/downloader.py 这个文件

# coding=utf-8

from scrapy.http import HtmlResponse  
from selenium import webdriver          #导入 selenium 链接 phantomjs 驱动  
# from urlparse import urlparse

from andromeda import settings  
import logging


class PhantomJSDownloader(object):

    def process_request(self, request, spider):   
        response    = None  
        if spider.name in settings.PHANTOMJS_SPIDER:     
            browser = webdriver.PhantomJS(executable_path=settings.PHANTOMJS_PATH)  
            try:  
                browser.set_window_size(800, 600) # 设置浏览器屏幕尺寸  
                browser.get(request.url)  
                content     = browser.page_source.encode("utf-8")  
                url         = browser.current_url.encode('utf-8')  
                response = HtmlResponse(url, encoding='utf-8', status=200, body=content)  
            except Exception as e:  
                logging.error(e.message)  
            finally:  
                browser.close()   # 关闭 selenium   
            return response       # 返回响应结果

    def process_response(self, request, response, spider):  
        return response

解释下以上代码:

  1. 给 scrapy 写下载中间件 主要重写 def process_request(self, request, spider):这个方法
  2. browser.set_window_size(800, 600) 设置浏览器屏幕尺寸
  3. _content = browser.page_source.encode("utf-8")_获取 phantomjs 加载的页面。
  4. 页面抓取完成,一定要关闭浏览器。

项目源代码