#通过登录 进入到主页
#通过找登录接口 发现需要参数很多
# __VIEWSTATE:/wEPDwUKLTU5OTg0MDIwNw8WAh4TVmFsaWRhdGVSZXF1ZXN0TW9kZQIBZGQGi0FCmPHMP+KelvQVsoBoqE2Axg==
# __VIEWSTATEGENERATOR:C93BE1AE
# from:http://www.gushiwen.cn/user/collect.aspx
# email:3514247757@qq.com
# pwd:123456
# code:wszu
# denglu:登录
#__VIEWSTATE __VIEWSTATEGENERATOR code是一个可以变换的量
# 难点:(1)__VIEWSTATE __VIEWSTATEGENERATOR 一般情况下看不到的数据都是在页面的源码中
# 观察到这两个数据在页面的源码中 需要获取页面源码并解析
# (2)验证码
import requests
#登录页面的url地址
url = 'https://www.gushiwen.cn/user/login.aspx?from=http://www.gushiwen.cn/user/collect.aspx'
headers = {
'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0',
}
resp = requests.get(url=url,headers=headers)
content = resp.text
#解析页面源码 获取__VIEWSTATE __VIEWSTATEGENERATOR
from bs4 import BeautifulSoup
soup = BeautifulSoup(content,'lxml')
#获取__VIEWSTATE
viewstate = soup.select('#__VIEWSTATE')[0].attrs.get('value')
#获取__VIEWSTATEGENERATOR
viewstategenerator = 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的内容
resp_code = session.get(code_url)
#注意此时要使用二进制数据 所以不能使用text
content_code = resp_code.content
#wb模式就是将二进制数据写入文件
with open('code.jpg','wb') as fp:
fp.write(content_code)
fp.close()
#获取验证码图片之后 下载到本地 观察验证码(或者使用图片识别)
code_name = input('请输入你的验证码:')
#登录
url_post = 'https://www.gushiwen.cn/user/login.aspx?from=http%3a%2f%2fwww.gushiwen.cn%2fuser%2fcollect.aspx'
data_post = {
'__VIEWSTATE':viewstate,
'__VIEWSTATEGENERATOR':viewstategenerator,
'from':'http://www.gushiwen.cn/user/collect.aspx',
' email':'595165358@qq.com',
'pwd':'action',
' code':code_name,
'denglu':'登录'
}
#session保证和上面访问为同一个防止二维码改变
resp_post = session.post(url=url_post,headers=headers,data=data_post)
content_post = resp_post.text
with open('古诗文.html','w',encoding='utf-8') as f:
f.write(content_post)
