在使用splash中,只需要scrapy_splash.SplashRequest替代scrapy.Request提交请求即可完成JS渲染
yield SplashRequest(self.url, callback=self.parse, endpoint=‘execute‘,#Splash服务接口,执行lua脚本 args={‘lua_source‘:lua_script,#lua source ‘images‘:0,#不显示图片 ‘wait‘:3},#等待时间 cache_args=[‘lua_source‘])#缓存
Splash 可以通过 Lua 脚本执行一系列渲染操作,这样我们就可以用 Splash 来模拟浏览器的操作了,Splash Lua 基础语法如下:
function main(splash, args) # main()方法是入口,名称必须固定的,Splash默认调用这个方法 splash:go("http://www.baidu.com") # go()方法用于加载页面 splash:wait(0.5) # wait()方法用于等待指定的时间 local title = splash:evaljs("document.title") # evaljs()方法用于传入并执行JavaScript脚本,这里将执行结果赋值给title变量 return title # 返回title变量的值,结果是一个字符串:"百度一下,你就知道" end # 也可以以字典的形式返回,如 return {title=title} ,则结果为:title: "百度一下,你就知道"
selenium是浏览器测试自动化工具,很容易完成鼠标点击,翻页等动作,确定是一次只能加载一个页面,无法异步渲染页面,也就限制了selenium爬虫的抓取效率
splash可以实现异步渲染页面,可以同时渲染几个页面。缺点是在页面点击,,模拟登陆方面没有selenium灵活。
splash对象常用的属性和方法
一般而言,获取表单进行登录,或者利用cookie登录。
post_data = dict( login="812******0@qq.com", password="******", authenticity_token=authenticity_token, utf8=utf8, commit=commit, ) #表单请求 yield scrapy.FormRequest( "https://github.com/session", formdata=post_data, callback=self.after_login )
利用表单或加密登录可能会遇到验证码的问题,而使用cookie会面临时效性的问题。
一般突破反爬虫的方法:
(1)降低请求频率
(2)修改请求头
(3)禁用cookie
(4) 伪装成随机浏览器
(5)更换ip地址
原文:https://www.cnblogs.com/kongrui/p/13198980.html