scrapy 处理动态加载,使用phantomjs

    xiaoxiao2025-10-30  3

    前言:几种渲染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 来渲染页面。

    相关资源:python selenium PhantomJS抓取网页动态加载内容
    最新回复(0)