Python-解决每次请求响应的验证码都不一样的情况

这篇具有很好参考价值的文章主要介绍了Python-解决每次请求响应的验证码都不一样的情况。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


还是书接上回,一开始只考虑了怎么破解验证码,而从没想过怎么获取,以为还是那种普通的图片,结果每次刷新返回的都不一样,而且页面源码中也没记录(可能有,但去找的话很耗时间),所以记录一下;

在网上查找了解决办法:

  1. 截取验证码(没考虑),先不说别的,截取的分辨率就会降低,还有就是我的是svg,而且我提前写的解析验证码的代码,是根据svg文件内容解析的,所以根本没考虑
    1. 100%解析svg-captcha验证码
  2. 模拟键盘右键下载(尝试过)
  3. 分析登陆,分析js(这需要一定的前端基础,还有就是不适合所有场景)推荐文章:
    1. 爬虫模拟登录学校教务系统
  4. seleniumwire(推荐)

模拟键盘右键下载

不做过多的介绍,为什么没选择这个呢?第一点也是最重要的一点就是因为,它是模拟键盘,所以自然在wind和linux系统上要写不一样的代码,要才用不同的第三方库,而不能实现跨平台,第二点就是时间,所需要的时间超过预期,毕竟调出系统的文件管理就要一定的时间。

所以下面我直接只展示在wind上怎么操作,linux将采用:‘pynput“依赖,大家可自行测试。直接看代码:

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time
from bs4 import BeautifulSoup
import re
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.keys import Keys
import win32api
import win32con
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
import pyautogui
import os

VK_CODE = {'enter': 0x0D, 'down_arrow': 0x28}


# 定义按下键盘事件
def keyDown(keyName):
    win32api.keybd_event(VK_CODE[keyName], 0, 0, 0)


# 定义松开键盘事件
def keyUp(keyName):
    win32api.keybd_event(VK_CODE[keyName], 0, win32con.KEYEVENTF_KEYUP, 0)


chrome_options = Options()
chrome_options.add_argument('‐‐headless')
chrome_options.add_argument('‐‐disable‐gpu')
path = r'C:\Program Files\Google\Chrome\Application\chrome.exe'
chrome_options.binary_location = path
driver = webdriver.Chrome(chrome_options=chrome_options)
driver.get(
    "https://image.baidu.com/search/detail?ct=503316480&z=0&ipn=d&word=%E7%BE%8E%E5%9B%BE%E7%BD%91&step_word=&hs=2&pn=1&spn=0&di=13200&pi=0&rn=1&tn=baiduimagedetail&is=0%2C0&istype=0&ie=utf-8&oe=utf-8&in=&cl=2&lm=-1&st=undefined&cs=113014737%2C3445157660&os=2351244306%2C2367448695&simid=3050896469%2C3730470527&adpicid=0&lpn=0&ln=362&fr=&fmq=1570618921319_R&fm=&ic=undefined&s=undefined&hd=undefined&latest=undefined&copyright=undefined&se=&sme=&tab=0&width=undefined&height=undefined&face=undefined&ist=&jit=&cg=&bdtype=0&oriquery=&objurl=http%3A%2F%2Fgss0.baidu.com%2F-vo3dSag_xI4khGko9WTAnF6hhy%2Fzhidao%2Fpic%2Fitem%2F0df431adcbef7609968039362cdda3cc7dd99e94.jpg&fromurl=ippr_z2C%24qAzdH3FAzdH3Fooo_z%26e3Bp7xt_z%26e3Bv54_z%26e3BvgAzdH3Fetjof-8nbml9nnclam-8nbml9nnclamdbdd_z%26e3Bip4s&gsm=&rpstart=0&rpnum=0&islist=&querylist=&force=undefined")
image = driver.find_element(by=By.XPATH, value="/html/body/div[1]/div[2]/div/div[1]/img")
# 定位图片所在的元素
action = ActionChains(driver).move_to_element(image)
# ActionChains(driver).context_click(image).perform()
action.context_click(image).perform()  # 在图片元素上执行右键单击操作
time.sleep(1)  # 防止图片未加载出来
win32api.keybd_event(86, 0, 0, 0)  # 调用按下键盘函数,为函数传入参数“86”,也就是“v”
win32api.keybd_event(86, 0, win32con.KEYEVENTF_KEYUP, 0)  # 松开键盘“V”
time.sleep(5)  # 等待一秒

keyDown('enter')  # 按下“确认”按钮
keyUp('enter')  # 松开确认按钮
time.sleep(1)  # 等待一秒
print("图片下载完成")
# 获取当前工作目录
current_directory = os.getcwd()
print(current_directory)

# 生成保存路径
filename = 'image.jpg'
save_path = os.path.join(current_directory, filename)

# 移动下载的图片到当前目录
os.rename('C:/Users/co_wb_junjie_qiu/Downloads/73a50f338271ac555a5aa87465687637287dc3ed27641-VQpYE3_fw658.webp',
          save_path)
print("图片下载完成,保存路径为:", save_path)


# pyinstaller --F main.py --add-binary "D:/tools/pyJDK/envs/pytest/DLLs*:."  --osx-bundle-identifier=com.example.yourapp main.py
# wget https://www.python.org/ftp/python/3.9.16/Python-3.9.16.tar.xz

使用此方法,必须在保存完之后调整保存路径

使用seleniumwire

seleniumwire可以理解成是对selenium的增强,婉如mybatis和mybatisplus,因为selenium无法获取请求页面的响应结果

from seleniumwire import webdriver
from selenium.webdriver.common.by import By
import time

driver = webdriver.Chrome()

driver.get('需要请求的路径')
son_div1 = driver.find_element(by=By.XPATH, value="//div[@class='user_area']/a[1]")
time.sleep(1)
son_div1.click()
response = None
for request in driver.requests:
    print(request.url)
    # 请求图片的url,获取这个请求的数据
    if request.url.startswith("图片路径"):
        print(request.url)
        response = request.response
        break

if response:
    response_body = response.body
    print(response_body)
    with open('image.svg', 'wb') as file:
        file.write(response_body)
        print("图片下载完成")

time.sleep(20)

不知道为什么,我在网上没有搜到这种使用方式,可能是我搜索的方式有问题吧,知道我直接拿seleniumwire去搜索才隐隐约约出现这种结果

寄语

珍惜眼前!文章来源地址https://www.toymoban.com/news/detail-493779.html

到了这里,关于Python-解决每次请求响应的验证码都不一样的情况的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 为什么大模型计算的时候只会利用KVcache来存放KV矩阵,Q矩阵每次不一样?

    大型神经网络计算中使用KV Cache(Key-Value缓存)的概念主要涉及于注意力机制(self-attention mechanism),通常用于Transformer架构中。KV Cache的目的是为了减少计算复杂性,提高效率,并节省计算资源。 这涉及到Transformer的推理(inference)阶段,而不是训练(training)阶段。 在Tra

    2024年04月25日
    浏览(41)
  • Jmeter-BeanShell脚本中for循环里面使用random随机数函数,每次生成的都一样

    预想的是每次循环生成的随机数不一样,但实际使用Random函数生成的是重复的。 以下是部分原代码: 生成的updateList为: [{“id”:235214718648462,“dataId”:null,“data”:6708,“type”:“number”}, {“id”:318239582208002,“dataId”:333989510397954,“data”:6708,“type”:“number”}, {“id”:33398948

    2024年01月20日
    浏览(55)
  • 接口响应时间长,前端返回请求超时解决

    1. 全局设置 axios.defaults.timeout = 时间 // 单位为毫秒 或 2. 封装的http请求 或 3. nginx默认的响应时间是60S 还需要修改nginx.conf文件 在配置的请求代理下添加 单位为秒

    2024年02月12日
    浏览(69)
  • 【Golang】Golang进阶系列教程--为什么 Go for-range 的 value 值地址每次都一样?

    循环语句是一种常用的控制结构,在 Go 语言中,除了 for 以外,还有一个 range ,可以使用 for-range 循环迭代数组、切片、字符串、map 和 channel 这些数据类型。 但是在使用 for-range 循环迭代数组和切片的时候,是很容易出错的,甚至很多老司机一不小心都会在这里

    2024年02月15日
    浏览(61)
  • Springboot调整接口响应返回时长详解(解决响应超时问题)_springboot设置请求超时时间

    1、配置Http会话超时 可以通过两种方式为Spring Boot应用程序 配置HTTP会话超时 。 1.1 application.properties中配置会话超时 最简单的方法是在你的application.properties中加入参数 server.servlet.session.timeout 。 还要注意的是, Tomcat不允许你将超时时间设置得少于60秒 。 1.2 以程序方式配置会

    2024年04月27日
    浏览(71)
  • Python发送Post请求及解析响应结果

    有时候遇到请求url中有很多参数。 1.1 示例1 accounts和pwd请到http://shop-xo.hctestedu.com/注册。 执行结果: 1.2 示例2 使用不定长参数 params,将url中需要的参数单独封装。 执行结果: 用type()查看response.text的类型,是str 执行结果: 用type()查看response.json()的类型,是dict 执行结果:

    2023年04月24日
    浏览(86)
  • HTTP 请求和响应的原理以及常见问题、解决办法

    在现代 Web 开发中,HTTP 请求和响应是最基本的通信方式。这两者是通过 HTTP 协议进行交互的,在前端和后台开发中都需要对其处理有一定的了解。我将为大家介绍 HTTP 请求和响应的处理原理以及常见问题和解决办法。 客户端向服务器发送请求,请求格式如下: 服务器接收到

    2024年02月10日
    浏览(44)
  • Python爬虫技术系列-01请求响应获取-urllib库

    参考连接: https://zhuanlan.zhihu.com/p/412408291 1.1.1 urllib简介 Urllib是python内置的一个http请求库,不需要额外的安装。只需要关注请求的链接,参数,提供了强大的解析功能 Urllib库有四个模块:request,error, parse, robotparser request:发起请求(重要) error:处理错误 parse:解析RUL或

    2024年02月07日
    浏览(48)
  • python requests.get发送Http请求响应结果乱码、Postman请求结果正常

    最近在写爬虫程序,自己复制网页http请求的url、头部,使用python requests和postman分别请求,结果使用postman发送http get请求,可以得到正常的json数据,但是使用python的requests发送则接受到乱码,response.text的内容是: response.content的内容是: 十分费解,于是网上搜索了相关内容,

    2024年01月24日
    浏览(58)
  • vue请求时间太长_接口处理请求时间过长,前台响应“服务器超时”的解决办法

    这些方法可以根据具体需求和情况进行选择和组合使用,以提高前端的用户体验和接口的性能。同时,还需要考虑服务器端的性能和网络环境,以及前后端的协作来实现最佳的用户体验。

    2024年02月09日
    浏览(63)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包