古诗文网模拟登陆(含验证码识别)
一、
首先我们需要进如未登录页面(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)