1. 程式人生 > >Python爬蟲之模擬登入豆瓣獲取最近看過的電影

Python爬蟲之模擬登入豆瓣獲取最近看過的電影

哈哈哈,模擬登入成功啦啦啦啦啦~~~~~

重要的事本來要說三遍,不過還是算了==

先上效果圖:


眾所周知,很多網站都設定了登入之後才能獲取檢視頁面的權利,因此模擬登入成了爬取資訊的第一步,這一步成功了,嘿嘿,just do it!

好,廢話不多說,直接說重點:

首先,你應該要瞭解網站登入的流程以及你需要post的資訊,以豆瓣為例:

source:movie
redir:https://movie.douban.com/mine?status=collect
form_email:username
form_password:password
captcha-solution:dress
captcha-id:6rP40CbJzNgdJuqOgM3Y6wNs:en
login:登入

這就是你需要提交的資訊了,包括使用者名稱和密碼,以及驗證碼和驗證碼的ID,看到這可能有人會想我怎麼知道驗證碼的ID,各位放心,在頁面載入時就已經到客戶端這邊來了,也就是說你可以直接從瀏覽器中看到,是不是很炫酷!

第二步,需要了解一些requests這個庫了,因為requests直接省去了urllib和urllib2的很多很多很多麻煩,省去了很多冗餘的程式碼,正如官網所言,Requests:HTTP for Human,這是給人用的==

如果你之前有了解過RE和bs4,好了,直接coding吧!

不然的話最好去了解一下bs,也省了不少的麻煩,幫助文件地址:BeautifulSoup

Talking is cheap,show me the code. Now is ShowTime!

# -*- encoding:utf-8 -*-
##############################
__author__ = "Andrewseu"
__date__ = "2015/8/3"
###############################

import requests
from bs4 import BeautifulSoup
import urllib
import re

loginUrl = 'http://accounts.douban.com/login'
formData={
    "redir":"http://movie.douban.com/mine?status=collect",
    "form_email":username,
    "form_password":password,
    "login":u'登入'
}
headers = {"User-Agent":'Mozilla/5.0 (Windows NT 6.1)\
 AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.134 Safari/537.36'}
r = requests.post(loginUrl,data=formData,headers=headers)
page = r.text
#print r.url

'''獲取驗證碼圖片'''
#利用bs4獲取captcha地址
soup = BeautifulSoup(page,"html.parser")
captchaAddr = soup.find('img',id='captcha_image')['src']
#利用正則表示式獲取captcha的ID
reCaptchaID = r'<input type="hidden" name="captcha-id" value="(.*?)"/'
captchaID = re.findall(reCaptchaID,page)
#print captchaID
#儲存到本地
urllib.urlretrieve(captchaAddr,"captcha.jpg")
captcha = raw_input('please input the captcha:')

formData['captcha-solution'] = captcha
formData['captcha-id'] = captchaID

r = requests.post(loginUrl,data=formData,headers=headers)
page = r.text
if r.url=='http://movie.douban.com/mine?status=collect':
    print 'Login successfully!!!'
    print '我看過的電影','-'*60
    #獲取看過的電影
    soup = BeautifulSoup(page,"html.parser")
    result = soup.findAll('li',attrs={"class":"title"})
    #print result
    for item in result:
        print item.find('a').get_text()
else:
    print "failed!"



有任何不懂的地方,歡迎和我交流!

更新:測試發現,有些時候是不需要輸入驗證碼的,因此如果有讀者發現在獲取驗證碼時失敗,可以在42行加一個判斷“if r.url!='http://movie.douban.com/mine?status=collect':”問題解決!