1. 程式人生 > >豆瓣爬蟲:模擬登入(可直接在cmd執行)

豆瓣爬蟲:模擬登入(可直接在cmd執行)

按[F12]開啟網頁原始碼 - 按[F8]尋找redir - 可將redir的value值設為你想跳轉的頁面。

手動登入後,跳轉到賬戶介面,如下:

按[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('----------------------------------------登陸失敗----------------------------------------')