豆瓣爬虫:模拟登录(可直接在cmd执行)

【本代码可直接顺序复制粘贴,并用cmd运行。注意:https不要写成http】


先查看一下登录所需的信息。登录页面https://accounts.douban.com/login

按[F12]打开网页源代码 - 按[F8]寻找redir - 可将redir的value值设为你想跳转的页面。

我设为http://movie.douban.com/mine?status=collect,跳转到我的账户信息(方便检查登录是否成功)

豆瓣爬虫:模拟登录(可直接在cmd执行)

手动登录后,跳转到账户界面,如下:

豆瓣爬虫:模拟登录(可直接在cmd执行)

按[F12],打开如下界面:

(1)查看[Network] - [login] - [From Data]里面的信息,这就是我们要从代码中提交的信息。

(2)其中[User-Agent]信息为headers中的信息。

豆瓣爬虫:模拟登录(可直接在cmd执行)


代码:

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.两种登录模式:需要验证码和不需要验证码

豆瓣爬虫:模拟登录(可直接在cmd执行)豆瓣爬虫:模拟登录(可直接在cmd执行)

(1)不需要验证码,输入用户名和密码后,将会自动跳转到个人账户界面 

loginUrl = 'https://accounts.douban.com/login'
formData={
     "redir":"http://movie.douban.com/mine?status=collect",
     "form_email":input('请输入用户名/邮箱(格式为[email protected]):'),
     "form_password":input('请输入密码(格式为qazwsx123):'),
     "login":u'登录'}

r = requests.post(loginUrl,data=formData,headers=headers)

(2)如果有验证码,则从页面中解析出验证码的ID和image,并保存image到本地。为了方便,image直接从代码中显示出来。

豆瓣爬虫:模拟登录(可直接在cmd执行)

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('----------------------------------------登陆失败----------------------------------------')