【本代码可直接顺序复制粘贴,并用cmd运行。注意:https不要写成http】
先查看一下登录所需的信息。登录页面https://accounts.douban.com/login
按[F12]打开网页源代码 - 按[F8]寻找redir - 可将redir的value值设为你想跳转的页面。
我设为http://movie.douban.com/mine?status=collect,跳转到我的账户信息(方便检查登录是否成功)
手动登录后,跳转到账户界面,如下:
按[F12],打开如下界面:
(1)查看[Network] - [login] - [From Data]里面的信息,这就是我们要从代码中提交的信息。
(2)其中[User-Agent]信息为headers中的信息。
代码:
1.配置环境:coding,packages,headers(cookies不需要设置)
# coding: utf-8
import urllib.request
import pandas as pd
from bs4 import BeautifulSoup
from bs4 import UnicodeDammit
import urllib.parse
import requests
import re
from urllib.request import urlretrieve
#根据自己的浏览器设置
headers = {"User-Agent":'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.134 Safari/537.36'}
4.两种登录模式:需要验证码和不需要验证码
(1)不需要验证码,输入用户名和密码后,将会自动跳转到个人账户界面
loginUrl = 'https://accounts.douban.com/login'
formData={
"redir":"http://movie.douban.com/mine?status=collect",
"form_email":input('请输入用户名/邮箱(格式为a123155@outlook.com):'),
"form_password":input('请输入密码(格式为qazwsx123):'),
"login":u'登录'}
r = requests.post(loginUrl,data=formData,headers=headers)
(2)如果有验证码,则从页面中解析出验证码的ID和image,并保存image到本地。为了方便,image直接从代码中显示出来。
page = r.text
if r.url != 'https://movie.douban.com/mine?status=collect':
soup = BeautifulSoup(page,"html.parser")
captchaAddr = soup.find('img',id='captcha_image')['src']
reCaptchaID = r'<input type="hidden" name="captcha-id" value="(.*?)"/'
captchaID = re.findall(reCaptchaID,page)
image_file = input('请输入豆瓣登录的验证码图片保存地址,格式为 F:\\\\16.Job\\\\1.Scrapy\\\\image.jpg 注意:单斜杠\转为双斜杠\\\\ :')
urlretrieve(captchaAddr,image_file)
print('提示:保存后图片会自动打开,记住验证码并关闭图片窗口,等待至出现提示后再输入验证码。')
import cv2
import matplotlib.pyplot as plt
image = cv2.imread(image_file)
plt.imshow(image)
plt.show()
print(formData)
r = requests.post(loginUrl,data=formData,headers=headers)
print(r.text)
5.登录成功与否的提示
if r.url == 'https://movie.douban.com/mine?status=collect':
print(page)
print('----------------------------------------登录成功----------------------------------------')
else:
print('----------------------------------------登陆失败----------------------------------------')