scrapy 处理动态加载,使用phantomjs

前言:几种渲染js,ajax插件对比

(1)selenium+webdriver(如firefox,chrome等)。这要求你系统有对应浏览器,并且过程中要全程开浏览器。说白了,就是你通过浏览器能看到啥,就能抓到啥。一般遇到特别复杂的验证码时,这个方法是有必要的,当然,开着浏览器爬虫的效率可想而知。

(2)selenium+phantomjs。PhantomJS是一个WebKit,他的使用方法和webdriver一样,但是他不需要开浏览器,你可以直接跑在无需GUI的linux服务器上,这点很赞。

(3)scrapy-splash。这个和以上两种方法比,优势有以下几点。

  • splash作为js渲染服务,是基于Twisted和QT开发的轻量浏览器引擎,并且提供直接的http api。快速、轻量的特点使其容易进行分布式开发。
  • splash和scrapy融合,两种互相兼容彼此的特点,抓取效率较好。
  • 虽然目前只有英文文档,但写的已经很详细了,仔细阅读便能快速开发。


与普通的scrapy项目,使用phantomjs只需要修改两处

(1)创建 下载中间件JavaScriptMiddleware

  

# -*- coding: utf-8 -*-
from selenium import webdriver
from scrapy.http import HtmlResponse
import time
import requests
from scrapy.downloadermiddlewares.stats import DownloaderStats
global  driver
driver= webdriver.PhantomJS() #指定使用的浏览器,写在此处而不写在类中,是为了不每次调用都生成一个信息独享,减少内存使用
print"PhantomJS is starting..."
class JavaScriptMiddleware(object):
    def process_request(self, request, spider):

        global driver
        # driver = webdriver.Firefox()
        url=request.url;
        #driver.get(url)
        #time.sleep(1)
        js = "var q=document.documentElement.scrollTop=10000"
        driver.execute_script(js) #可执行js,模仿用户操作。此处为将页面拉至最底端。
        #body = driver.page_source
        user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; windows NT)'
        headers = {'User-Agent': user_agent}
        r= requests.post(url, headers=headers)
        body=r.content
        print("访问"+request.url)
        return HtmlResponse(url, encoding='utf-8', status=200, body=body)
        #return HtmlResponse(driver.current_url, body=body, encoding='utf-8', request=request)

关于 HtmlResponse HtmlRequest 可以参考http://scrapy-chs.readthedocs.io/zh_CN/0.24/topics/settings.html#topics-settings-ref  

(2)修改setting.py 文件 ,关闭默认下载器,添加新的下载器中间件

#取消默认的useragent,使用新的useragent
DOWNLOADER_MIDDLEWARES = {
    'scrapy.contrib.downloadermiddleware.useragent.UserAgentMiddleware': None,#关闭默认下载器
    'tutorial.JavaScriptMiddleware.JavaScriptMiddleware':543 #键为中间件类的路径,值为中间件的顺序
}


(3)分析

ok ,这样就可以了,但是由于phantomjs在下载中件中,渲染网页的同时会阻塞爬取。所以效率很低,可以参考后面的使用 scrapy-splash 来渲染页面。

你可能感兴趣的:(scrapy 处理动态加载,使用phantomjs)