• Scrapy爬取动态内容(一)Splash方案


    一、方案:
    之前我们学习的内容都是抓取静态页面,每次请求,它的网页全部信息将会一次呈现出来。 但是,像比如一些购物网站,他们的商品信息都是js加载出来的,并且会有ajax异步加载。像这样的情况,直接使用scrapy的Request请求是拿不到我们想要的信息的,解决的方法就是使用selenium或者scrapy-splash。
     
    差别:
    selenium是浏览器测试自动化工具,很容易完成鼠标点击,翻页等动作,缺点是一次只能加载一个页面,无法异步渲染页面,也就限制了selenium爬虫的抓取效率。
    splash可以实现异步渲染页面,可以同时渲染几个页面。缺点是在页面点击,,模拟登陆方面没有selenium灵活。
     
    最初选用了splash作为解决方案。
    经过一圈折腾,感觉使用splash的成本有点高,又回到了Selenium方案上来。
     
    二、Scrapy-splash环境
     
    1、安装docker
    参考本地文章《Docker学习》,Mac下双击运行Docker Quickstart Terminal确认安装完成。
      
    2、安装splash
    (1) 拉取镜像:
    mac需要双击运行Docker Quickstart Terminal
     
    输入以下内容
    docker pull scrapinghub/splash
     
    (2) 启动Splash
    docker run -d -p 123.56.71.2:8050:8050 scrapinghub/splash
    docker run --name splash -d -p 8050:8050 scrapinghub/splash
    docker run -d -p 8050:8050 scrapinghub/splash
    docker run -d -p 123.56.71.2:8050:8050 scrapinghub/splash
     
    这个命令就是在计算机的123.56.71.2:8050端口启动Splash渲染服务,转发到容器8050端口,-d表示在后台运行
    也可以加—name指定容器名称
     
    Docker操作
    systemctl enable/start/restart/stop  docker
     
    容器操作
    docker ps 查看当前启动的容器
    docker stop/kill 容器ID或容器名
    docker restart 容器ID或容器名
     
    如果端口或网络访问有问题,可以先重启容器然后再启动Splash
     
    (3)打开浏览器,输入123.56.71.2:8050会看到首界面。可以在输入框输入任意的网址,点击后面的Render me! 来查看渲染之后的样子。
     
    三、集成到Scrapy中
     
    1、安装scrapy-splash
    pip install scrapy-splash
     
    2、使用
    参考文章
     
    Splash是通过Lua脚本来控制了页面的加载过程, 加载过程完全模拟浏览器,可以执行某些特定js脚本或者方法
     
    Scrapy-splash的设置
    scrapy-splash的请求头和代理参数设置
     
    这里发现一个问题,就是SplashRequest只能等待固定的时长,不能根据需要的内容是否已经记载完成来判断。
    发现一个解决方案:准备继续深入研究
    splash 实现类似selenium的WebDriverWait
     
    最终之所以放弃Splash方案,是因为这种的解析效率太低了,有时候一个网页需要十几秒才能结束等待,所以最终不得不放弃。
  • 相关阅读:
    IN字段查询多少个值最合适?
    程序员交流禁忌之一: 为什么不
    C++11新特性
    用haskell写brainfuck解释器
    数理逻辑02 推演系统
    计算方法1 函数求根
    数理逻辑03 一阶逻辑
    Ubuntu下的数电实验环境配置
    博弈论1 纳什均衡
    数理逻辑习题乱做
  • 原文地址:https://www.cnblogs.com/mazhiyong/p/12605857.html
Copyright © 2020-2023  润新知