天天看點

Python爬蟲(3)豆瓣登入

前面(1)(2)的内容已經足夠爬蟲如鍊家網之類的不需要登入可以直接擷取資料的網站。

而要爬取社交網站比較鮮明的特點就是需要登入,否則很多東西都無法擷取。經過測試發現,微網誌,知乎都不是很好登入,知乎有時候的驗證碼會類似12306那樣,而微網誌除了驗證碼,在傳遞參數的時候會對使用者名進行base64加密。這裡講簡單的豆瓣的登入以及簡單的爬取。

對于Chrome核心的浏覽器來說,可以右鍵,審查元素,選擇network,登入一下自己的賬号。

Python爬蟲(3)豆瓣登入

選中login會有各種post還是get,url,連接配接頭各種資訊。

往下拉找到formdat,像微網誌就把formdata給加密了。

Python爬蟲(3)豆瓣登入

form data裡有我們登入所需要的所有資訊,其中captcha-solution就是登入驗證碼,有時候有 有時候沒有是以在請求的時候,需要判斷有沒有。

import requests
import re
from bs4 import BeautifulSoup as bs
import sys

reload(sys)
sys.setdefaultencoding(\'utf-8\')

s = requests.Session()
url_login = \'http://accounts.douban.com/login\'
url_contacts = \'https://www.douban.com/contacts/list\'

formdata = {
    \'source\':\'index_nav\',
    \'redir\': \'https://www.douban.com\',
    \'form_email\': \'22222\',
    \'form_password\': \'111111\',
    \'login\': u\'登入\'
}
headers = {\'user-agent\': \'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36\'}

r = s.post(url_login, data=formdata, headers=headers)
content = r.text

soup = bs(content, \'lxml\')
captcha = soup.find(\'img\', id=\'captcha_image\')

if captcha:
    captcha_url = captcha[\'src\']
    re_captcha_id = r\'<input type-"hidden" name="captcha-id" value="(.*?)"/\'
    captcha_id = re.findall(re_captcha_id, content)
    print captcha_id
    print captcha_url
    captcha_text = raw_input(\'Please input 驗證碼啊\')
    formdata[\'captcha-solution\'] = captcha_text
    formdata[\'captcha-id\'] = captcha_id
    r = s.post(url_login, data=formdata, headers=headers)
      

  這樣就成功登入啦。

其實還有一種簡單的辦法,就是在登入的時候 選擇記住我,然後在Request Headers裡複制下來cookie,cookie可以用很久,是以還是足夠自用的。

Python爬蟲(3)豆瓣登入
import requests
import os

headers = {\'User-Agent\':\'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36\'}
cookies = {\'cookie\':1\'}
url = \'http://www.douban.com\'
r = requests.get(url, cookies=cookies,headers=headers)
r.encoding = \'utf-8\'
print r.text
with open(\'douban.txt\',\'wb+\',encoding = \'utf\') as f:
    f.write(r.content)