108 lines
3.0 KiB
Python
108 lines
3.0 KiB
Python
#!/usr/bin/env python3
|
|
# -*- coding: utf-8 -*-
|
|
|
|
'''
|
|
Required
|
|
- requests (必须)
|
|
- bs4 (必选)
|
|
- pillow (可选)
|
|
'''
|
|
|
|
from urllib.request import urlretrieve
|
|
import requests
|
|
from bs4 import BeautifulSoup
|
|
from os import remove
|
|
|
|
try:
|
|
import cookielib
|
|
except:
|
|
import http.cookiejar as cookielib
|
|
try:
|
|
from PIL import Image
|
|
except:
|
|
pass
|
|
|
|
url = 'https://accounts.douban.com/login'
|
|
|
|
datas = {'source': 'index_nav',
|
|
'remember': 'on'}
|
|
|
|
headers = {'Host': 'www.douban.com',
|
|
'Referer': 'https://www.douban.com/',
|
|
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:55.0) Gecko/20100101 Firefox/55.0',
|
|
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
|
|
'Accept-Language': 'zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3',
|
|
'Accept-Encoding': 'gzip, deflate, br'}
|
|
|
|
# 尝试使用cookie信息
|
|
session = requests.session()
|
|
session.cookies = cookielib.LWPCookieJar(filename='cookies')
|
|
try:
|
|
session.cookies.load(ignore_discard=True)
|
|
except:
|
|
print("Cookies未能加载")
|
|
# cookies加载不成功,则输入账号密码信息
|
|
datas['form_email'] = input('Please input your account:')
|
|
datas['form_password'] = input('Please input your password:')
|
|
|
|
|
|
def get_captcha():
|
|
'''
|
|
获取验证码及其ID
|
|
'''
|
|
r = requests.post(url, data=datas, headers=headers)
|
|
page = r.text
|
|
soup = BeautifulSoup(page, "html.parser")
|
|
# 利用bs4获得验证码图片地址
|
|
img_src = soup.find('img', {'id': 'captcha_image'}).get('src')
|
|
urlretrieve(img_src, 'captcha.jpg')
|
|
try:
|
|
im = Image.open('captcha.jpg')
|
|
im.show()
|
|
im.close()
|
|
except:
|
|
print('到本地目录打开captcha.jpg获取验证码')
|
|
finally:
|
|
captcha = input('please input the captcha:')
|
|
remove('captcha.jpg')
|
|
captcha_id = soup.find(
|
|
'input', {'type': 'hidden', 'name': 'captcha-id'}).get('value')
|
|
return captcha, captcha_id
|
|
|
|
|
|
def isLogin():
|
|
'''
|
|
通过查看用户个人账户信息来判断是否已经登录
|
|
'''
|
|
url = "https://www.douban.com/accounts/"
|
|
login_code = session.get(url, headers=headers,
|
|
allow_redirects=False).status_code
|
|
if login_code == 200:
|
|
return True
|
|
else:
|
|
return False
|
|
|
|
|
|
def login():
|
|
captcha, captcha_id = get_captcha()
|
|
# 增加表数据
|
|
datas['captcha-solution'] = captcha
|
|
datas['captcha-id'] = captcha_id
|
|
login_page = session.post(url, data=datas, headers=headers)
|
|
page = login_page.text
|
|
soup = BeautifulSoup(page, "html.parser")
|
|
result = soup.findAll('div', attrs={'class': 'title'})
|
|
# 进入豆瓣登陆后页面,打印热门内容
|
|
for item in result:
|
|
print(item.find('a').get_text())
|
|
# 保存 cookies 到文件,
|
|
# 下次可以使用 cookie 直接登录,不需要输入账号和密码
|
|
session.cookies.save()
|
|
|
|
|
|
if __name__ == '__main__':
|
|
if isLogin():
|
|
print('Login successfully')
|
|
else:
|
|
login()
|