qq_53851565 2022-04-24 17:02 采纳率: 66.7%
浏览 96
已结题

无法模拟登录“古诗文网”,显示“提交失败,您输入的验证码有误!”

无法模拟登录“古诗文网”,显示“提交失败,您输入的验证码有误!”在CSDN上找遍所有相关帖子,问题都解决不了。

img

import requests
from lxml import etree
#创建一个session对象
session = requests.Session()
#将验证码图片下载到本地
headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.75 Safari/537.36 Edg/100.0.1185.36'
    }
url = 'https://so.gushiwen.cn/user/login.aspx?from=http://so.gushiwen.cn/user/collect.aspx'
page_text = session.get(url=url,headers=headers).text
#解析验证码图片img中scr属性值
tree = etree.HTML(page_text)
code_img_src = 'https://so.gushiwen.cn/' + tree.xpath('//*[@id="imgCode"]/@src')[0]
img_data = session.get(url=code_img_src,headers=headers).content
#将验证码图片保存到了本地
with open('./code.jpg','wb') as fp:
    fp.write(img_data)


# # 验证码处理(高级)
import tesserocr
from PIL import Image

image = Image.open('code.jpg')
image = image.convert('L')  # 使用Image对象的convert()方法传入'L'参数,将图片转化为灰度图像

# # 法一:传入‘1’即可将图片进行二值化处理
# image = image.convert('1')

# 法二:将原图转化为灰度图,然后指定二值化阈值,进行二值化处理
threshold = 80
table = []
for i in range(256):
    if i < threshold:
        table.append(0)
    else:
        table.append(1)
image = image.point(table, '1')

# 验证码OCR识别
text = tesserocr.image_to_text(image)
print(text)

# 获取动态变化的请求值
__VIEWSTATE = tree.xpath('//*[@id="__VIEWSTATE"]/@value')[0]
__VIEWSTATEGENERATOR = tree.xpath('//*[@id="__VIEWSTATEGENERATOR"]/@value')[0]

login_url = 'https://so.gushiwen.cn/user/login.aspx?from=http%3a%2f%2fso.gushiwen.cn%2fuser%2fcollect.aspx'
data = {
    '__VIEWSTATE': __VIEWSTATE,
    '__VIEWSTATEGENERATOR': __VIEWSTATEGENERATOR,
    'from': 'http://so.gushiwen.cn/user/collect.aspx',
    'email': '11111111111',
    'pwd': 'qwer1234',
    'code': text,
    'denglu': '登录',
}
response = session.post(url=login_url,headers=headers,data=data)
print(response.status_code)     #用以验证,若响应值为“200”,则成功;反之,则网站数据发生变动,需修改。

login_page_text = session.post(url=login_url,headers=headers,data=data).text
with open('gushiwen.html','w',encoding='utf-8') as fp:
    fp.write(login_page_text)
我在查找CSDN上的帖子时,都说要从头到尾都用session,可是我用了仍不行。只有一个帖子,将“data”里的“code”改为“input”输入才能成功,否则一律不行。
不用input,按照我这个思路实现模拟登录。
  • 写回答

2条回答 默认 最新

  • 溪风沐雪 2022-04-24 17:18
    关注

    没太懂,既然将“data”里的“code”改为“input”输入才能成功,那么说明接口里需要的参数名就是input,你非要刚给人一个code,这对于接口来说就拿不到需要的参数,那肯定是不给过的啊

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 5月3日
  • 已采纳回答 4月25日
  • 创建了问题 4月24日

悬赏问题

  • ¥15 关于vmprotect3.8.4虚拟文件一项
  • ¥20 C#调用虚拟键盘TabTip.exe
  • ¥15 Qt4代码实现下面的界面
  • ¥15 CCS离散化传递函数与仿真不一致
  • ¥15 prism提示我reinstall prism 如何解决
  • ¥15 asp.core 权限控制怎么做,需要控制到每个方法
  • ¥20 while循环中OLED显示中断中的数据不正确
  • ¥15 这个视频里的stm32f4代码是怎么写的
  • ¥15 JNA调用DLL报堆栈溢出错误(0xC00000FD)
  • ¥15 请教SGeMs软件的使用