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日

悬赏问题

  • ¥20 西门子S7-Graph,S7-300,梯形图
  • ¥50 用易语言http 访问不了网页
  • ¥50 safari浏览器fetch提交数据后数据丢失问题
  • ¥15 matlab不知道怎么改,求解答!!
  • ¥15 永磁直线电机的电流环pi调不出来
  • ¥15 用stata实现聚类的代码
  • ¥15 请问paddlehub能支持移动端开发吗?在Android studio上该如何部署?
  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效
  • ¥15 悬赏!微信开发者工具报错,求帮改