用selenium模拟登录不能通过验证
js检测window.navigator.webdriver值
比如淘宝登录,当用selenium驱动浏览器,发现无法通过滑块验证,如下图
当然可以修改这个值就可以绕过去。
简单粗暴的直接赋值是不行的,如
window.navigator.webdriver = undefined
正确的写法是这样的:
Object.defineProperties(navigator, {webdriver:{get:()=>undefined}});
但有时候遇到一些网站用selenium驱动Chrome根本就打不开,即使修改window.navigator.webdriver的值也不行,如信用中国
这个时候可以试试添加excludeSwitches这个参数
from selenium.webdriver import Chrome
from selenium.webdriver import ChromeOptions
option = ChromeOptions()
option.add_experimental_option('excludeSwitches', ['enable-automation'])
driver = Chrome(options=option)
driver.get("https://www.creditchina.gov.cn/xinyongfuwu")
可以访问了,如图所示
接管已经启动的浏览器
上面的方法并不能彻底解决信用中国的反爬问题,如果把这个搜索过程做成自动化,就会发现发现,ajax不能正确请求,如图
遇到这种情况,可以先启动一个正常的浏览器,然后用程序去接管
在命令行输入
chrome.exe --remote-debugging-port=9222 --user-data-dir="C:\selenum\AutomationProfile"
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
chrome_options = Options()
chrome_options.add_experimental_option("debuggerAddress", "127.0.0.1:9222")
driver = webdriver.Chrome(chrome_options=chrome_options)
这样,浏览器就被接管过来了。这种方法可以绕过大部分针对selenium驱动浏览器的方法,然而,对信用中国并没有什么卵用
简单粗暴的方法是换个浏览器试试,比如,Firefox,信用中国就可以被绕过去了
from selenium.webdriver.firefox.options import Options
from selenium import webdriver
firefox_options = Options()
firefox_options.headless = True
driver = webdriver.Firefox(executable_path=FIREFOX_EXECUTABLE_PATH, options=firefox_options)
ip限制
短时间大量的访问ip会被加入黑名单,但这种方法容易误伤,一般过段时间就会被移出黑名单。
遇到这用情况,有钱的话可以买代理,没钱可以用免费的代理,缺点是很不稳定,当然也可以降低爬虫速度。
具体加代理的方法可以参考我的另一篇blog《python配置有权限代理解决方案》
参数签名
有时候抓api会发现api中有个签名字段,即对请求参数做一个签名,服务端收到请求后会验证签名是否有效,如网易云音乐,海拍客等网站,有的网站甚至会给返回的数据也加密,需要前端的js来解密,如中国空气质量在线监测分析平台|城市分析。对于中情况,就耐心的找出那段签名或加密的js代码,给自己的请求签名。
可以参考我的另一篇blog《破解某电商js签名api》
有时候也会浏览器端会生成一个字符串并写入cookie中,有使用次数限制,比如同花顺的K线数据接口,遇上这种情况可以简单粗暴的用selenium抓取cookie存入redis做为一个cookie池
验证码
找个打码平台,直接打码,比自己重新开发性价比高,如果遇到复杂的验证码,基本思路,划归,即把复杂的验证码处理成打码平台可以识别的样子,比如国家税务总局全国增值税发票查验平台,这个网站需要根据提示识别指定颜色的验证码,具体可以参考我的另一篇blog《选择某种颜色字母的验证码破解方法》
输入框监控
有些网站会用js监控输入按键事件,根据按键行为特征来判断人机,如亚马逊的vendor登录,破解思路是模拟敲键盘的停顿,即在每次按键后随机停顿个几百毫秒
refer监控
有的网站会根据refer的来判断当前的请求是否合法,即当前访问的页面必须由一些合理的页面跳过来,如MM131美女图片,爬这个网站的图如果访问某页的refer是从离它比较远的页面,则会返回403,比如,爬一个妹纸的第18张图片,但refer是第一张图片的地址就被禁止访问,处理办法是动态的修改refer引用。