Splash动态页面爬虫

来源:互联网 发布:云端笔记 知乎 编辑:程序博客网 时间:2024/05/21 20:27
Splash是一个Javascript渲染服务。它是一个实现了HTTP API的轻量级浏览器,Splash是用Python实现的,同时使用Twisted和QT。Twisted(QT)用来让服务具有异步处理能力,以发挥webkit的并发能力。
scrapy-splash利用Splash将javascript和Scrapy集成起来,使得Scrapy可以抓取动态网页。
地址:http://scrapy-cookbook.readthedocs.io/zh_CN/latest/scrapy-12.html#scrapy-splash

一、安装运行splash
1、docker中安装splash
docker pull scrapinghub/splash

2、使用docker启动服务命令启动Splash服务
#启动splash服务,并通过http,https,telnet提供服务
#通常一般使用http模式 ,可以只启动一个8050就好  
#Splash 将运行在 0.0.0.0 at ports 8050 (http), 8051 (https) and 5023 (telnet).
docker run -it --name mysplash -p 5023:5023 -p 8050:8050 -p 8051:8051 -d -max-timeout 3600 scrapinghub/splash bash

3、打开浏览器输入192.168.104.53:8050查看服务启动情况

4、输入www.baidu.com,点击Render me按钮,立马可以看见在服务器端渲染后的百度页面

二、安装配置scrapy-splash
1、安装scrapy-splash
$ pip install scrapy-splash

2、配置
在你的scrapy工程的配置文件settings.py中添加
SPLASH_URL = 'http://192.168.104.53:8050'

添加Splash中间件,还是在settings.py中通过DOWNLOADER_MIDDLEWARES指定,并且修改HttpCompressionMiddleware的优先级
DOWNLOADER_MIDDLEWARES = {
    'scrapy_splash.SplashCookiesMiddleware': 723,
    'scrapy_splash.SplashMiddleware': 725,
    'scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware': 810,
}

默认情况下,HttpProxyMiddleware的优先级是750,要把它放在Splash中间件后面
设置Splash自己的去重过滤器
DUPEFILTER_CLASS = 'scrapy_splash.SplashAwareDupeFilter'

如果你使用Splash的Http缓存,那么还要指定一个自定义的缓存后台存储介质,scrapy-splash提供了一个scrapy.contrib.httpcache.FilesystemCacheStorage的子类
HTTPCACHE_STORAGE = 'scrapy_splash.SplashAwareFSCacheStorage'

如果你要使用其他的缓存存储,那么需要继承这个类并且将所有的scrapy.util.request.request_fingerprint调用替换成scrapy_splash.splash_request_fingerprint

三、使用
主要通过重写start_requests函数,修改其中渲染请求的方式
1、使用scrapy_splash.SplashRequest渲染
def start_requests(self):
        splash_args = {
            'wait': 0.5,
            # 'http_method': 'GET',
            # 'html': 1,
    # 'png': 1,
               # 'width': 600,
        # 'render_all': 1
        }
        for url in self.start_urls:
            yield scrapy_splash.SplashRequest(url, self.parse, endpoint='render.html',
                                args=splash_args)

2、在普通的scrapy请求中传递splash请求meta关键字达到同样的效果
def start_requests(self):
        meta_args = {
            'splash': {
                'args': {
                    'wait': 0.5,
                    # set rendering arguments here
                    #'render_all':1,
                    'images': 0,
                    'html': 1,

                    # 'url' is prefilled from request url
                    # 'http_method' is set to 'POST' for POST requests
                    # 'body' is set to request body for POST requests
                },

                # optional parameters
                'endpoint': 'render.html',  # optional; default is render.json
                #'splash_url': '<url>',      # optional; overrides SPLASH_URL
                'slot_policy': scrapy_splash.SlotPolicy.PER_DOMAIN,
                'splash_headers': {},       # optional; a dict with headers sent to Splash
                'dont_process_response': True,  # optional, default is False
                'dont_send_headers': True,  # optional, default is False
                'magic_response': False,    # optional, default is True
            }
        }
        for url in self.start_urls:
            yield scrapy.Request(url, self.parse, meta=meta_args)

Splash API说明,使用SplashRequest是一个非常便利的工具来填充request.meta['splash']里的数据
meta[‘splash’][‘args’] 包含了发往Splash的参数。
meta[‘splash’][‘endpoint’] 指定了Splash所使用的endpoint,默认是render.html
meta[‘splash’][‘splash_url’] 覆盖了settings.py文件中配置的Splash URL
meta[‘splash’][‘splash_headers’] 运行你增加或修改发往Splash服务器的HTTP头部信息,注意这个不是修改发往远程web站点的HTTP头部
meta[‘splash’][‘dont_send_headers’] 如果你不想传递headers给Splash,将它设置成True
meta[‘splash’][‘slot_policy’] 让你自定义Splash请求的同步设置
meta[‘splash’][‘dont_process_response’] 当你设置成True后,SplashMiddleware不会修改默认的scrapy.Response请求。默认是会返回SplashResponse子类响应比如SplashTextResponse
meta[‘splash’][‘magic_response’] 默认为True,Splash会自动设置Response的一些属性,比如response.headers,response.body等
如果你想通过Splash来提交Form请求,可以使用scrapy_splash.SplashFormRequest,它跟SplashRequest使用是一样的。
阅读全文
'); })();
0 0
原创粉丝点击
热门IT博客
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 千露露 牧本千幸 千本鸟居 千本 牧本千幸全集在线播放 千本露露 千本桜 千年后本宫成了白骨精 狐珠子 碧蓝之海千纱本 狐妖之幻梦千年归来 妖本就萌 千本中国通史 鸟居 露露 千山药机股吧 千机伞 千机网 千机堂数码 千机阙 千机锁之梏攻略 千机网维修网点 莫千机 300216千山药机股吧 诸天主神殿 千机百艺 千机伞设计图 千机双扣 千野智能反渗透直饮机 千林 千林保健品曝光 千林保健品怎么样 曲江千林郡 千林郡 千林鱼油软胶囊 千林大豆异黄酮 千林鱼油软胶囊的作用 千林蜂胶软胶囊怎么样 千林叶酸铁片怎么样 千林芦荟软胶囊 桐崎千棘 樯怎么读