最新消息:因从typecho切换到wordpress, 由于转换导入问题,文章可能存在部分乱码或者排版问题,逐个排查修复中...

反反爬虫的一些方法记录

懒得分类 admin 1318浏览 0评论

曾有一个脚本任务,每天定期爬某个网站的数据.

某天(大概是11.07吧)突然发现脚本貌似不工作了,我需要的没有得到正常更新了.

于是到服务器上查看,手工跑了个脚本,发现提示Nginx Fobidden了.然而自己打开浏览器访问页面,又神奇能访问.后来自己重新用Selenium IDE重新录制并导出了Python脚本在自己机器上跑,仍旧是该错误.

这时我意识到应该是目标网站做了反爬虫的处理了.

使用python requests叠加fake_useragent的话,虽然不会报fobidden,但是会被重定向除了目标URL外,还额外给你叠加2个JS用来检测浏览器及行为的(反爬虫), 查看JS内容,虽然JS内容做了混淆加密.但从内容里面仍然可以看到充斥着大量关于识别浏览器,识别webdriver特征的一些代码.

而当前我用的Firefox或者Chrom自然而然带了这些webdriver信息.于是思考或者了解到一些办法:

一是否能修改当前的浏览器屏蔽掉这些信息呢? 拿源码自己编译这条路不太可行,费时间费力气,还不一定能成功.到时一堆各种编译错误就搞死人,这条路没把握 .

二是使用加上中间代理,用自己的JS去干扰对方的JS执行结果,进行处理屏蔽,防止不必要的信息返回给后端. 这个可操作性强一些.不过对我来说也有点费时.

三是尝试改用其它自动测试软件(库),比如pyppeteer,稍微测了下目标网站还是能识别到并到爬虫屏蔽.

四是我尝试改用C#来调用Webbrowser来访问页面,不料这货属于IE类的浏览器控件,访问后居然弹文件保存框.而不是Chrome或者Firefox那样是直接显示文本内容,要继续往下走的话,只能去搞C#如何屏蔽弹出的下载框默认自动保存文件了.暂且搁置.但这不妨是一个可行的办法了.

五是发现有高人提到Chrome从V63开始添加了window.navigator.webdriver属性的.那就找旧版喽.(比如提到的v62.0.3202.62版本),然后下载对应的chromedriver 即可继续愉快的玩耍了.貌似后期Chromedriver 从70.0.3538.16版本起和发布的Chrome使用共同的版本号了。而旧版的v62.0.3202.62并不能直接知道对应的Chromedriver版本。查看Chromedriver 的notes.txt能看到支持的版本。比如2.33和2.34都可以。附上2.33的地址:

https://chromedriver.storage.googleapis.com/index.html?path=2.33/

至于Chrome v62.0.3202.62版本,这里提供一个第三方网站吧:https://www.chromedownloads.net/chrome64win-stable/list_2_2.html.

为方便自己电脑写代码时测试,又不影响自己在用的最新版的Chrome,于是搞个绿色版Chrome就很必要了。也可以自己制作。这里有详细的教程:

https://github.com/xiangyuecn/Docs/blob/master/Other/%E8%87%AA%E5%B7%B1%E5%88%B6%E4%BD%9Cchrome%E4%BE%BF%E6%90%BA%E7%89%88%E5%AE%9E%E7%8E%B0%E5%A4%9A%E7%89%88%E6%9C%AC%E5%85%B1%E5%AD%98.md

于是对应的选项也很必要了。主要是 binary_location,附上一个Option 包括无头模式(headless)供参考,使用时根据 需要自行去除注释:

from selenium.webdriver.chrome.options import Options
options = Options()
options.binary_location = "c:\myproject\chromeportable\chrome.exe"
# you may need some other options
#options.add_argument('headless')
#options.add_argument('--no-sandbox')
#options.add_argument('--no-default-browser-check')
#options.add_argument('--no-first-run')
#options.add_argument('--disable-gpu')
#options.add_argument('--disable-extensions')
#options.add_argument('--disable-default-apps')
driver = webdriver.Chrome("c:\myproject\driver\chromedriver.exe",
            options=options)

转载请注明:Linc Hu » 反反爬虫的一些方法记录

发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址