wjx-2005-07-01  

古诗文网模拟登陆(含验证码识别)

一、

首先我们需要进如未登录页面(https://so.gushiwen.cn/user/login.aspx?from=http://so.gushiwen.cn/user/collect.aspx)

url = 'https://so.gushiwen.cn/user/login.aspx?from=http://so.gushiwen.cn/user/collect.aspx'

获得以上内容(注意:需要自己先登录)

二、

这里我们需要自己在网上使用一些API获取图片验证码的内容,我使用的是超级鹰平台。

以下是获取图片验证码内容的代码

	    response = self.session.get(url=self.start_url,headers=self.headers)
        lxml = etree.HTML(response.text)
        #获取图片验证码的内容
        img_src = 'https://so.gushiwen.cn' + lxml.xpath('//img[@id="imgCode"]/@src')[0]
        img_data = self.session.get(url=img_src,headers=self.headers).content
        with open('image.jpg','wb') as f:
            f.write(img_data)
        #下面的问号内容需要填自己的,这里我改了一下,大家注意
        chaojiying = Chaojiying_Client('?????', '??????', '?????')  # 用户中心>>软件ID 生成一个替换 96001
        im = open('image.jpg', 'rb').read()  # 本地图片文件路径 来替换 a.jpg 有时WIN系统须要//
        result = chaojiying.PostPic(im, 1004)
        return result['pic_str']

大家可以发现这里使用了session保持会话,因为验证码会刷新,所以直接使用request请求会导致验证码错误。

三、

因为登录是一个POST请求,我们需要将自己填写的内容作为信息传给浏览器,大家可以先尝试一登录后,右击检查,然后选择NetWork,然后刷新界面,(我是用的是google浏览器),然后会发现一个下面的文件。

这里又是一个URL,这个是登录的URL,大家也可以尝试一下验证码错误,就会发现下面的图片的code内容是空的,此时我们的正常页面也显示不出来。

然后选择Payload,图片为:

以上信息就是我们作为POST请求需要传入的信息

data = {
            '__VIEWSTATE': 'r5bZftSiPvANK8iE6QXSHx / JRmAoxtTy0PuLHUCmGwvcDQ1Vty0vHPYC5DbuwuM + 5GNPEEkLtwZwHjawdhbtxgKwt9dB + a5yWfSIP5PTd0HSlIstBBUKo3 / KaDEbDfprad3ZDnlkaFmP5fKuuJwokEyPJYE =',
            '__VIEWSTATEGENERATOR': 'C93BE1AE',
            'from': 'http: // so.gushiwen.cn / user / collect.aspx',
            'email': '?????',
            'pwd': '??????',
            'code':imgCode,
            'denglu': '登录'
        }

完整代码展示:

#这个是平台自己写的代码,我们可以直接获得包,放入文件里用就行
from chaojiying_Python.chaojiying import Chaojiying_Client
import requests
from lxml import etree
from UA_info import ua_list
import random
class GushiSpider(object):
    def __init__(self):
        #这个是开始的URL,目的是获取图片验证码信息
        self.start_url = 'https://so.gushiwen.cn/user/login.aspx?from=http://so.gushiwen.cn/user/collect.aspx'
        self.headers = {
            'User-Agent': random.choice(ua_list)
        }
        #使用session保持会话,维持一开始的内容
        self.session = requests.Session()
        #这个是登录的URL,我们可以发现这是POST请求,所以需要传入一些信息
        self.end_url = 'https://so.gushiwen.cn/user/login.aspx?from=http%3a%2f%2fso.gushiwen.cn%2fuser%2fcollect.aspx'
    def get_img(self):
        response = self.session.get(url=self.start_url,headers=self.headers)
        #将网页信息转换为可以使用xpath语法解析的代码
        lxml = etree.HTML(response.text)
        #使用解析语法解析代码,并进行网页URL拼接
        img_src = 'https://so.gushiwen.cn' + lxml.xpath('//img[@id="imgCode"]/@src')[0]
        #获取图片验证码的信息
        img_data = self.session.get(url=img_src,headers=self.headers).content
        with open('image.jpg','wb') as f:
            f.write(img_data)
        #使用超级鹰代码对验证码进行解析,获取验证码的内容
        chaojiying = Chaojiying_Client('????', '?????', '?????')  # 用户中心>>软件ID 生成一个替换 96001
        im = open('image.jpg', 'rb').read()  # 本地图片文件路径 来替换 a.jpg 有时WIN系统须要//
        result = chaojiying.PostPic(im, 1004)
        return result['pic_str']
    def Login_Gushi(self,imgCode):
        data = {
            '__VIEWSTATE': 'r5bZftSiPvANK8iE6QXSHx / JRmAoxtTy0PuLHUCmGwvcDQ1Vty0vHPYC5DbuwuM + 5GNPEEkLtwZwHjawdhbtxgKwt9dB + a5yWfSIP5PTd0HSlIstBBUKo3 / KaDEbDfprad3ZDnlkaFmP5fKuuJwokEyPJYE =',
            '__VIEWSTATEGENERATOR': 'C93BE1AE',
            'from': 'http: // so.gushiwen.cn / user / collect.aspx',
            'email': '?????',
            'pwd': '??????',
            #将获取的验证码传入信息中
            'code':imgCode,
            'denglu': '登录'
        }
        #使用POST请求传入信息
        response = self.session.post(url=self.end_url,data=data,headers=self.headers)
        #响应登录后的界面
        print(response.text)
if __name__ == '__main__':
    gushi = GushiSpider()
    imgcode = gushi.get_img()
    gushi.Login_Gushi(imgcode)
posted on 2024-01-29 12:16  星辰与Python  阅读(54)  评论(1编辑  收藏  举报