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

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

无法模拟登录“古诗文网”,显示“提交失败,您输入的验证码有误!”在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日

悬赏问题

  • ¥100 微信小程序跑脚本授权的问题
  • ¥60 为什么使用python对地震数据进行umap降维后,数据成图会出现不连续的现象
  • ¥100 房产抖音小程序苹果搜不到安卓可以付费悬赏
  • ¥15 STM32串口接收问题
  • ¥15 腾讯IOA系统怎么在文件夹里修改办公网络的连接
  • ¥15 filenotfounderror:文件是存在的,权限也给了,但还一直报错
  • ¥15 MATLAB和mosek的求解问题
  • ¥20 修改中兴光猫sn的时候提示失败
  • ¥15 java大作业爬取网页
  • ¥15 怎么获取欧易的btc永续合约和交割合约的5m级的历史数据用来回测套利策略?