信息校验型反爬
-
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工具识别为文本即可破解
实例网站:
- http://www.porters.vip/confusion/recruit.html
- http://www.gxrc.com/WebPage/Company.aspx?EnterpriseID=60056
-
CSS偏移
通过CSS样式改变文字显示效果,需要自行获取相应的css文本进行对应的分析进行破解
实例网站:
- http://www.porters.vip/confusion/flight.html
- https://dwz.cn/d05zNKyq
-
SVG 映射
通过加载SVG文件获取对应的文字,需要自行分析加载规则和SVG文件格式进行破解,类似于CSS偏移
实例网站:
- http://www.porters.vip/confusion/food.html
- 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 ( 图码混合编程 )
验证码反爬
-
字符验证码
字符验证码即数字和字母的混合组合
解决方法:
- 使用pytesseract (效果不佳)
- 百度、腾讯等验证码识别API
- 深度学习(CNN)训练自己的识别模型
- 使用训练好的模型,或者别人的识别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
本质上使用任何技术手段绕过网站上的反爬虫措施都属于违法行为