动态抓取网站之scrapy-splash

抓取动态网站除了selenium还有splash。下面介绍下splash试如何使用的。并且以中国人民银行这个网站为例来讲解

Splash JavaScript 渲染服务,是 个带有 HTTPAPI 的轻量级浏览器,同时它对接了 Python中的 Twisted QT 利用它,我们同样可以实现动态 染页面的抓取
功能介绍
利用 Splash ,我们可以实现如下功能:
口异步方式处理多个网页渲染过程;
获取渲染后的页面的源代码或截图;
通过关闭图片渲染或者使用 Adblock 规则来加快页面渲染速度;
可执行特定的 JavaScr pt 脚本;
口可通过 Lua 脚本来控制页面渲染过程;
获取渲染的详细过程并通过 HAR ( HTTP Archive )格式呈现。
安装
splash是基于docker的所以必须要安装docker。然后启动splash服务。
启动
在这里插入图片描述
启动成功后如图所示,当然也可以后台启动。 sudo docker -d run -p 8050:8050 scrapinghub/splash 一般部署都是后台一直守护进程,这样服务一直启动。
启动完成之后然后客户端访问。localhost:8050

在这里插入图片描述
因为我是再Ubuntu上运行的服务所以我在Ubuntu上直接locahost:8050就可以了。
如果我windows想要访问换下IP地址为你的服务地址就好了。
在这里插入图片描述
测试
下面输入百度的地址看看效果
在这里插入图片描述
在这里插入图片描述
splash api调用
中国人民银行这个网站如果正常请求会得到一串压缩的js代码,当然如果你js逆向做的好你也可以破解,只不过只要他的加密方式变了你也要跟着改变,而且难度较大
在这里插入图片描述
用splash的接口:
大家自行改下splash服务的ip如果是在本地启动的splash服务器就
url = ‘http://localhost:8050/render.html?url=http://www.pbc.gov.cn/goutongjiaoliu/113456/2164857/b4612a9a/index2.html&wait=5
wait是等待时间,等待加载。这里有必要设置一下,不然有可能加载不出来。

import requests
url = 'http://192.168.95.132:8050/render.html?url=http://www.pbc.gov.cn/goutongjiaoliu/113456/2164857/b4612a9a/index2.html&wait=5'
# url = 'http://www.pbc.gov.cn/goutongjiaoliu/113456/2164857/b4612a9a/index2.html'
headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36'
        }
res = requests.get(url,headers=headers)
print(res.content.decode('gbk','ignore'))

在这里插入图片描述
这么一运行是不是比去破解来的快。
scrapy-splash
说完了splash的用法我们来看看scrapy中怎么用splash
scrapy中是支持splash的中间件的
在settings文件中配置

DOWNLOADER_MIDDLEWARES:{
 'scrapy_splash.SplashCookiesMiddleware': 723,
 'scrapy_splash.SplashMiddleware': 725,
}
 'SPIDER_MIDDLEWARES': {
            'scrapy_splash.SplashDeduplicateArgsMiddleware': 100,
        },
# splash js异步渲染 地址
SPLASH_URL = 'http://127.0.0.1:8050'
# splash 去重的类 DUPEFILTER_CLASS
DUPEFILTER_CLASS = 'scrapy_splash.SplashAwareDupeFilter'
# splash Cache 存储 HTTPCACHE_STORAGE
HTTPCACHE_STORAGE = 'scrapy_splash.SplashAwareFSCacheStorage'

配置完成之后需要定义执行脚本

script = """
function main(splash, args)
  splash.images_enabled = false
  splash:set_user_agent("{ua}")
  assert(splash:go(args.url))
  assert(splash:wait(args.wait))
  return splash:html()
end""".format(
    ua="Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.157 Safari/537.36")

set_user_agent:设置浏览器的请求头
args.url :是要爬取的url
wait:等待时间
return splash:html() 返回执行完的html
请求SplashRequest方法

    def start_requests(self):
        for request_url in self.target_urls:
            yield SplashRequest(url=request_url,
                                meta={"request_url": request_url},
                                callback=self.parse,
                                endpoint='execute',
                                args={
                                    'lua_source': script,
                                    'wait': 8})

然后就可以在scrapy中定义解析规则了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值