在使用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