51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 904|回复: 0
打印 上一主题 下一主题

[资料] 知道splash爬虫工具后,selenium就是一个渣渣!

[复制链接]
  • TA的每日心情
    无聊
    6 天前
  • 签到天数: 77 天

    连续签到: 1 天

    [LV.6]测试旅长

    跳转到指定楼层
    1#
    发表于 2022-8-19 15:48:42 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    过往与回忆
    splash有用吗

    前两天,我做了程序通过splash爬取高温预警,其中使用到了splash。有一个学习爬虫的小伙伴看到了以后,就问我说,“仙草哥哥,我之前在培训班上课的时候,没有教splash,只教了selenium,所以我不会这个。请问,splash有用吗?“

    听到这位小伙伴的灵魂发问,我非常感动,不禁热泪盈眶,仿若我又看到了从前的时光……
    splash没用
    几年前,我第一次接触splash的时候,匆匆了解了一下,就给出了判断,splash没用!

    为什么当时的我会这么想呢?因为那个时候我致力于解决一个问题,如何应对爬虫的反反爬。那个时候已经出现了很多没办法直接使用selenium解决的问题,我寄希望于使用新的技术,可以改善这一状况,但是在splash的尝试中,我发现不能通过selenium爬的网站,基本上肯定也没办法通过splash爬取,于是我非常的失望

    “既然没有办法对反爬有贡献,那就是说这个完全没用咯!反正splash能做的事情,通过selenium都能做,那我还何必浪费时间使用splash呢?这个没用!“

    当时的我,就给出了这样一个判断,甚至在后来得知使用splash做异步的爬虫,效率更高的时候,我仍然武断的认为没用,“我可以加机器,我不在乎这个。”

    现在看来,当时的我无疑是很幼稚的,只能说,“年少不知splash好,错把selenium当成宝。“

    如果上天再给我一次机会,我一定要大声说,”splash,有用!“

    splash使用
    环境配置

    如果你真的要配置一个splash的运行环境,这无疑是很麻烦的,因为需要很多的依赖,所以甚至连splash的作者都没办法肯定,你要如何操作,才能一定运行成功

    不过好在,我们可以使用docker技术,通过docker运行起来一个splash是非常容易的。当然啦,你需要稍微学习一下docker的使用,我并不会在本文教学如何使用docker,如果你还不会的话,最好查查其他资料

    首先,毫无疑问是安装docker,然后,使用这个指令
    1. <font size="3">docker run -d -p 8050:8050 scrapinghub/splash</font>
    复制代码
    这里面,8050是splash默认使用的端口,当然你也可以改,不过如果你不会改,就先不要改

    至于scrapinghub/splash是splash官方提供的docker镜像的地址,反正用这个就对了

    总之,如果你做的还不错的话,现在splash就已经成功在本机搭建好了

    如何发送get请求
    我们这里就不浪费时间介绍如何打开和使用splash的页面了,就直奔主题,如何在我们的爬虫程序中使用这个

    首先,我们已经知道了刚刚splash的服务已经运行了,这个时候,它为我们提供了一个简单的web接口,我们只要去调用这个web接口,就可以获得js渲染后的页面了

    最简单,最容易使用的接口的名字叫做render.html,如果我们是在本机搭建的splash,只需要访问http://localhost:8050/render.html?url=xxx就可以实现了
    1. <font size="3">import requests

    2. # 通过render.html接口得到响应
    3. url = "http://localhost:8050/render.html?url=http://httpbin.org/get"

    4. # 好消息,我们不再需要在这里设置headers了
    5. # 因为我们的requests请求的是splash
    6. # splash请求的才是真正的地址
    7. r = requests.get(url)
    8. print(r.text)</font>
    复制代码
    这里肯定有小伙伴有疑问,反正都要使用requests,那我干嘛还要通过splash去请求呢?直接使用requests请求不就好了吗?不对哦,这是不一样的,splash是可以渲染加载js的,也就是说,我们通过render.html去访问以后,得到的就是动态页面了,这个和selenium的结果是一样的

    也许还有小伙伴想问,这是真的吗?splash加载js了吗?怎么证明?这个其实很简单,你只需要看一下我开头给出的上一期的文章就知道了。原本那个页面是无法直接通过requests爬取的,但是换成了splash,就能够完成js的渲染了

    另外,单纯是httpbin的页面也能发现不同,如果是通过requests直接发送请求,是不会补充html和body的头部标签的,从这里也能看出不同

    如何发送post请求
    众所周知,我们不能只发送get请求,也有需要发送post请求的时候嘛,那么,怎么通过render.html接口发送一个post请求呢?这里我就不详细介绍了,我把完整的代码写在下边,你照着模仿就可以学会了
    1. <font size="3">import requests

    2. url = "http://httpbin.org/post"
    3. data = {

    4.     # 指定要访问的url地址
    5.     "url": url,

    6.     # 指定请求方法为post
    7.     "http_method": "POST",

    8.     # 通过这种写法,可以修改默认的请求头
    9.     "headers": [("User-Agent", "Hi! I'm sagegrass, httpbin I love you!!!!")],

    10.     # post请求的请求体
    11.     "body": "name=sagegrass"
    12. }

    13. r = requests.post("http://localhost:8050/render.html", json=data)
    14. print(r.text)</font>
    复制代码
    使用splash的好处
    上面只介绍了如何简单的使用splash,没有介绍如何通过splash完成页面的交互。这个功能可能会稍微麻烦一点,因为操作splash的代码不是python,主要是lua,而很多做爬虫的小伙伴又对lua没什么了解,会有一点小的困难

    不过没关系,即使不谈页面的交互,仅仅是上边render.html接口的这个简单的功能,就已经能体会出splash的好处了,也就是说,只要我运行了splash的服务,就可以通过requests请求的方式,获取到js渲染后的响应,我完全不需要再启动一个浏览器了,也不需要下载一个webdriver!

    无疑,这个好处是非常巨大的!当然,可能还有小伙伴有疑问说,那不还是得启动一个splash吗?和运行webdriver有差别?当然有啦,splash的服务完全可以搭建在其他的机器上,你可以不需要放在本机上,就可以使用了。而selenium的webdriver,通常都必须要配置本机环境才可以使用,因此,使用render.html无疑是很方便的

    也就是说,我们不需要通过splash来解决反爬的问题,而是splash,当然尤其是指splash的render.html接口,非常适用于没有什么反爬,但是却非常需要js动态渲染的页面上使用。在这种情况下,使用splash有非常好的效果!这也证明了,splash有用!





    分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
    收藏收藏
    回复

    使用道具 举报

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条

    小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

    GMT+8, 2024-11-11 03:45 , Processed in 0.064831 second(s), 23 queries .

    Powered by Discuz! X3.2

    © 2001-2024 Comsenz Inc.

    快速回复 返回顶部 返回列表