目录
一、学习资源
二、分析
1、先找登录口,也就是什么情况下允许登录。
2、打开网页源码找参数
3、获取图片验证码
4、登录 (有坑)
5、成功登录
三、项目源码
一、学习资源
二、分析
1、先找登录口,也就是什么情况下允许登录。
首先打开古诗文网站的官网,先检查网页(F12或者右键点击检查)然后登录,此时输入错误的密码(切记),不是要真正的登录进去,而是为了找登陆口。通过找登陆接口(login)发现,登录的时候需要的参数有很多。#观察到 __VIEWSTATE, __VIEWSTATEGENERATOR ,code 三个是一个可以变化的量。
2、打开网页源码找参数
观察到这两个数据在页面的源码中 所以我们需要获取页面的源码 然后进行解析就可以获取了
3、获取图片验证码
4、登录 (有坑)
此时登录所需要的数据全部获取到了,接下来就是登录了
此时登录时发现验证码是错误的,因为第一次请求下载图片和下一次返回的信息的验证码不是一个了,相当于动态的验证码已经换了一个了,但是下载的是前一个。
5、成功登录
此时有个小问题,当程序运行的时候,左边的图片加载没那么快,稍微等会就可以了或者去到本地文件中去看
三、项目源码
# coding=utf-8
#通过登录 然后进入到主页面
#(1)先找登录接口,也就是什么情况下才允许登录
#(2)通过找登录接口(login)发现,登录的时候需要的参数很多
# __VIEWSTATE: eVgBnMThU95H2Pnl+vX1f9AtwKsdvG99QKbMzfVZkHrYs5+4t+83zenZVqGsl6OIio5aS2fojk1glAHlUuvNmBw0hw3MnKMSWrQV7jGNj0MJo6Cam0SUg+TW454=
# __VIEWSTATEGENERATOR: C93BE1AE
# from: http://so.gushiwen.cn/user/collect.aspx
# email: 595165358@qq.com #用户名
# pwd: action #密码
# code: B3FP #验证码
# denglu: 登录
#观察到 __VIEWSTATE __VIEWSTATEGENERATOR code 三个是一个可以变化的量
#难点:(1)__VIEWSTATE __VIEWSTATEGENERATOR 一般情况下看不到的数据都是在页面的源码中(隐藏域)
# 观察到这两个数据在页面的源码中 所以我们需要获取页面的源码 然后进行解析就可以获取了
# (2)验证码
import requests
#这是登录页面的url地址
url = 'https://so.gushiwen.cn/user/login.aspx?from=http://so.gushiwen.cn/user/collect.aspx'
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36"
}
#获取页面的源码
response = requests.get(url=url,headers=headers)
content = response.text
#输出内容看有没有需要的数据,判断有没有反爬
# print(content)
#解析页面源码,获取__VIEWSTATE __VIEWSTATEGENERATOR
from bs4 import BeautifulSoup
soup = BeautifulSoup(content,'lxml')
#获取__VIEWSTATE
viewsdate = soup.select('#__VIEWSTATE')[0].attrs.get('value')#返回的是个列表
#获取__VIEWSTATEGENERATOR
viewsdategenerator = soup.select('#__VIEWSTATEGENERATOR')[0].attrs.get('value')
#获取验证码图片
code = soup.select('#imgCode')[0].attrs.get('src')
code_url = 'https://so.gushiwen.cn' + code
# #有坑
# import urllib.request
# urllib.request.urlretrieve(url=code_url,filename='code.jpg')
#requests里面有一个方法 session() 通过session的返回值 就能使用请求变成一个对象
session = requests.session()
#验证码url的内容
response_code = session.get(code_url)
#注意 此时要使用二进制数据 因为我们要使用的是图片的下载
content_code = response_code.content
#wb的模式就是将二进制数据写入到文件
with open('code1.jpg','wb') as fp:
fp.write(content_code)
#获取了验证码的图片之后,然后下载到本地 然后观察验证码 观察之后 然后在控制台输入这个验证码 就可以将这个值给
#code的参数 就可以登录
code_name = input('请输入你的验证码')
#点击登录
url_post = 'https://so.gushiwen.cn/user/login.aspx?from=http%3a%2f%2fso.gushiwen.cn%2fuser%2fcollect.aspx'
data_post = {
'__VIEWSTATE': viewsdate,
'__VIEWSTATEGENERATOR': viewsdategenerator,
'from': 'http://so.gushiwen.cn/user/collect.aspx',
'email': '17671886917' , #用户名
'pwd': '123456789', #密码
'code': code_name , #验证码
'denglu': '登录'
}
response_post = session.post(url=url,headers=headers,data = data_post)
content_post = response_post.text
with open('gushiwen.html','w',encoding='utf-8') as fp:
fp.write(content_post)
#难点
#(1)隐藏域
#(2)验证码