【爬虫知识】年少不知splash好,错把selenium当成宝

过往与回忆

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,然后,使用这个指令

docker run -d -p 8050:8050 scrapinghub/splash

这里面,8050是splash默认使用的端口,当然你也可以改,不过如果你不会改,就先不要改

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

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

如何发送get请求

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

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

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

import requests

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

# 好消息,我们不再需要在这里设置headers了
# 因为我们的requests请求的是splash
# splash请求的才是真正的地址
r = requests.get(url)
print(r.text)

这里肯定有小伙伴有疑问,反正都要使用requests,那我干嘛还要通过splash去请求呢?直接使用requests请求不就好了吗?不对哦,这是不一样的,splash是可以渲染加载js的,也就是说,我们通过render.html去访问以后,得到的就是动态页面了,这个和selenium的结果是一样的

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

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

如何发送post请求

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

import requests

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

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

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

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

    # post请求的请求体
    "body": "name=sagegrass"
}

r = requests.post("http://localhost:8050/render.html", json=data)
print(r.text)

使用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有用!


由于本文并没有提及如何操作splash,与页面进行交互,所以说,需要了解这方面知识的小伙伴,可以查阅一下相关的资料。或者关注我,等我出下一期的爬虫知识,也许就会更新splash的使用了呢!我是仙草哥哥,那我们就下期再见啦!

来源:仙草哥哥

物联沃分享整理
物联沃-IOTWORD物联网 » 【爬虫知识】年少不知splash好,错把selenium当成宝

发表评论