【本代碼可直接順序複製粘貼,並用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('請輸入用戶名/郵箱(格式爲[email protected]):'),
"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('----------------------------------------登陸失敗----------------------------------------')