验证码

关于验证码的几种解决思路中,可以选择使用cookie来处理问题,

具体的处理方式是在DOWNLOADER_MIDDLEWARES中添加一个类,让他的处理的数字较大,

然后创建这个类,写process_response方法,判断一下是否出现了验证码,如果出现了验证码,保存下cookies

 

但其实最不清楚的就是池子里是如何有cookie的,可能是先手动获取cookie,然后

从池子里获取ip、端口号、cookie

我自己的使用session的方式

import requests

requests.session()

# 设置头UA
headers = {
  "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36 Edg/96.0.1054.62"
}

targetURL = 'https://www.baidu.com'

# 开启一个session会话
session = requests.session()

# 设置请求头信息
session.headers = headers

# 申明一个用于存储手动cookies的字典
manual_cookies = {}

##打开手动设置的cookies文件
# 部分网站需要滑动验证,这里通过浏览器登录成功后获取cookies手动存到文本来绕过验证,后续cookies自动更新
with open("manual_cookies.txt", 'r', encoding='utf-8') as frcookie:
  cookies_txt = frcookie.read().strip(';') # 读取文本内容
  print(f'cookies_txt:{cookies_txt}')
  # 手动分割添加cookie
  for item in cookies_txt.split(';'):
      name, value = item.strip().split('=', 1) # 用=号分割,分割1次
      manual_cookies[name] = value # 为字典cookies添加内容

# 将字典转为CookieJar:
cookiesJar = requests.utils.cookiejar_from_dict(manual_cookies, cookiejar=None, overwrite=True)

# 将cookiesJar赋值给会话
session.cookies = cookiesJar

# 向目标网站发起请求
res = session.get(targetURL)

# 将CookieJar转为字典:
res_cookies_dic = requests.utils.dict_from_cookiejar(res.cookies)

# 将新的cookies信息更新到手动cookies字典
for k in res_cookies_dic.keys():
  manual_cookies[k] = res_cookies_dic[k]

print(manual_cookies)

# 重新将新的cookies信息写回文本
res_manual_cookies_txt = ""

# 将更新后的cookies写入到文本
for k in manual_cookies.keys():
  res_manual_cookies_txt += k + "=" + manual_cookies[k] + ";"

# 将新的cookies写入到文本中更新原来的cookies
with open('manual_cookies.txt', "w", encoding="utf-8") as fwcookie:
  fwcookie.write(res_manual_cookies_txt)

 

如何绕过验证码方式总结

1、绕过验证码。跳过验证码直接访问需要的页面内容。 2、请求头中自带验证码。有些网站的验证码会在前台 js 校验。服务器生成的验证码会在请求头中。可以获取请求头,并把验证码解析出来。 3、session 不刷新。有的网站验证码验证成功后,直接获取请求资源。(忘记了刷新 cookie 对应的验证码)可以预先设定一个 cookie 和验证码。利用这个漏洞访问网站。 对于多线程无法控制以及有些网站验证码定期不访问失效问题。可以添加一个定时访问程序来 解决 。 4、利用第三方插件。对于有些网站验证码比较简单。只含阿拉伯数字和英文字母。可以用第三 方的插件来识别。例如:tess4j、tesseract 。 5、有些网站的验证码是从库中随机取出一个来的。对于这类静态的验证码。可以自己建立一个验证码静态库。自己建立好图片和验证码答案的链接。采用 map 的映射方法就可以进行识别。

 

js中如何去检查是否有人打开了F12进行恶意调试

setInterval(function() {
check()
}, 4000);
var check = function() {
function doCheck(a) {
  if (("" + a/a)["length"] !== 1 || a % 20 === 0) {
    (function() {}
    ["constructor"]("debugger")())
  } else {
    (function() {}
    ["constructor"]("debugger")())
  }
  doCheck(++a)
}
try {
  doCheck(0)
} catch (err) {}
};
check();

滑动验证码,不同于极验证,本验证码难度略低,需要的将滑块拖动到矩形区域右侧即可完成。

这类验证码不常见了,官方介绍地址为:https://promotion.aliyun.com/ntms/act/captchaIntroAndDemo.html

使用起来肯定是非常安全的了,不是很好通过机器检测

如何判断验证码类型

这个验证码的标识一般比较明显,在页面源码中一般存在一个 nc.js 基本可以判定是阿里云的验证码了

<script type="text/javascript" src="//g.alicdn.com/sd/ncpc/nc.js?t=1552906749855"></script>

识别套路

截止到2019年3月18日,本验证码加入了大量的selenium关键字验证,所以单纯的模拟拖拽被反爬的概率满高的,你也知道一般情况爬虫具备时效性 不确保这种手段过一段时间还可以使用!

导入selenium必备的一些模块与方法


from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
# from selenium.webdriver.support import expected_conditions as EC
# from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.options import Options
from selenium.webdriver import ActionChains
import time
import random

在启动selenium之前必须要设置一个本机的代理,进行基本的反[反爬] 处理,很多爬虫在获取用户指纹的时候,都比较喜欢selenium,因为使用selenium模拟浏览器进行数据抓取,能够绕过客户JS加密,绕过爬虫检测,绕过签名机制

但是selenium越来越多的被各种网站进行了相关屏蔽,因为selenium在运行的时候会暴露出一些预定义的Javascript变量(特征字符串),例如"window.navigator.webdriver",在非selenium环境下其值为undefined,而在selenium环境下,其值为true(我验证了,还真是!)

pip install mitmproxy

安装mitmproxy软件也不是一件简单的事,但是在这里就不赘述了!

仅仅使用代理ip用selenium就行,但是如果你想拦截一些信息,或是发送自己修改的内容就要用到mitmproxy了!

处理短信验证码就简单的多了,然而可能也是费钱,不划算!

使用短信验证码接码平台,如果用免费的,容易很快失效,因为这个平台是免费的,你知道,别人也可以知道!

 
posted @ 2022-08-09 09:15  peanut321  阅读(45)  评论(0编辑  收藏  举报