scrapy-splash 爬虫渲染异步加载,ajax

首先给出splash官网地址:http://splash.readthedocs.io/en/stable/api.html#render-html

1.安装和准备

(1)先安装scrapy-splash库:

pip install scrapy-splash


(2)然后将我们的docker起起来

docker run -p 8050:8050 scrapinghub/splash


如果关于docker安装还有更多的问题,请查考:

splash安装文档

2.配置

  1. (1)将splash server的地址放在你的settings.py文件里面,如果是你在本地起的,那地址应该是http://127.0.0.1:8050,我的地址如下
  2. SPLASH_URL = 'http://192.168.99.100:8050'


  3. (2)在你的下载器中间件:download_middleware 里面启用如下的中间文件,注意启用的顺序
  4. DOWNLOADER_MIDDLEWARES = {
        'scrapy_splash.SplashCookiesMiddleware': 723,
        'scrapy_splash.SplashMiddleware': 725,
        'scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware': 810,
    }


另外注意:

scrapy_splash.SplashMiddleware(725)的顺序是在默认的HttpProxyMiddleware(750)之前,要不然顺序的紊乱会造成功能的紊乱的

HttpCompressionMiddleware的优先级和顺序也应该适当的更改一下,这样才能更能处理请求  

查看:https://github.com/scrapy/scrapy/issues/1895 .里面提到的一些问题

  1. (3)在settings.py启用SplashDeduplicateArgsMiddleware中间件
  2. SPIDER_MIDDLEWARES = {
        'scrapy_splash.SplashDeduplicateArgsMiddleware': 100,
    }


  3. (4)我们来设置一个去重的类
  4. DUPEFILTER_CLASS = 'scrapy_splash.SplashAwareDupeFilter'


  5. (5)如果你使用scrapy http 缓存系统,那你就有必要启用这个scrapy-splash的缓存系统
  6. HTTPCACHE_STORAGE = 'scrapy_splash.SplashAwareFSCacheStorage'


   如果你有在你自己的settings.py里面启用DEFAULT_REQUEST_HEADERS ,请务必注释掉,目前看来是一个bug ,我已经给scrapy splash 官方提了这个bug
          该bug 是由于default_request_headers 里面的host 与我要爬的sougou不匹配,这当然会出错,不得不说scrapy的官方维护人反应真的很迅速。大家添加的headers的时候注意这些细节内容。

代码

# -*- coding: utf-8 -*-
from scrapy import Request
from scrapy.spiders import Spider
from scrapy_splash import SplashRequest
from scrapy_splash import SplashMiddleware
from scrapy.http import Request, HtmlResponse
from scrapy.selector import Selector

class SplashSpider(Spider):
    name = 'scrapy_splash'
    # main address since it has the fun list of the products
    start_urls = [
        'https://item.jd.com/2600240.html'
    ]

    # allowed_domains = [
    #     'sogou.com'
    # ]

    # def __init__(self, *args, **kwargs):
    #      super(WeiXinSpider, self).__init__(*args, **kwargs)

  # request需要封装成SplashRequest
    def start_requests(self):
        # text/html; charset=utf-8
        for url in self.start_urls:
            yield SplashRequest(url
                                , self.parse
                                , args={'wait': '0.5'}
                                # ,endpoint='render.json'
                                )
        pass

    def parse(self, response):
        print "############"+response._url

        fo = open("html.txt", "wb")
        fo.write(response.body);  # 写入文件
        fo.close();
        #本文只抓取一个京东链接,此链接为京东商品页面,价格参数是ajax生成的。会把页面渲染后的html存在html.txt
        #如果想一直抓取可以使用CrawlSpider,或者把下面的注释去掉
        '''site = Selector(response)
        links = site.xpath('//a/@href')
        for link in links:
            linkstr=link.extract()
            print "*****"+linkstr
            yield SplashRequest(linkstr, callback=self.parse)'''



优秀的个人博客,低调大师

微信关注我们

原文链接:https://yq.aliyun.com/articles/69874

转载内容版权归作者及来源网站所有!

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。

相关文章

发表评论

资源下载

更多资源
优质分享Android(本站安卓app)

优质分享Android(本站安卓app)

近一个月的开发和优化,本站点的第一个app全新上线。该app采用极致压缩,本体才4.36MB。系统里面做了大量数据访问、缓存优化。方便用户在手机上查看文章。后续会推出HarmonyOS的适配版本。

Mario,低调大师唯一一个Java游戏作品

Mario,低调大师唯一一个Java游戏作品

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Oracle Database,又名Oracle RDBMS

Oracle Database,又名Oracle RDBMS

Oracle Database,又名Oracle RDBMS,或简称Oracle。是甲骨文公司的一款关系数据库管理系统。它是在数据库领域一直处于领先地位的产品。可以说Oracle数据库系统是目前世界上流行的关系数据库管理系统,系统可移植性好、使用方便、功能强,适用于各类大、中、小、微机环境。它是一种高效率、可靠性好的、适应高吞吐量的数据库方案。

Sublime Text 一个代码编辑器

Sublime Text 一个代码编辑器

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。