常见反爬虫策略与绕过方法

信息校验型反爬

  • User-Agent反爬

    反爬:检测到请求头有python或者其他就禁止访问

    解决方法:在请求中添加正常请求头

  • Cookie反爬

    反爬:检测到cookie不符合规则或者没有cookie就禁止访问

    解决方法:请求头中加入Cookie,如果解决不了就分析js文件cookie的生成规则,自己实现cookie的规则

  • 签名验证反爬

    反爬:在访问中提交其他的参数,类似于cookie反爬

    解决方法:分析js文件,自己实现签名验证规则


动态渲染反爬

针对异步请求的网站

一般用Selenium套件渲染,可以执行常见的点击、填表、拖拽、截图等

常见的渲染工具

  • Puppeteer ( 异步渲染器 )

    import asyncio
    from pyppeteer import launch
    
    async def main():
    	# 初始化浏览器对象
    	b = await launch()
    	# 在浏览器上下文中创建新页面
    	page = await b.newPage()
    	# 打开目标页面
    	await page.goto("http://www.porters.vip/verify/sign")
    	# 点击指定按钮
    	await page.click('#fetch_button')
    	# 读取页面指定位置的文本
    	resp = await page.xpath('//*[@id="content"]')
    	text = await(await resp[0].getProperty('textContent')).jsonValue()
    	print(text)
    	# 关闭浏览器对象
    	await b.close()
    asyncio.get_event_loop().run_until_complete(main())
    
  • Selenium

    from selenium import webdriver
    
    option = webdriver.ChromeOptions()
    option.add_argument("--no-sandbox")
    option.add_argument("--handless") # 无头模式,后台运行,不弹出运行窗口
    b = webdriver.Chrome(options=option)
    b.get("https://www.baidu.com")
    b.maximize_window() # 最大化窗口
    b.save_screenshot("shot.png") # 截图保存
    element = b.find_element_by_id("s_lg_img") # 按照id查询元素
    element.screeshot("img.png") # 定点元素截图
    element.send_keys("pwd") # 填表
    element.click() # 点击元素
    script = "xxxx;"
    b.execute_script(script) # 运行js代码
    b.quit() # 关闭浏览器
    
  • Splash ( 需要学习lua脚本语言 )


文本混淆反爬

  • 图片伪装

    网页元素伪装成图片,用ocr工具识别为文本即可破解

    实例网站:

    1. http://www.porters.vip/confusion/recruit.html
    2. http://www.gxrc.com/WebPage/Company.aspx?EnterpriseID=60056
  • CSS偏移

    通过CSS样式改变文字显示效果,需要自行获取相应的css文本进行对应的分析进行破解

    实例网站:

    1. http://www.porters.vip/confusion/flight.html
    2. https://dwz.cn/d05zNKyq
  • SVG 映射

    通过加载SVG文件获取对应的文字,需要自行分析加载规则和SVG文件格式进行破解,类似于CSS偏移

    实例网站:

    1. http://www.porters.vip/confusion/food.html
    2. https://www.dianping.com/shop/14741057
  • 字体反爬

    通过加载网页自己的WOFF格式字体文件加载自己的文字,破解方法类似于映射,不过还挺复杂的

总结:文本混淆型反爬虫破解起来分析时间和金钱的成本都较高,可以通过截图相应的元素应用光学字符识别OCR识别出文本来降低成本,不过相应的运行时间会增加

常用OCR工具:pytesseract,文字识别API ( 百度、腾讯等 )


特征识别反爬

  • WebDriver 识别

    原理:识别浏览器的navigator.webdriver 属性,有true、false、undefined,如果为true则拦截

    绕过:

    # 打开网页前运行js代码
    chrome_options = webdriver.ChromeOptions()
    chrome_options.add_experimental_option("excludeSwitches",["enable-automation"])
    b = webdriver.Chrome(options=chrome_options)
    b.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument",{
    	"source":"""Object.defineProperty(navigator,"webdriver",{get: () => false,});"""
    })
    

    或者

    打开页面后运行一段JS代码

    Object.defineProperty(navigator,"webdriver",{get: () => false,});
    

    实例网站:https://login.taobao.com/member/login.jhtml

  • 浏览器特征

    原理:特征识别包括UA、platform、cookieenable、plugins、window.screen对象等

    绕过:修改对应的属性值即可

  • 爬虫特征

    原理:网站一般通过识别IP访问频率识别爬虫,若识别为爬虫会被永久封IP或者封禁一段时间后解封

    绕过:更换IP、用IP池、使用代理IP

    ps:也有可能通过token、cookie访问的频率限制爬虫,需要根据实际情况判断

  • 隐藏链接反爬

    原理:列表里隐藏链接,如果爬虫对隐藏链接发起请求了,就可以限制访问了

    绕过:检查列表里的链接


App反爬

App本质上是一个用壳保住的网页程序

想获取App访问的链接需要在电脑上挂代理

  • App反编译

    获取到的链接如果使用了签名验证的话需要对APK文件进行反编译

    工具:ApKktool 或 JADX

    目标APP可能加固了,这时需要解固才能反编译

    如果反编译出的代码很混乱说明被混淆了

  • 自动化测试 Appium / Airtest Project ( 图码混合编程 )


验证码反爬

  • 字符验证码

    字符验证码即数字和字母的混合组合

    解决方法:

    1. 使用pytesseract (效果不佳)
    2. 百度、腾讯等验证码识别API
    3. 深度学习(CNN)训练自己的识别模型
    4. 使用训练好的模型,或者别人的识别DLL接口

    CNN深度学习
    项目地址:https://www.github.com/asyncins/captcha_cnn

    训练样本生成:训练样本需要自己生成,样本分成train、test、predict三个文件夹保存到images文件夹里,并保证和discern同级目录下

    注意:用CPU训练时间较长,推荐用GPU训练

  • 计算型验证码

    实例:http://www.porters.vip/captcha/mathes.html

    解决方法:OCR识别后对字符进行处理

  • 滑动验证码 (少见)

    实例:http://www.porters.vip/captcha/sliders.html

    解决方法:定位滑块,计算需要移动的距离(单位px)然后拖动滑块移动滑块到指定距离即可

    from selenium import webdriver
    
    b = webdriver.Chrome()
    url = "http://www.porters.vip/captcha/sliders.html"
    b.get(url)
    # 定位滑块
    hover = b.find_element_by_css_selector(".hover")
    
    # 关键代码
    action = webdriver.ActionChains(b)
    action.click_and_hold(hover).perform() # 按住不松
    action.move_by_offset(340,0) # 移动横向340px,纵向0px
    action.release().perform() # 松开鼠标
    
  • 滑动拼图验证码(常见)

    实例:http://www.porters.vip/captcha/jigsaw.html

  • Canvas 验证码

    实例:http://www.porters.vip/captcha/jigsawCanvas.html

    解决:通过比对两张照片的缺口计算移动距离即可

    from PIL import Image,ImageChops
    
    a = Image.open("a.jpg")
    b = Image.open("b.jpg")
    diff = ImageChops.difference(a,b)
    diff_position = diff.getbbox()
    print(diff_position) # 结果为坐、上、右、下
    
  • 文字点选验证码

    实例:http://www.porters.vip/captcha/clicks.html

    实例样本:https://share.weiyun.com/5ptKIUg

    实例标注工具:LabelImg

    实例代码:https://www.github.com/asyncins/captcha_darknet.git

    这种验证码绕过难度较高

    本书使用深度学习的目标检测YOLO算法

    详情:https://pjreddie.com/darknet/yolo

    看不懂英文的化自行百度

爬虫相关法律

数据安全管理办法:http://www.cac.gov.cn/2019-05/28/c_1124546022.htm

君子协议:Robots.txt

本质上使用任何技术手段绕过网站上的反爬虫措施都属于违法行为

  • 0
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值