曾有一个脚本任务,每天定期爬某个网站的数据.
某天(大概是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就很必要了。也可以自己制作。这里有详细的教程:
于是对应的选项也很必要了。主要是 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 » 反反爬虫的一些方法记录