#模拟登录acfun
#导入第三方库
import requests
import pickle
from bs4 import BeautifulSoup
from fake_useragent import UserAgent
import re
from PIL import Image
#提交表单获取cookie
def get_cookie_from_net():
#d登录的url
url = 'http://www.acfun.cn/login.aspx'
#定义提交的表单数据
#表单结构,可以通过自己的观察来设计
payload={
'username':'账号',
'password':'密码'
}
# 绕过SSL验证、
#发送post请求
data = s.post(url, headers=headers, data=payload, verify=True)
#将请求道的cookie保存下来
with open('cookies.acfun', 'wb') as f:
cookiedict = requests.utils.dict_from_cookiejar(s.cookies)
pickle.dump(cookiedict, f)
print('提交表单登录,成功获取cookies..')
return s.cookies
# 从cookie文件获取cookie
def get_cookie_from_file():
with open('cookies.acfun', 'rb') as f:
cookiedict = pickle.load(f)
cookies = requests.utils.cookiejar_from_dict(cookiedict)
print('解析文件,成功提取cookie....')
return cookies
# 获取数据
def getData(html):
soup = BeautifulSoup(html.text, 'html.parser')
# print(soup)
#异常处理
try:
#根据需要,可以在这个位置获取登录页面后的数据
#和进行另外的操作
mydata = soup.select('.desc')[0].get_text()
except:
#获取不到判断啧进行第二次登陆尝试
#细心的话,可以进行递归判断,仿制死循环
print('再次尝试登录')
s.cookies = get_cookie_from_net()
login_and_getdata()
# 还可以继续处理其他数据
return mydata
#主要启动程序,查看是否已存在可以登录的cookie
#若存在,则直接登录
#不存在,则进行表单提交操作,获取cookie
def login_and_getdata():
print('获取cookie')
try:
s.cookies = get_cookie_from_file()
except:
print('从文件获取cookie失败。。\n正在尝试提交表单登录以获取...')
s.cookies = get_cookie_from_net()
html = s.get('这里填写登陆后可以直接访问的地址', headers=headers)
data = getData(html)
print(data)
if __name__ == "__main__":
# 全局变量
s = requests.session()
ua = UserAgent()
headers = {'User-Agent': ua.chrome}
login_and_getdata()
上述是登录A站的,貌似A站没有设置多次重复登录之类的操作过于频繁的话,需要验证码操作。因此,找到了豆瓣的网站(我发现豆瓣和12306有的一拼,都是被拿来练手的)
下面上代码:(因为和上述的操作步骤区别不大,只是针对多次登录后会出现图片验证码的问题做文章,因此详细讲解这一步,使用了PIL第三方模块的Image)
import requests
import pickle
from bs4 import BeautifulSoup
from fake_useragent import UserAgent
import re
from PIL import Image
# 提交表单获取cookie
def get_cookie_from_net():
url = 'https://accounts.douban.com/login'
#这一步需要先把豆瓣登录页面的数据获取到
login_html = s.get(url, headers=headers).text
#通过正则,获取image的地址
verif_img_url = re.findall(r'<img id="captcha_image" src="(.*?)" alt="captcha"', login_html)[0]
#获取图片的数据
verif_img_data = s.get(verif_img_url, headers=headers).content
#二进制写入下来
with open('douban.jpg', 'wb') as f:
f.write(verif_img_data)
# 手动输入验证码
#使用Image的open和_show方法,打开保存的图片
img = Image.open('douban.jpg')
Image._show(img)
captha_img = str(input("输入验证码:"))
# 云打码
#网上也有云打码这方面的,需要和第三方平台做交互,这就不做演示了
# print('利用云打码获取识别码。。。。')
# captha_img = getcode_from_yundama()
# 获取captcha-id
#print(login_html)
#当豆瓣登录页面出现验证码的时候,实有图片的id值的,只需要获取,然后拼接在登录表单里即可
captha_id = re.findall(r'name="captcha-id" value="(.*?)"/>', login_html)[0]
print('captcha_id:', captha_id)
# 构建表单
payload = {'source': 'None',
'redir': 'https://www.douban.com',
'form_email': '登录账号',
'form_password': '登录密码',
'login': '登录',
'captcha-solution': captha_img,
'captcha-id': str(captha_id)
}
# 绕过SSL验证
data = s.post(url, headers=headers, data=payload, verify=True)
with open('cookies.douban', 'wb') as f:
cookiedict = requests.utils.dict_from_cookiejar(s.cookies)
pickle.dump(cookiedict, f)
print('提交表单登录,成功获取cookies..')
return s.cookies
# 从cookie文件获取cookie
def get_cookie_from_file():
with open('cookies.douban', 'rb') as f:
cookiedict = pickle.load(f)
cookies = requests.utils.cookiejar_from_dict(cookiedict)
print('解析文件,成功提取cookie....')
return cookies
# 获取数据
def getData(html):
soup = BeautifulSoup(html.text, 'html.parser')
# print(soup)
try:
#这里只是获取了登陆成功页面的个人签名数据
#若要获取更多,可以另行操作。都是基础操作
mydata = soup.select('#display')[0].get_text()
except:
s.cookies = get_cookie_from_net()
login_and_getdata()
# 还可以继续处理其他数据
return mydata
def login_and_getdata():
print('获取cookie')
try:
s.cookies = get_cookie_from_file()
except:
print('从文件获取cookie失败。。\n正在尝试提交表单登录以获取...')
s.cookies = get_cookie_from_net()
html = s.get('https://www.douban.com/people/181618569/', headers=headers)
data = getData(html)
print(data)
if __name__ == "__main__":
# 全局变量
s = requests.session()
ua = UserAgent()
headers = {'User-Agent': ua.chrome}
# print(headers)
login_and_getdata()