Python爬蟲之模擬登入豆瓣獲取最近看過的電影
阿新 • • 發佈:2019-01-06
哈哈哈,模擬登入成功啦啦啦啦啦~~~~~
重要的事本來要說三遍,不過還是算了==
先上效果圖:
眾所周知,很多網站都設定了登入之後才能獲取檢視頁面的權利,因此模擬登入成了爬取資訊的第一步,這一步成功了,嘿嘿,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':”問題解決!