python 芝士圈留学 验证码破解 每分钟1万+数据爬虫 python
工作需求 我需要将芝士留学圈的所有案例和页面详情进行抓取,其中没有api接口,所以我们只能去获取页面数据html 然后用xpath分析,这种简单的我就不说了。当我们进行爬取的时候我们会遇到 每100页左右,会需要验证码。
对于验证这点,有些爬虫经验的人会知道,验证码的出现 无非是 因为你的ip或者headers出现了多次访问导致的。下面我们就进行破解
7万+数据 3000多页数据访问 ,详情页面7万次访问 页面4000次访问。如果每100次验证一次。根本不可能
出现验证码
看到验证码,我们要先从后到前的流程 这样才能流程通起来。
对了,做验证码破解一定要保留日志,不然看不到整个页面流程会自动刷新,
找到了这个post请求,你会发现在出现验证的时候会有个同样的url但是是get请求。好的整个逻辑通了。
这post请求有2个参数 一个是csrf 这如果你去js中找 会发现是个随机值,所以我们固定就好了。
后面的RequestVerifyForm[verifyCode]是验证的值。
那我们先模拟一次解码请求。当你把页面刷新成验证码状态。然后进行这个请求
下面展示一些 代码片
。
import requests
rq = requests.session()
#headers 和cookies用自己的就好了
params = {
'return': '/offers?page=1271',
}
data = {
'_csrf': 'oJSRwrOZF-ZwSmQU9bzzGFfXwIhIiVc1mLaBvRZOQiXGo6G4hc0gjSUSIkWQ3bx5GpW57wrdPUPb39XQLiMAVA==',
'RequestVerifyForm[verifyCode]':'kal',
}
# 解密
response = rq.post('https://www.zhishiq.com/verify-request', params=params, cookies=cookies, headers=headers, data=data)
print(response.status_code)
这样你发现你的cookie和ip 又可以进行页面抓取了。说明成功了。
再向前面推导:
1.验证码图片来源?
2.验证码如何识别?
现在我们解决第一个发现验证码图片的请求
那后面的参数 66161529989598.70892132,是在’https://www.zhishiq.com/verify-request’ 中的 get请求的html中 那这样问题就简单啦
附带代码。对了切记1.在请求验证码图片的程序中 一定要用get获取’https://www.zhishiq.com/verify-request’这个网址的headers和cookies!!切记不然出现的验证码图片就算你识别了也不能是真正意义上的破解
下面展示一些 内联代码片
。
params = {
'return': '/offers?page=1271',
}
response_id = rq.get('https://www.zhishiq.com/verify-request', params=params, cookies=cookies_1, headers=headers_1)
text = response_id.text
# print(text)
p = re.findall('src="/site/captcha\\?v=(.*?)" alt',text)
print(p[0])
#下载图片
response_png = rq.get('https://www.zhishiq.com/site/captcha?v='+str(p[0]),headers=headers_1,cookies=cookies_1).content
with open('captcha.jpg', 'wb') as f:
f.write(response_png)
# 第三方
api_post_url = "http://www.bingtop.com/ocr/upload/"
img_url = r'captcha.jpg'
with open(img_url,'rb') as pic_file:
img64=base64.b64encode(pic_file.read())
params_jm = {
"username": "%s" % '*******',
"password": "%s" % '********,
"captchaData": img64,
"captchaType": 1001
}
response = requests.post(api_post_url, data=params_jm)
dictdata=json.loads(response.text)
print(dictdata)
recognition = dictdata['data']['recognition']
print(recognition)
data = {
'_csrf': 'oJSRwrOZF-ZwSmQU9bzzGFfXwIhIiVc1mLaBvRZOQiXGo6G4hc0gjSUSIkWQ3bx5GpW57wrdPUPb39XQLiMAVA==',
'RequestVerifyForm[verifyCode]':recognition,
}
# 解密
response = rq.post('https://www.zhishiq.com/verify-request', params=params, cookies=cookies, headers=headers, data=data)
print(response.status_code)